ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTkzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9BVVRIT1JTCkBAIC0wLDAgKzEsNCBAQAorc3R1bm5lbCBhdXRob3JzCisKK01pY2hhbCBUcm9qbmFyYSAgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKwpkaWZmIC0tZ2l0IGEvQlVHUyBiL0JVR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4N2QxZgotLS0gL2Rldi9udWxsCisrKyBiL0JVR1MKQEAgLTAsMCArMSw1IEBACitzdHVubmVsIGtub3duIGJ1Z3MKKworCistIFNoYXJlZCBsaWJyYXJ5IGZvciB0cmFuc3BhcmVudCBwcm94eSBkb2VzIG5vdCBzdXBwb3J0IElQdjYuCisKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjZjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsMzMgQEAKK3N0dW5uZWwgbGljZW5zZSAoc2VlIENPUFlSSUdIVC5HUEwgZm9yIGRldGFpbGVkIEdQTCBjb25kaXRpb25zKQorCitDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEKKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisKK0xpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKK2EgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisKK0luIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsIGdpdmVzIHlvdQorcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yIGxpYnJhcmllcyB0aGF0CithcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2UKK29mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoCit1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUKK3Rlcm1zIG9mIHRoZSBHTlUgR1BMIGZvciBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorCitOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8KK2dyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpciBjaG9pY2UKK3doZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uIHRvIHJlbGVhc2UKK2EgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbiBhbHNvIG1ha2VzIGl0Citwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisKZGlmZiAtLWdpdCBhL0NPUFlSSUdIVC5HUEwgYi9DT1BZUklHSFQuR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZUklHSFQuR1BMCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwlBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvQ1JFRElUUyBiL0NSRURJVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhZDY2YQotLS0gL2Rldi9udWxsCisrKyBiL0NSRURJVFMKQEAgLTAsMCArMSw0MCBAQAorc3R1bm5lbCBjb2RlIGNvbnRyaWJ1dGlvbnMKKworCitUaGUgY29kZSBjb250cmlidXRpb25zIGFyZSBsaWNlbnNlZCBhcyBwdWJsaWMgZG9tYWluIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLgorCitTZXZlcmFsIFdpbjMyIGFuZCBXQ0UgaW1wcm92ZW1lbnRzIGFuZCBidWdmaXhlczoKKyogUGllcnJlIERlbGFhZ2UgPGRlbGFhZ2UucGllcnJlQGZyZWUuZnI+CisKK3N5c3RlbWQgc29ja2V0IGFjdGl2YXRpb24gaW4gdmVyc2lvbiA1LjA1OgorQ29weXJpZ2h0IChjKSAyMDE0IE1hcmsgVGhldW5pc3NlbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKK2NvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCitTT0ZUV0FSRS4KKworU2V2ZXJhbCBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIG1vc3RseSBpbiB2ZXJzaW9ucyAzLnh4OgorKiBCcmlhbiBIYXRjaCA8YnJpQHN0dW5uZWwub3JnPgorCitJbml0aWFsIFBUWSBzdXBwb3J0IGluIHZlcnNpb24gMy4wNToKKyogRGlyayBPLiBTaWVibmljaCA8ZG9rQHZvc3NuZXQuZGU+CisKK0luaXRpYWwgU1NMIHN1cHBvcnQgaW4gdmVyc2lvbnMgMS54OgorKiBBZGFtIEhlcm5payA8YWRhc0BpbmZvY2VudHJ1bS5jb20+CisqIFBhd2VsIEtyYXdjenlrIDxrcmF2aWV0ekBjZXRpLmNvbS5wbD4KKworYW5kIG1hbnkgb3RoZXJzLi4uCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxZmRiZQotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDE2NDMgQEAKK3N0dW5uZWwgY2hhbmdlIGxvZworCitWZXJzaW9uIDUuMjIsIDIwMTUuMDcuMzAsIHVyZ2VuY3k6IEhJR0gKKyogTmV3IGZlYXR1cmVzCisgIC0gIk9DU1BhaWEgPSB5ZXMiIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGVtcGxhdGVzLgorICAtIEltcHJvdmVkIGRvdWJsZSBmcmVlIGRldGVjdGlvbi4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBhIG51bWJlciBvZiBPQ1NQIGJ1Z3MuICBUaGUgbW9zdCBzZXZlcmUgb2YgdGhvc2UKKyAgICBidWdzIGNhdXNlZCBzdHVubmVsIHRvIHRyZWF0IE9DU1AgcmVzcG9uc2VzIHRoYXQgZmFpbGVkCisgICAgT0NTUF9iYXNpY192ZXJpZnkoKSBjaGVja3MgYXMgaWYgdGhleSB3ZXJlIHN1Y2Nlc3NmdWwuCisgIC0gRml4ZWQgdGhlIHBhc3NpdmUgSVB2NiByZXNvbHZlciAoYnJva2VuIGluIHN0dW5uZWwgNS4yMSkuCisKK1ZlcnNpb24gNS4yMSwgMjAxNS4wNy4yNywgdXJnZW5jeTogTUVESVVNCisqIE5ldyBmZWF0dXJlcworICAtIFNpZ25hbCBuYW1lcyBhcmUgZGlzcGxheWVkIGluc3RlYWQgb2YgbnVtYmVycy4KKyAgLSBGaXJzdCByZXNvbHZlIElQdjQgYWRkcmVzc2VzIG9uIHBhc3NpdmUgcmVzb2x2ZXIgcmVxdWVzdHMuCisgICAgVGhpcyBzcGVlZHMgdXAgc3R1bm5lbCBzdGFydHVwIG9uIFdpbjMyIHdpdGggYSBzbG93L2RlZnVuY3QKKyAgICBETlMgc2VydmljZS4KKyAgLSBUaGUgIm1ha2UgY2hlY2siIHRhcmdldCB3YXMgbW9kaWZpZWQgdG8gb25seSBidWlsZCBXaW4zMgorICAgIGV4ZWN1dGFibGVzIHdoZW4gc3R1bm5lbCBpcyBidWlsdCBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgKHRoeAorICAgIHRvIFBldGVyIFBlbnRjaGV2KS4KKyAgLSBNb3JlIGVsYWJvcmF0ZSBkZXNjcmlwdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgd2FybmluZyBhYm91dAorICAgIHVzaW5nICJ2ZXJpZnkgPSAyIiB3aXRob3V0ICJjaGVja0hvc3QiIG9yICJjaGVja0lQIi4KKyAgLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2FzIHBlcmZvcm1lZCBvbiB0aGUgZGVidWcgY29kZS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCB0aGUgRk9SSyBhbmQgVUNPTlRFWFQgdGhyZWFkaW5nIHN1cHBvcnQuCisgIC0gRml4ZWQgImZhaWxvdmVyPXByaW8iIChicm9rZW4gc2luY2Ugc3R1bm5lbCA1LjE1KS4KKyAgLSBBZGRlZCBhIHJldHJ5IHdoZW4gc2xlZXAoMykgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsCisgICAgaW4gdGhlIGNyb24gdGhyZWFkIHNjaGVkdWxlci4KKworVmVyc2lvbiA1LjIwLCAyMDE1LjA3LjA5LCB1cmdlbmN5OiBISUdIIAorKiBTZWN1cml0eSBidWdmaXhlcworICAtIE9wZW5TU0wgRExMcyB1cGRhdGVkIHRvIHZlcnNpb24gMS4wLjJkLgorICAgIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL25ld3Mvc2VjYWR2XzIwMTUwNzA5LnR4dAorKiBOZXcgZmVhdHVyZXMKKyAgLSBwb2xsKDIpIHJlLWVuYWJsZWQgb24gTWFjT1MgWCAxMC41IGFuZCBsYXRlci4KKyAgLSBYY29kZSBTREsgaXMgYXV0b21hdGljYWxseSB1c2VkIG9uIE1hY09TIFggaWYgbm8gb3RoZXIKKyAgICBsb2NhbGx5IGluc3RhbGxlZCBPcGVuU1NMIGRpcmVjdG9yeSBpcyBmb3VuZC4KKyAgLSBUaGUgU1NMIGxpYnJhcnkgZGV0ZWN0aW9uIGFsZ29yaXRobSB3YXMgbWFkZSBhIGJpdCBzbWFydGVyLgorICAtIFdhcm5pbmdzIGFib3V0IGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uIHdlcmUgbW9kaWZpZWQgdG8KKyAgICBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBzZXJ2aWNlIHNlY3Rpb24uCisgIC0gQSB3YXJuaW5nIHdhcyBhZGRlZCB0byBzdHVubmVsLmluaXQgaWYgbm8gcGlkIGZpbGUgd2FzCisgICAgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKHRoeCB0byBQZXRlciBQZW50Y2hldikuCisgIC0gT3B0aW9uYWwgZGVidWdnaW5nIHN5bWJvbHMgYXJlIGluY2x1ZGVkIGluIHRoZSBXaW4zMiBpbnN0YWxsZXIuCisgIC0gRG9jdW1lbnRhdGlvbiB1cGRhdGVzIChjbG9zZXMgRGViaWFuIGJ1ZyAjNzgxNjY5KS4KKyogQnVnZml4ZXMKKyAgLSBTaWduYWwgcGlwZSByZWluaXRpYWxpemF0aW9uIGFkZGVkIHRvIHByZXZlbnQgdHVybmluZyB0aGUKKyAgICBtYWluIGFjY2VwdGluZyB0aHJlYWQgaW50byBhIGJ1c3kgd2FpdCBsb29wIHdoZW4gYW4gZXh0ZXJuYWwKKyAgICBjb25kaXRpb24gYnJlYWtzIHRoZSBzaWduYWwgcGlwZS4gIFRoaXMgYnVnIHdhcyBmb3VuZCB0bworICAgIHN1cmZhY2Ugb24gV2luMzIsIGJ1dCBvdGhlciBwbGF0Zm9ybXMgbWF5IGFsc28gYmUgYWZmZWN0ZWQuCisgIC0gRml4ZWQgcmVtb3ZpbmcgdGhlIGRpc2FibGVkIHRhc2tiYXIgaWNvbi4KKyAgLSBHZW5lcmF0ZWQgdGVtcG9yYXJ5IERIIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KKyAgICByZWxvYWQgaW5zdGVhZCBvZiB0aGUgc3RhdGljIGRlZmF1bHRzLgorICAtIExTQiBjb21wYXRpYmlsaXR5IGZpeGVzIGFkZGVkIHRvIHRoZSBzdHVubmVsLmluaXQgc2NyaXB0ICh0aHgKKyAgICB0byBQZXRlciBQZW50Y2hldikuCisgIC0gRml4ZWQgdGhlIG1hbnVhbCBwYWdlIGhlYWRlcnMgKHRoeCB0byBHbGV5ZHNvbiBTb2FyZXMpLgorCitWZXJzaW9uIDUuMTksIDIwMTUuMDYuMTYsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMmMuCisgIC0gQWRkZWQgYSBydW50aW1lIGNoZWNrIHdoZXRoZXIgQ09NUF96bGliKCkgbWV0aG9kIGlzIGltcGxlbWVudGVkCisgICAgaW4gb3JkZXIgdG8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIERlYmlhbiBPcGVuU1NMIGJ1aWxkLgorKiBCdWdmaXhlcworICAtIEltcHJvdmVkIHNvY2tldCBlcnJvciBoYW5kbGluZy4KKyAgLSBDcm9uIHRocmVhZCBwcmlvcml0eSBvbiBXaW4zMiBwbGF0Zm9ybSBjaGFuZ2VkIHRvCisgICAgVEhSRUFEX1BSSU9SSVRZX0xPV0VTVCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5LgorICAtIE1ha2VmaWxlIGJ1Z2ZpeGVzIGZvciBzdHVubmVsIDUuMTggcmVncmVzc2lvbnMuCisgIC0gRml4ZWQgc29tZSB0eXBvcyBpbiBkb2NzIGFuZCBzY3JpcHRzICh0aHggdG8gUGV0ZXIgUGVudGNoZXYpLgorICAtIEZpeGVkIGEgbG9nIGxldmVsIGNoZWNrIGNvbmRpdGlvbiAodGh4IHRvIFBldGVyIFBlbnRjaGV2KS4KKworVmVyc2lvbiA1LjE4LCAyMDE1LjA2LjEyLCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIE9wZW5TU0wgRExMcyB1cGRhdGVkIHRvIHZlcnNpb24gMS4wLjJiLgorICAgIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL25ld3Mvc2VjYWR2XzIwMTUwNjExLnR4dAorICAtIEFkZGVkICJpbmNsdWRlIiBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIHRvIGluY2x1ZGUgYWxsCisgICAgY29uZmlndXJhdGlvbiBmaWxlIHBhcnRzIGxvY2F0ZWQgaW4gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorICAtIExvZyBmaWxlIGlzIHJlb3BlbmVkIGV2ZXJ5IDI0IGhvdXJzLiAgV2l0aCAibG9nID0gb3ZlcndyaXRlIgorICAgIHRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IGZpbGxpbmcgdXAgZGlzayBzcGFjZS4KKyAgLSBUZW1wb3JhcnkgREggcGFyYW1ldGVycyBhcmUgcmVmcmVzaGVkIGV2ZXJ5IDI0IGhvdXJzLCB1bmxlc3MKKyAgICBzdGF0aWMgREggcGFyYW1ldGVycyB3ZXJlIHByb3ZpZGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAtIFVuaXF1ZSBpbml0aWFsIERIIHBhcmFtZXRlcnMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggZWFjaCByZWxlYXNlLgorICAtIFdhcm5pbmdzIGFyZSBsb2dnZWQgb24gcG90ZW50aWFsbHkgaW5zZWN1cmUgYXV0aGVudGljYXRpb24uCisgIC0gSW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBjdXJyZW50IE9wZW5TU0wgMS4xLjAtZGV2IHRyZWU6CisgICAgcmVtb3ZlZCBSTEUgY29tcHJlc3Npb24gc3VwcG9ydCwgZXRjLgorICAtIFVwZGF0ZWQgc3R1bm5lbC5zcGVjICh0aHggdG8gQmlsbCBRdWF5bGUpLgorKiBCdWdmaXhlcworICAtIEZpeGVkIGhhbmRsaW5nIG9mIGR5bmFtaWMgY29ubmVjdCB0YXJnZXRzLgorICAtIEZpeGVkIGhhbmRsaW5nIG9mIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGluIHRoZSBDb250ZW50LUxlbmd0aAorICAgIGhlYWRlciBvZiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4KKyAgLSBGaXhlZCAtLXN5c2NvbmZkaXIgYW5kIC0tbG9jYWxzdGF0ZWRpciBoYW5kbGluZyAodGh4IHRvCisgICAgRGFnb2JlcnQgTWljaGVsc2VuKS4KKworVmVyc2lvbiA1LjE3LCAyMDE1LjA0LjI5LCB1cmdlbmN5OiBISUdIOgorKiBCdWdmaXhlcworICAtIEZpeGVkIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGNhdXNpbmcgdGhlIHNlcnZpY2UgdG8gY3Jhc2guCisgICAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gc3R1bm5lbCA1LjE1LgorCitWZXJzaW9uIDUuMTYsIDIwMTUuMDQuMTksIHVyZ2VuY3k6IE1FRElVTToKKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBjb21waWxhdGlvbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBnY2MuCisKK1ZlcnNpb24gNS4xNSwgMjAxNS4wNC4xNiwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBBZGRlZCBuZXcgc2VydmljZS1sZXZlbCBvcHRpb25zICJjaGVja0hvc3QiLCAiY2hlY2tFbWFpbCIgYW5kCisgICAgImNoZWNrSVAiIGZvciBhZGRpdGlvbmFsIGNoZWNrcyBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBzdWJqZWN0LgorICAgIFRoZXNlIG9wdGlvbnMgcmVxdWlyZSBPcGVuU1NMIHZlcnNpb24gMS4wLjIgb3IgaGlnaGVyLgorICAtIFdpbjMyIGJpbmFyeSBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggdGhlIE1vemlsbGEgcm9vdCBDQQorICAgIGJ1bmRsZS4gIFRoaXMgYnVuZGxlIGlzIGludGVuZGVkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgbmV3CisgICAgImNoZWNrSG9zdCIgb3B0aW9uIHRvIHZhbGlkYXRlIHNlcnZlciBjZXJ0cyBhY2NlcHRlZCBieSBNb3ppbGxhLgorICAtIE5ldyBjb21tYW5kbGluZSBvcHRpb25zICItcmVsb2FkIiB0byByZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICBmaWxlIGFuZCAiLXJlb3BlbiIgdG8gcmVvcGVuIHRoZSBsb2cgZmlsZSBvZiBzdHVubmVsIHJ1bm5pbmcKKyAgICBhcyBhIFdpbmRvd3Mgc2VydmljZSAodGh4IHRvIE1hcmMgTWNMYXVnaGxpbikuCisgIC0gQWRkZWQgc2Vzc2lvbiBwZXJzaXN0ZW5jZSBiYXNlZCBvbiBuZWdvdGlhdGVkIFRMUyBzZXNzaW9ucy4KKyAgICBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2FkX2JhbGFuY2luZ18lMjhjb21wdXRpbmclMjkjUGVyc2lzdGVuY2UKKyAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIFRMUworICAgIHNlc3Npb24gY2FjaGluZyB3aXRoIHNlc3Npb25kLgorICAtIE1FRElVTSBjaXBoZXJzIChjdXJyZW50bHkgU0VFRCBhbmQgUkM0KSBhcmUgcmVtb3ZlZCBmcm9tIHRoZQorICAgIGRlZmF1bHQgY2lwaGVyIGxpc3QuCisgIC0gVGhlICJyZWRpcmVjdCIgb3B0aW9uIHdhcyBpbXByb3ZlZCB0byBub3Qgb25seSByZWRpcmVjdCBzZXNzaW9ucworICAgIGVzdGFibGlzaGVkIHdpdGggYW4gdW50cnVzdGVkIGNlcnRpZmljYXRlLCBidXQgYWxzbyBzZXNzaW9ucworICAgIGVzdGFibGlzaGVkIHdpdGhvdXQgYSBjbGllbnQgY2VydGlmaWNhdGUuCisgIC0gT3BlblNTTCB2ZXJzaW9uIGNoZWNraW5nIG1vZGlmaWVkIHRvIGRpc3Rpbmd1aXNoIEZJUFMgYW5kCisgICAgbm9uLUZJUFMgYnVpbGRzLgorICAtIEltcHJvdmVkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgY3VycmVudCBPcGVuU1NMIDEuMS4wLWRldiB0cmVlLgorICAtIFJlbW92ZWQgc3VwcG9ydCBmb3IgT3BlblNTTCB2ZXJzaW9ucyBvbGRlciB0aGFuIDAuOS43LgorICAgIFRoZSBmaW5hbCB1cGRhdGUgZm9yIHRoZSBPcGVuU1NMIDAuOS42IGJyYW5jaCB3YXMgMTcgTWFyIDIwMDQuCisgIC0gInNlc3Npb25kIiBzdXBwb3J0IGltcHJvdmVkIHRvIGFsc28gd29yayBpbiBPcGVuU1NMIDAuOS43LgorICAtIFJhbmRvbWl6ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcm91bmQtcm9iaW4gY291bnRlci4KKyAgLSBOZXcgc3R1bm5lbC5jb25mIHRlbXBsYXRlcyBhcmUgcHJvdmlkZWQgZm9yIFdpbmRvd3MgYW5kIFVuaXguCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgY29tcGlsYXRpb24gYWdhaW5zdCBvbGQgdmVyc2lvbnMgb2YgT3BlblNTTC4KKyAgLSBGaXhlZCBtZW1vcnkgbGVha3MgaW4gY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLgorCitWZXJzaW9uIDUuMTQsIDIwMTUuMDMuMjUsIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gVGhlICJyZWRpcmVjdCIgb3B0aW9uIG5vdyBhbHNvIHJlZGlyZWN0cyBjbGllbnRzIG9uIFNTTCBzZXNzaW9uCisgICAgcmV1c2UuICBJbiBzdHVubmVsIHZlcnNpb25zIDUuMDAgdG8gNS4xMyByZXVzZWQgc2Vzc2lvbnMgd2VyZQorICAgIGluc3RlYWQgYWx3YXlzIGNvbm5lY3RlZCBob3N0cyBzcGVjaWZpZWQgd2l0aCB0aGUgImNvbm5lY3QiCisgICAgb3B0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHJlc3VsdC4KKyAgICBUaGlzIHZ1bG5lcmFiaWxpdHkgd2FzIHJlcG9ydGVkIGJ5IEpvaGFuIE9sb2Zzc29uLgorKiBOZXcgZmVhdHVyZXMKKyAgLSBXaW5kb3dzIHNlcnZpY2UgaXMgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgYWZ0ZXIgdXBncmFkZS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGR1cmluZyBVbml4IGRhZW1vbiBzaHV0ZG93bi4KKyAgLSBGaXhlZCBoYW5kbGluZyBtdWx0aXBsZSBjb25uZWN0L3JlZGlyZWN0IGRlc3RpbmF0aW9ucy4KKyAgLSBPcGVuU1NMIEZJUFMgYnVpbGRzIGFyZSBub3cgY29ycmVjdGx5IHJlcG9ydGVkIG9uIHN0YXJ0dXAuCisKK1ZlcnNpb24gNS4xMywgMjAxNS4wMy4yMCwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBUaGUgInNlcnZpY2UiIG9wdGlvbiB3YXMgbW9kaWZpZWQgdG8gYWxzbyBjb250cm9sIHRoZSBzeXNsb2cKKyAgICBzZXJ2aWNlIG5hbWUuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgV2luZG93cyBzZXJ2aWNlIGNyYXNoLgorCitWZXJzaW9uIDUuMTIsIDIwMTUuMDMuMTksIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMmEuCisgICAgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvbmV3cy9zZWNhZHZfMjAxNTAzMTkudHh0CisqIE5ldyBmZWF0dXJlcworICAtIE5ldyBzZXJ2aWNlLWxldmVsIG9wdGlvbiAibG9nSWQiIHRvIHNwZWNpZnkgdGhlCisgICAgY29ubmVjdGlvbiBpZGVudGlmaWVyIHR5cGUuICBDdXJyZW50bHkgc3VwcG9ydGVkIHR5cGVzOgorICAgICJzZXF1ZW50aWFsIiAoZGVmYXVsdCksICJ1bmlxdWUiLCBhbmQgInRocmVhZCIuCisgIC0gTmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uICJkZWJ1ZyIgdG8gaW5kaXZpZHVhbGx5IGNvbnRyb2wKKyAgICBsb2dnaW5nIHZlcmJvc2l0eSBvZiBkZWZpbmVkIHNlcnZpY2VzLgorKiBCdWdmaXhlcworICAtIE9DU1AgZml4ZWQgb24gV2luZG93cyBwbGF0Zm9ybSAodGh4IHRvIEFsZWMgS29za3kpLgorCitWZXJzaW9uIDUuMTEsIDIwMTUuMDMuMTEsIHVyZ2VuY3k6IExPVzoKKyogTmV3IGZlYXR1cmVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMi4KKyAgLSBSZW1vdmVkIGRlcmVmZXJlbmNlcyBvZiBpbnRlcm5hbCBPcGVuU1NMIGRhdGEgc3RydWN0dXJlcy4KKyAgLSBQU0sga2V5IGxvb2t1cCBhbGdvcml0aG0gcGVyZm9ybWFuY2UgaW1wcm92ZWQgZnJvbQorICAgIE8oTikgKGxpbmVhcikgdG8gTyhsb2cgTikgKGxvZ2FyaXRobWljKS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBwZWVyIGNlcnRpZmljYXRlIGxpc3QgaW4gdGhlIG1haW4gd2luZG93IG9uIFdpbjMyCisgICAgKHRoeCB0byBAZnllciBmb3IgcmVwb3J0aW5nIGl0KS4KKyAgLSBGaXhlZCBjb25zb2xlIGxvZ2dpbmcgaW4gdHN0dW5uZWwuZXhlLgorICAtIF90cHV0ZW52X3MoKSByZXBsYWNlZCB3aXRoIG1vcmUgcG9ydGFibGUgX3RwdXRlbnYoKSBvbiBXaW4zMi4KKworVmVyc2lvbiA1LjEwLCAyMDE1LjAxLjIyLCB1cmdlbmN5OiBMT1c6CisqIE5ldyBmZWF0dXJlcworICAtIE9DU1AgQUlBIChBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzKSBzdXBwb3J0LiAgVGhpcyBmZWF0dXJlCisgICAgY2FuIGJlIGVuYWJsZWQgd2l0aCB0aGUgbmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uICJPQ1NQYWlhIi4KKyAgLSBBZGRpdGlvbmFsIHNlY3VyaXR5IGZlYXR1cmVzIG9mIHRoZSBsaW5rZXIgYXJlIGVuYWJsZWQ6CisgICAgIi16IHJlbHJvIiwgIi16IG5vdyIsICIteiBub2V4ZWNzdGFjayIuCisqIEJ1Z2ZpeGVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMWwuCisgICAgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvbmV3cy9zZWNhZHZfMjAxNTAxMDgudHh0CisgIC0gRklQUyBjYW5pc3RlciB1cGRhdGVkIHRvIHZlcnNpb24gMi4wLjkgaW4gdGhlIFdpbjMyIGJpbmFyeQorICAgIGJ1aWxkLgorCitWZXJzaW9uIDUuMDksIDIwMTUuMDEuMDIsIHVyZ2VuY3k6IExPVzoKKyogTmV3IGZlYXR1cmVzCisgIC0gQWRkZWQgUFNLIGF1dGhlbnRpY2F0aW9uIHdpdGggdHdvIG5ldyBzZXJ2aWNlLWxldmVsCisgICAgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbnMgIlBTS3NlY3JldHMiIGFuZCAiUFNLaWRlbnRpdHkiLgorICAtIEFkZGVkIGFkZGl0aW9uYWwgc2VjdXJpdHkgY2hlY2tzIHRvIHRoZSBPcGVuU1NMIG1lbW9yeQorICAgIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgorICAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBPUEVOU1NMX05PX09DU1AgYW5kIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgT3BlblNTTCBjb25maWd1cmF0aW9uIGZsYWdzLgorICAtIEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgY3VycmVudCBPcGVuU1NMIDEuMS4wLWRldiB0cmVlLgorKiBCdWdmaXhlcworICAtIFJlbW92ZWQgZGVmZWN0aXZlIHNfcG9sbF9lcnJvcigpIGNvZGUgb2NjYXNpb25hbGx5IGNhdXNpbmcKKyAgICBjb25uZWN0aW9ucyB0byBiZSBwcmVtYXR1cmVseSBjbG9zZWQgKHRydW5jYXRlZCkuCisgICAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gc3R1bm5lbCA0LjM0LgorICAtIEZpeGVkIC4vY29uZmlndXJlIHN5c3RlbWQgZGV0ZWN0aW9uICh0aHggdG8gS2lwIFdhbHJhdmVuKS4KKyAgLSBGaXhlZCAuL2NvbmZpZ3VyZSBzeXNyb290IGRldGVjdGlvbiAodGh4IHRvIEtpcCBXYWxyYXZlbikuCisgIC0gRml4ZWQgY29tcGlsYXRpb24gYWdhaW5zdCBvbGQgdmVyc2lvbnMgb2YgT3BlblNTTC4KKyAgLSBSZW1vdmVkIG91dGRhdGVkIEZyZW5jaCBtYW51YWwgcGFnZS4KKworVmVyc2lvbiA1LjA4LCAyMDE0LjEyLjA5LCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIEFkZGVkIFNPQ0tTNC9TT0NLUzRhIHByb3RvY29sIHN1cHBvcnQuCisgIC0gQWRkZWQgU09DS1M1IHByb3RvY29sIHN1cHBvcnQuCisgIC0gQWRkZWQgU09DS1MgUkVTT0xWRSBbRjBdIFRPUiBleHRlbnNpb24gc3VwcG9ydC4KKyAgLSBVcGRhdGVkIGF1dG9tYWtlIHRvIHZlcnNpb24gMS4xNC4xLgorICAtIE9wZW5TU0wgZGlyZWN0b3J5IHNlYXJjaGluZyBpcyBub3cgcmVsYXRpdmUgdG8gdGhlIHN5c3Jvb3QuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgaW1wcm9wZXIgaGFuZ3VwIGNvbmRpdGlvbiBoYW5kbGluZy4KKyAgLSBGaXhlZCBtaXNzaW5nIC1waWMgbGlua2VyIG9wdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yCisgICAgQW5kcm9pZCA1LjAgYW5kIGltcHJvdmVzIHNlY3VyaXR5LgorCitWZXJzaW9uIDUuMDcsIDIwMTQuMTEuMDEsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gU2V2ZXJhbCBTTVRQIHNlcnZlciBwcm90b2NvbCBuZWdvdGlhdGlvbiBpbXByb3ZlbWVudHMuCisgIC0gQWRkZWQgVVRGLTggYnl0ZSBvcmRlciBtYXJrcyB0byBzdHVubmVsLmNvbmYgdGVtcGxhdGVzLgorICAtIERIIHBhcmFtZXRlcnMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgIm1ha2UgY2VydCIuCisgICAgVGhlIGhhcmRjb2RlZCBESCBwYXJhbWV0ZXJzIGFyZSBzdWZmaWNpZW50bHkgc2VjdXJlLAorICAgIGFuZCBtb2Rlcm4gVExTIGltcGxlbWVudGF0aW9ucyB3aWxsIHVzZSBFQ0RIIGFueXdheS4KKyAgLSBVcGRhdGVkIG1hbnVhbCBmb3IgdGhlICJvcHRpb25zIiBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uLgorICAtIEFkZGVkIHN1cHBvcnQgZm9yIHN5c3RlbWQgMjA5IG9yIGxhdGVyLgorICAtIE5ldyAtLWRpc2FibGUtc3lzdGVtZCAuL2NvbmZpZ3VyZSBvcHRpb24uCisgIC0gc2V0dWlkL3NldGdpZCBjb21tZW50ZWQgb3V0IGluIHN0dW5uZWwuY29uZi1zYW1wbGUuCisqIEJ1Z2ZpeGVzCisgIC0gQWRkZWQgc3VwcG9ydCBmb3IgVVRGLTggYnl0ZSBvcmRlciBtYXJrIGluIHN0dW5uZWwuY29uZi4KKyAgLSBDb21waWxhdGlvbiBmaXggZm9yIE9wZW5TU0wgd2l0aCBkaXNhYmxlZCBTU0x2MiBvciBTU0x2My4KKyAgLSBOb24tYmxvY2tpbmcgbW9kZSBzZXQgb24gaW5ldGQgYW5kIHN5c3RlbWQgZGVzY3JpcHRvcnMuCisgIC0gc2hmb2xkZXIuaCByZXBsYWNlZCB3aXRoIHNobG9iai5oIGZvciBjb21wYXRpYmlsaXR5CisgICAgd2l0aCBtb2Rlcm4gTWljcm9zb2Z0IGNvbXBpbGVycy4KKworVmVyc2lvbiA1LjA2LCAyMDE0LjEwLjE1LCB1cmdlbmN5OiBISUdIOgorKiBTZWN1cml0eSBidWdmaXhlcworICAtIE9wZW5TU0wgRExMcyB1cGRhdGVkIHRvIHZlcnNpb24gMS4wLjFqLgorICAgIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL25ld3Mvc2VjYWR2XzIwMTQxMDE1LnR4dAorICAtIFRoZSBpbnNlY3VyZSBTU0x2MiBwcm90b2NvbCBpcyBub3cgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICBJdCBjYW4gYmUgZW5hYmxlZCB3aXRoICJvcHRpb25zID0gLU5PX1NTTHYyIi4KKyAgLSBUaGUgaW5zZWN1cmUgU1NMdjMgcHJvdG9jb2wgaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgSXQgY2FuIGJlIGVuYWJsZWQgd2l0aCAib3B0aW9ucyA9IC1OT19TU0x2MyIuCisgIC0gRGVmYXVsdCBzc2xWZXJzaW9uIGNoYW5nZWQgdG8gImFsbCIgKGFsc28gaW4gRklQUyBtb2RlKQorICAgIHRvIGF1dG9uZWdvdGlhdGUgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIFRMUyB2ZXJzaW9uLgorKiBOZXcgZmVhdHVyZXMKKyAgLSBBZGRlZCBtaXNzaW5nIFNTTCBvcHRpb25zIHRvIG1hdGNoIE9wZW5TU0wgMS4wLjFqLgorICAtIE5ldyAiLW9wdGlvbnMiIGNvbW1hbmRsaW5lIG9wdGlvbiB0byBkaXNwbGF5IHRoZSBsaXN0CisgICAgb2Ygc3VwcG9ydGVkIFNTTCBvcHRpb25zLgorKiBCdWdmaXhlcworICAtIEZpeGVkIEZPUksgdGhyZWFkaW5nIGJ1aWxkIHJlZ3Jlc3Npb24gYnVnLgorICAtIEZpeGVkIG1pc3NpbmcgcGVyaW9kaWMgV2luMzIgR1VJIGxvZyB1cGRhdGVzLgorCitWZXJzaW9uIDUuMDUsIDIwMTQuMTAuMTAsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gQXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgR1VJIHRocmVhZCBmb3IgZmFzdGVyCisgICAgbG9nZ2luZyBvbiBXaW4zMi4KKyAgLSBzeXN0ZW1kIHNvY2tldCBhY3RpdmF0aW9uICh0aHggdG8gTWFyayBUaGV1bmlzc2VuKS4KKyAgLSBUaGUgcGFyYW1ldGVyIG9mICJvcHRpb25zIiBjYW4gbm93IGJlIHByZWZpeGVkIHdpdGggIi0iCisgICAgdG8gY2xlYXIgYW4gU1NMIG9wdGlvbiwgZm9yIGV4YW1wbGU6CisgICAgIm9wdGlvbnMgPSAtTEVHQUNZX1NFUlZFUl9DT05ORUNUIi4KKyAgLSBJbXByb3ZlZCAidHJhbnNwYXJlbnQgPSBkZXN0aW5hdGlvbiIgbWFudWFsIHBhZ2UgKHRoeCB0bworICAgIFZhZGltIFBlbnppbikuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgUE9MTElOfFBPTExIVVAgY29uZGl0aW9uIGhhbmRsaW5nIGVycm9yIHJlc3VsdGluZworICAgIGluIHByZW1hdHVyZWx5IGNsb3NlZCAodHJ1bmNhdGVkKSBjb25uZWN0aW9uLgorICAtIEZpeGVkIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIHJlZ3Jlc3Npb24gYnVnIGluIHRoZQorICAgICJ0cmFuc3BhcmVudCA9IGRlc3RpbmF0aW9uIiBmdW5jdGlvbmFsaXR5ICh0aHggdG8KKyAgICBWYWRpbSBQZW56aW4pLiBUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiBzdHVubmVsIDUuMDAuCisgIC0gRml4ZWQgc3RhcnR1cCB0aHJlYWQgc3luY2hyb25pemF0aW9uIHdpdGggV2luMzIgR1VJLgorICAtIEZpeGVkIGVycm9uZW91c2x5IGNsb3NlZCBzdGRpbi9zdGRvdXQvc3RkZXJyIGlmIHNwZWNpZmllZAorICAgIGFzIHRoZSAtZmQgY29tbWFuZGxpbmUgb3B0aW9uIHBhcmFtZXRlci4KKyAgLSBBIG51bWJlciBvZiBtaW5vciBXaW4zMiBHVUkgYnVnZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KKyAgLSBNZXJnZWQgbW9zdCBvZiB0aGUgV2luZG93cyBDRSBwYXRjaGVzICh0aHggdG8gUGllcnJlIERlbGFhZ2UpLgorICAtIEZpeGVkIGluY29ycmVjdCBDcmVhdGVTZXJ2aWNlKCkgZXJyb3IgbWVzc2FnZSBvbiBXaW4zMi4KKyAgLSBJbXBsZW1lbnRlZCBhIHdvcmthcm91bmQgZm9yIGRlZmVjdGl2ZSBDeWd3aW4gZmlsZQorICAgIGRlc2NyaXB0b3IgcGFzc2luZyBicmVha2luZyB0aGUgbGlid3JhcCBzdXBwb3J0OgorICAgIGh0dHA6Ly93aWtpLm9zZGV2Lm9yZy9DeWd3aW5fSXNzdWVzI1Bhc3NpbmdfZmlsZV9kZXNjcmlwdG9ycworCitWZXJzaW9uIDUuMDQsIDIwMTQuMDkuMjEsIHVyZ2VuY3k6IExPVzoKKyogTmV3IGZlYXR1cmVzCisgIC0gU3VwcG9ydCBmb3IgbG9jYWwgbW9kZSAoImV4ZWMiIG9wdGlvbikgb24gV2luMzIuCisgIC0gU3VwcG9ydCBmb3IgVVRGLTggY29uZmlnIGZpbGUgYW5kIGxvZyBmaWxlLgorICAtIFdpbjMyIFVURi0xNiBidWlsZCAodGh4IHRvIFBpZXJyZSBEZWxhYWdlIGZvciBzdXBwb3J0KS4KKyAgLSBTdXBwb3J0IGZvciBVbmljb2RlIGZpbGUgbmFtZXMgb24gV2luMzIuCisgIC0gQSBtb3JlIGV4cGxpY2l0IHNlcnZpY2UgZGVzY3JpcHRpb24gcHJvdmlkZWQgZm9yIHRoZQorICAgIFdpbmRvd3MgU0NNICh0aHggdG8gUGllcnJlIERlbGFhZ2UpLgorICAtIFRDUC9JUCBkZXBlbmRlbmN5IGFkZGVkIGZvciBOVCBzZXJ2aWNlIGluIG9yZGVyIHRvIHByZXZlbnQKKyAgICBpbml0aWFsaXphdGlvbiBmYWlsdXJlIGF0IGJvb3QgdGltZS4KKyAgLSBGSVBTIGNhbmlzdGVyIHVwZGF0ZWQgdG8gdmVyc2lvbiAyLjAuOCBpbiB0aGUgV2luMzIgYmluYXJ5CisgICAgYnVpbGQuCisqIEJ1Z2ZpeGVzCisgIC0gbG9hZF9pY29uX2RlZmF1bHQoKSBtb2RpZmllZCB0byByZXR1cm4gY29waWVzIG9mIGRlZmF1bHQgaWNvbnMKKyAgICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZXMgdG8gcHJldmVudCB0aGUgcmVzb3VyY2VzCisgICAgZnJvbSBiZWluZyBkZXN0cm95ZWQuCisgIC0gUGFydGlhbGx5IG1lcmdlZCBXaW5kb3dzIENFIHBhdGNoZXMgKHRoeCB0byBQaWVycmUgRGVsYWFnZSkuCisgIC0gRml4ZWQgdHlwb3MgaW4gc3R1bm5lbC5pbml0LmluIGFuZCB2Yy5tYWsuCisgIC0gRml4ZWQgaW5jb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgdXBkYXRlIGluCisgICAgc3RyX3JlYWxsb2MoKS4KKyAgLSBNaXNzaW5nIFJFTU9URV9QT1JUIGVudmlyb25tZW50YWwgdmFyaWFibGUgaXMgcHJvdmlkZWQgdG8KKyAgICBwcm9jZXNzZXMgc3Bhd25lZCB3aXRoICJleGVjIiBvbiBVbml4IHBsYXRmb3Jtcy4KKyAgLSBUYXNrYmFyIGljb24gaXMgbm8gbG9uZ2VyIGRpc2FibGVkIGZvciBOVCBzZXJ2aWNlLgorICAtIEZpeGVkIHRhc2tiYXIgaWNvbiBpbml0aWFsaXphdGlvbiB3aGVuIGNvbW1hbmRsaW5lIG9wdGlvbnMgYXJlCisgICAgc3BlY2lmaWVkLgorICAtIFJlcG9ydGVkbHkgbW9yZSBjb21wYXRpYmxlIHZhbHVlcyB1c2VkIGZvciB0aGUgZHdEZXNpcmVkQWNjZXNzCisgICAgcGFyYW1ldGVyIG9mIHRoZSBDcmVhdGVGaWxlKCkgZnVuY3Rpb24gKHRoeCB0byBQaWVycmUgRGVsYWFnZSkuCisgIC0gQSBudW1iZXIgb2YgbWlub3IgV2luMzIgR1VJIGJ1Z2ZpeGVzIGFuZCBpbXByb3ZlbWVudHMuCisKK1ZlcnNpb24gNS4wMywgMjAxNC4wOC4wNywgdXJnZW5jeTogSElHSDoKKyogU2VjdXJpdHkgYnVnZml4ZXMKKyAgLSBPcGVuU1NMIERMTHMgdXBkYXRlZCB0byB2ZXJzaW9uIDEuMC4xaS4KKyAgICBTZWUgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvbmV3cy9zZWNhZHZfMjAxNDA4MDYudHh0CisqIE5ldyBmZWF0dXJlcworICAtIEZJUFMgYXV0b2NvbmZpZ3VyYXRpb24gY2xlYW51cC4KKyAgLSBGSVBTIGNhbmlzdGVyIHVwZGF0ZWQgdG8gdmVyc2lvbiAyLjAuNi4KKyAgLSBJbXByb3ZlZCBTTkkgZGlhZ25vc3RpYyBsb2dnaW5nLgorKiBCdWdmaXhlcworICAtIENvbXBpbGF0aW9uIGZpeGVzIGZvciBvbGQgdmVyc2lvbnMgb2YgT3BlblNTTC4KKyAgLSBGaXhlZCB3aGl0ZXNwYWNlIGhhbmRsaW5nIGluIHRoZSBzdHVubmVsLmluaXQgc2NyaXB0LgorCitWZXJzaW9uIDUuMDIsIDIwMTQuMDYuMDksIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMWguCisgICAgU2VlIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL25ld3Mvc2VjYWR2XzIwMTQwNjA1LnR4dAorKiBOZXcgZmVhdHVyZXMKKyAgLSBNYWpvciByZXdyaXRlIG9mIHRoZSBwcm90b2NvbC5jIGludGVyZmFjZTogaXQgaXMgbm93IHBvc3NpYmxlIHRvIGFkZAorICAgIHByb3RvY29sIG5lZ290aWF0aW9ucyBhdCBtdWx0aXBsZSBjb25uZWN0aW9uIHBoYXNlcywgcHJvdG9jb2xzIGNhbgorICAgIGluZGl2aWR1YWxseSBkZWNpZGUgd2hldGhlciB0aGUgcmVtb3RlIGNvbm5lY3Rpb24gd2lsbCBiZQorICAgIGVzdGFibGlzaGVkIGJlZm9yZSBvciBhZnRlciBTU0wvVExTIGlzIG5lZ290aWF0ZWQuCisgIC0gSGVhcCBtZW1vcnkgYmxvY2tzIGFyZSB3aXBlZCBiZWZvcmUgcmVsZWFzZS4gIFRoaXMgb25seSB3b3JrcyBmb3IKKyAgICBibG9jayBhbGxvY2F0ZWQgYnkgc3R1bm5lbCwgYW5kIG5vdCBieSBPcGVuU1NMIG9yIG90aGVyIGxpYnJhcmllcy4KKyAgLSBUaGUgc2FmZV9tZW1jbXAoKSBmdW5jdGlvbiBpbXBsZW1lbnRlZCB3aXRoIGV4ZWN1dGlvbiB0aW1lIG5vdAorICAgIGRlcGVuZGVudCBvbiB0aGUgY29tcGFyZWQgZGF0YS4KKyAgLSBVcGRhdGVkIHRoZSBzdHVubmVsLmNvbmYgYW5kIHN0dW5uZWwuaW5pdCB0ZW1wbGF0ZXMuCisgIC0gQWRkZWQgYSBjbGllbnQtbW9kZSBleGFtcGxlIHRvIHRoZSBtYW51YWwuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgImZhaWxvdmVyID0gcnIiIGJyb2tlbiBzaW5jZSB2ZXJzaW9uIDUuMDAuCisgIC0gRml4ZWQgInRhc2tiYXIgPSBubyIgYnJva2VuIHNpbmNlIHZlcnNpb24gNS4wMC4KKyAgLSBDb21waWxhdGlvbiBmaXggZm9yIG1pc3NpbmcgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcgb3B0aW9uLgorCitWZXJzaW9uIDUuMDEsIDIwMTQuMDQuMDgsIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMWcuCisgICAgVGhpcyB2ZXJzaW9uIG1pdGlnYXRlcyBUTFMgaGVhcnRiZWF0IHJlYWQgb3ZlcnJ1biAoQ1ZFLTIwMTQtMDE2MCkuCisqIE5ldyBmZWF0dXJlcworICAtIFguNTA5IGV4dGVuc2lvbnMgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgc2VsZi1zaWduZWQgc3R1bm5lbC5wZW0uCisgIC0gIkZJUFMgPSBubyIgYWxzbyBhbGxvd2VkIGluIG5vbi1GSVBTIGJ1aWxkcyBvZiBzdHVubmVsLgorICAtIFNlYXJjaCBhbGwgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUgc3ViamVjdCBuYW1lIGZvciBhIG1hdGNoaW5nCisgICAgcHVibGljIGtleSByYXRoZXIgdGhhbiBvbmx5IHRoZSBmaXJzdCBvbmUgKHRoeCB0byBMZW9uIFdpbnRlcikuCisgIC0gQ3JlYXRlIGxvZ3MgaW4gdGhlIGxvY2FsIGFwcGxpY2F0aW9uIGRhdGEgZm9sZGVyIGlmIHN0dW5uZWwgZm9sZGVyCisgICAgaXMgbm90IHdyaXRhYmxlIG9uIFdpbjMyLgorKiBCdWdmaXhlcworICAtIGNsb3NlX25vdGlmeSBub3Qgc2VudCB3aGVuIFNTTCBzdGlsbCBoYXMgc29tZSBkYXRhIGJ1ZmZlcmVkLgorICAtIFByb3RvY29sIG5lZ290aWF0aW9uIHdpdGggc2VydmVyLXNpZGUgU05JIGZpeGVkLgorICAtIEEgTWFjIE9TIFggbWlzc2luZyBzeW1ib2xzIGZpeGVkLgorICAtIFdpbjMyIGNvbmZpZ3VyYXRpb24gZmlsZSByZWxvYWQgY3Jhc2ggZml4ZWQuCisgIC0gQWRkZWQgc19wb29sX2ZyZWUoKSBvbiBleGVjK2Nvbm5lY3Qgc2VydmljZSByZXRpcmVzLgorICAtIExpbmUtYnVmZmVyaW5nIGVuZm9yY2VkIG9uIHN0ZGVyciBvdXRwdXQuCisKK3N0dW5uZWwgNS4wMCBkaXNhYmxlcyBzb21lIGZlYXR1cmVzIHByZXZpb3VzbHkgZW5hYmxlZCBieSBkZWZhdWx0LgorVXNlcnMgc2hvdWxkIHJldmlldyB3aGV0aGVyIHRoZSBuZXcgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGVpcgorcGFydGljdWxhciBkZXBsb3ltZW50cy4gIFBhY2thZ2VzIG1haW50YWluZXJzIG1heSBjb25zaWRlciBwcmVwZW5kaW5nCit0aGUgb2xkIGRlZmF1bHRzIGZvciAiZmlwcyIgKGlmIHN1cHBvcnRlZCBieSB0aGVpciBPcGVuU1NMIGxpYnJhcnkpLAorInBpZCIgYW5kICJsaWJ3cmFwIiB0byBzdHVubmVsLmNvbmYgZHVyaW5nIGF1dG9tYXRlZCB1cGRhdGVzLgorCitWZXJzaW9uIDUuMDAsIDIwMTQuMDMuMDYsIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gQWRkZWQgUFJORyBzdGF0ZSB1cGRhdGUgaW4gZm9yayB0aHJlYWRpbmcgKENWRS0yMDE0LTAwMTYpLgorKiBOZXcgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBkZWZhdWx0cworICAtIERlZmF1bHQgImZpcHMiIG9wdGlvbiB2YWx1ZSBpcyBub3cgIm5vIiwgYXMgRklQUyBtb2RlIGlzIG9ubHkKKyAgICBoZWxwZnVsIGZvciBjb21wbGlhbmNlLCBhbmQgbmV2ZXIgZm9yIGFjdHVhbCBzZWN1cml0eS4KKyAgLSBEZWZhdWx0ICJwaWQiIGlzIG5vdyAiIiwgaS5lLiBub3QgdG8gY3JlYXRlIGEgcGlkIGZpbGUgYXQgc3RhcnR1cC4KKyogTmV3IHNlcnZpY2UtbGV2ZWwgY29uZmlndXJhdGlvbiBmaWxlIGRlZmF1bHRzCisgIC0gRGVmYXVsdCAiY2lwaGVycyIgdXBkYXRlZCB0byAiSElHSDpNRURJVU06KzNERVM6K0RIOiFhTlVMTDohU1NMdjIiCisgICAgZHVlIHRvIEFsRkJQUFMgYXR0YWNrIGFuZCBiYWQgcGVyZm9ybWFuY2Ugb2YgREggY2lwaGVyc3VpdGVzLgorICAtIERlZmF1bHQgImxpYndyYXAiIHNldHRpbmcgaXMgbm93ICJubyIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyogTmV3IGZlYXR1cmVzCisgIC0gT3BlblNTTCBETExzIHVwZGF0ZWQgdG8gdmVyc2lvbiAxLjAuMWYuCisgIC0gemxpYiBETEwgdXBkYXRlZCB0byB2ZXJzaW9uIDEuMi44LgorICAtIGF1dG9jb25mIHNjcmlwdHMgdXBncmFkZWQgdG8gdmVyc2lvbiAyLjY5LgorICAtIFRMUyAxLjEgYW5kIFRMUyAxLjIgYXJlIG5vdyBhbGxvd2VkIGluIHRoZSBGSVBTIG1vZGUuCisgIC0gTmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uICJyZWRpcmVjdCIgdG8gcmVkaXJlY3QgU1NMIGNsaWVudAorICAgIGNvbm5lY3Rpb25zIG9uIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmVzIGluc3RlYWQgb2YgcmVqZWN0aW5nIHRoZW0uCisgIC0gTmV3IGdsb2JhbCAiZW5naW5lRGVmYXVsdCIgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiB0byBjb250cm9sCisgICAgd2hpY2ggT3BlblNTTCB0YXNrcyBhcmUgZGVsZWdhdGVkIHRvIHRoZSBjdXJyZW50IGVuZ2luZS4KKyAgICBBdmFpbGFibGUgdGFza3M6IEFMTCwgUlNBLCBEU0EsIEVDREgsIEVDRFNBLCBESCwgUkFORCwgQ0lQSEVSUywKKyAgICBESUdFU1RTLCBQS0VZLCBQS0VZX0NSWVBUTywgUEtFWV9BU04xLgorICAtIE5ldyBzZXJ2aWNlLWxldmVsIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gImVuZ2luZUlkIiB0byBzZWxlY3QKKyAgICB0aGUgZW5naW5lIGJ5IGlkZW50aWZpZXIsIGUuZy4gImVuZ2luZUlkID0gY2FwaSIuCisgIC0gTmV3IGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uICJsb2ciIHRvIGNvbnRyb2wgd2hldGhlciB0bworICAgIGFwcGVuZCAodGhlIGRlZmF1bHQpLCBvciB0byBvdmVyd3JpdGUgbG9nIGZpbGUgd2hpbGUgKHJlKW9wZW5pbmcuCisgIC0gRGlmZmVyZW50IHRhc2tiYXIgaWNvbiBjb2xvcnMgdG8gaW5kaWNhdGUgdGhlIHNlcnZpY2Ugc3RhdGUuCisgIC0gTmV3IGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9ucyAiaWNvbklkbGUiLCAiaWNvbkFjdGl2ZSIsCisgICAgYW5kICJpY29uRXJyb3IiIHRvIHNlbGVjdCBzdGF0dXMgaWNvbiBvbiBHVUkgdGFza2Jhci4KKyAgLSBSZW1vdmVkIHRoZSBsaW1pdCBvZiA2MyBzdHVubmVsLmNvbmYgc2VjdGlvbnMgb24gV2luMzIgcGxhdGZvcm0uCisgIC0gSW5zdGFsbGF0aW9uIG9mIGEgc2FtcGxlIGNlcnRpZmljYXRlIHdhcyBtb3ZlZCB0byBhIHNlcGFyYXRlICJjZXJ0IgorICAgIHRhcmdldCBpbiBvcmRlciB0byBhbGxvdyB1bmF0dGVuZGVkIChlLmcuIHNjcmlwdGVkKSBpbnN0YWxsYXRpb25zLgorICAtIFJlZHVjZWQgbGVuZ3RoIG9mIHRoZSBsb2dnZWQgdGhyZWFkIGlkZW50aWZpZXIuICBJdCBpcyBzdGlsbCBiYXNlZAorICAgIG9uIHRoZSBPUyB0aHJlYWQgSUQsIGFuZCB0aHVzIG5vdCB1bmlxdWUgb3ZlciBsb25nIHBlcmlvZHMgb2YgdGltZS4KKyAgLSBJbXByb3ZlZCByZWFkYWJpbGl0eSBvZiBlcnJvciBtZXNzYWdlcyBwcmludGVkIHdoZW4gc3R1bm5lbCByZWZ1c2VzCisgICAgdG8gc3RhcnQgZHVlIHRvIGEgY3JpdGljYWwgZXJyb3IuCisqIEJ1Z2ZpeGVzCisgIC0gTERfUFJFTE9BRCBTb2xhcmlzIGNvbXBhdGliaWxpdHkgYnVnIGZpeGVkICh0aHggdG8gTm9ybSBKYWNvYnMpLgorICAtIENSWVBUT19OVU1fTE9DS1MgcmVwbGFjZWQgd2l0aCBDUllQVE9fbnVtX2xvY2tzKCkgdG8gaW1wcm92ZSBiaW5hcnkKKyAgICBjb21wYXRpYmlsaXR5IHdpdGggZGl2ZXJzZSBidWlsZHMgb2YgT3BlblNTTCAodGh4IHRvIE5vcm0gSmFjb2JzKS4KKyAgLSBDb3JyZWN0ZWQgcm91bmQtcm9iaW4gZmFpbG92ZXIgYmVoYXZpb3IgdW5kZXIgaGVhdnkgbG9hZC4KKyAgLSBOdW1lcm91cyBmaXhlcyBpbiB0aGUgZW5naW5lIHN1cHBvcnQgY29kZS4KKyAgLSBPbiBXaW4zMiBwbGF0Zm9ybSAucm5kIGZpbGUgbW92ZWQgZnJvbSBjOlwgdG8gdGhlIHN0dW5uZWwgZm9sZGVyLgorCitWZXJzaW9uIDQuNTcsIDIwMTUuMDQuMDEsIHVyZ2VuY3k6IEhJR0g6CisqIFNlY3VyaXR5IGJ1Z2ZpeGVzCisgIC0gQWRkZWQgUFJORyBzdGF0ZSB1cGRhdGUgaW4gZm9yayB0aHJlYWRpbmcgKENWRS0yMDE0LTAwMTYpLgorCitWZXJzaW9uIDQuNTYsIDIwMTMuMDMuMjIsIHVyZ2VuY3k6IEhJR0g6CisqIE5ldyBmZWF0dXJlcworICAtIFdpbjMyIGluc3RhbGxlciBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZXMgZmlyZXdhbGwgZXhjZXB0aW9ucy4KKyAgLSBXaW4zMiBpbnN0YWxsZXIgY29uZmlndXJlcyBhZG1pbmlzdHJhdGl2ZSBzaG9ydGN1dHMgdG8gaW52b2tlIFVBQy4KKyAgLSBJbXByb3ZlZCBXaW4zMiBHVUkgc2h1dGRvd24gdGltZS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBhIHJlZ3Jlc3Npb24gYnVnIGludHJvZHVjZWQgaW4gdmVyc2lvbiA0LjU1IGNhdXNpbmcgcmFuZG9tCisgICAgY3Jhc2hlcyBvbiBzZXZlcmFsIHBsYXRmb3JtcywgaW5jbHVkaW5nIFdpbmRvd3MgNy4KKyAgLSBGaXhlZCBzdGFydHVwIGNyYXNoZXMgb24gc29tZSBXaW4zMiBzeXN0ZW1zLgorICAtIEZpeGVkIGluY29ycmVjdCAic3R1bm5lbCAtZXhpdCIgcHJvY2VzcyBzeW5jaHJvbmlzYXRpb24uCisgIC0gRml4ZWQgRklQUyBkZXRlY3Rpb24gd2l0aCBuZXcgdmVyc2lvbnMgb2YgdGhlIE9wZW5TU0wgbGlicmFyeS4KKyAgLSBGYWlsdXJlIHRvIG9wZW4gdGhlIGxvZyBmaWxlIGF0IHN0YXJ0dXAgaXMgbm8gbG9uZ2VyIGlnbm9yZWQuCisKK1ZlcnNpb24gNC41NSwgMjAxMy4wMy4wMywgdXJnZW5jeTogSElHSDoKKyogU2VjdXJpdHkgYnVnZml4ZXMKKyAgLSBCdWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBmaXhlZCBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbgorICAgIG9mIHRoZSBDT05ORUNUIHByb3RvY29sIG5lZ290aWF0aW9uLgorICAgIFNlZSBodHRwczovL3d3dy5zdHVubmVsLm9yZy9DVkUtMjAxMy0xNzYyLmh0bWwgZm9yIGRldGFpbHMuCisgIC0gT3BlblNTTCB1cGRhdGVkIHRvIHZlcnNpb24gMS4wLjFlIGluIFdpbjMyL0FuZHJvaWQgYnVpbGRzLgorKiBOZXcgZmVhdHVyZXMKKyAgLSBTTkkgd2lsZGNhcmQgbWF0Y2hpbmcgaW4gc2VydmVyIG1vZGUuCisgIC0gVGVybWluYWwgdmVyc2lvbiBvZiBzdHVubmVsICh0c3R1bm5lbC5leGUpIGJ1aWxkIGZvciBXaW4zMi4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCB3cml0ZSBoYWxmLWNsb3NlIGhhbmRsaW5nIGluIHRoZSB0cmFuc2ZlcigpIGZ1bmN0aW9uICh0aHggdG8KKyAgICBEdXN0aW4gTHVuZHF1aXN0KS4KKyAgLSBGaXhlZCBFQUdBSU4gZXJyb3IgaGFuZGxpbmcgaW4gdGhlIHRyYW5zZmVyKCkgZnVuY3Rpb24gKHRoeCB0byBKYW4gQmVlKS4KKyAgLSBSZXN0b3JlZCBkZWZhdWx0IHNpZ25hbCBoYW5kbGVycyBiZWZvcmUgZXhlY3ZwKCkgKHRoeCB0byBNaWNoYWVsIFdlaXNlcikuCisgIC0gRml4ZWQgbWVtb3J5IGxlYWtzIGluIHByb3RvY29sIG5lZ290aWF0aW9uICh0aHggdG8gQXJ0aHVyIE1lc2gpLgorICAtIEZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgZHVyaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSByZWxvYWQgKHRoeCB0bworICAgIEFydGh1ciBNZXNoKS4KKyAgLSBDbG9zZWQgU1NMIHNvY2tldHMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHRyYW5zZmVyKCkgYy0+ZmRzIHBvbGwuCisgIC0gTWlub3IgZml4IGluIGhhbmRsaW5nIGV4b3RpYyBpbmV0ZC1tb2RlIGNvbmZpZ3VyYXRpb25zLgorICAtIFdDRSBjb21waWxhdGlvbiBmaXhlcy4KKyAgLSBJUHY2IGNvbXBpbGF0aW9uIGZpeCBpbiBwcm90b2NvbC5jLgorICAtIFdpbmRvd3MgaW5zdGFsbGVyIGZpeGVzLgorCitWZXJzaW9uIDQuNTQsIDIwMTIuMTAuMDksIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IFdpbjMyIGZlYXR1cmVzCisgIC0gRklQUyBtb2R1bGUgdXBkYXRlZCB0byB2ZXJzaW9uIDIuMC4KKyAgLSBPcGVuU1NMIERMTHMgdXBkYXRlZCB0byB2ZXJzaW9uIDEuMC4xYy4KKyAgLSB6bGliIERMTCB1cGRhdGVkIHRvIHZlcnNpb24gMS4yLjcuCisgIC0gRW5naW5lIERMTHMgYWRkZWQ6IDQ3NThjY2EsIGFlcCwgYXRhbGxhLCBjYXBpLCBjaGlsLCBjc3dpZnQsIGdtcCwgZ29zdCwKKyAgICBudXJvbiwgcGFkbG9jaywgc3VyZXdhcmUsIHVic2VjLgorKiBPdGhlciBuZXcgZmVhdHVyZXMKKyAgLSAic2Vzc2lvbiIgb3B0aW9uIHJlbmFtZWQgdG8gbW9yZSByZWFkYWJsZSAic2Vzc2lvbkNhY2hlVGltZW91dCIuCisgICAgVGhlIG9sZCBuYW1lIHJlbWFpbnMgYWNjZXB0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgIC0gTmV3IHNlcnZpY2UtbGV2ZWwgInNlc3Npb25DYWNoZVNpemUiIG9wdGlvbiB0byBjb250cm9sIHNlc3Npb24gY2FjaGUgc2l6ZS4KKyAgLSBOZXcgc2VydmljZS1sZXZlbCBvcHRpb24gInJlc2V0IiB0byBjb250cm9sIHdoZXRoZXIgVENQIFJTVCBmbGFnIGlzIHVzZWQKKyAgICB0byBpbmRpY2F0ZSBlcnJvcnMuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAicmVzZXQgPSB5ZXMiLgorICAtIE5ldyBzZXJ2aWNlLWxldmVsIG9wdGlvbiAicmVuZWdvdGlhdGlvbiIgdG8gZGlzYWJsZSBTU0wgcmVuZWdvdGlhdGlvbi4KKyAgICBUaGlzIGZlYXR1cmUgaXMgYmFzZWQgb24gYSBwdWJsaWMtZG9tYWluIHBhdGNoIGJ5IEphbnVzeiBEemllbWlkb3dpY3ouCisgIC0gTmV3IEZyZWVCU0Qgc29ja2V0IG9wdGlvbnM6IElQX0ZSRUVCSU5ELCBJUF9CSU5EQU5ZLCBJUFY2X0JJTkRBTlkgKHRoeAorICAgIHRvIEphbnVzeiBEemllbWlkb3dpY3opLgorICAtIE5ldyBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSBUTFMgdjEuMS92MS4yIHdpdGggT3BlblNTTCB2ZXJzaW9uIDEuMC4xCisgICAgb3IgaGlnaGVyICh0aHggdG8gSGVucmlrIFJpb21hcikuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgIkFwcGxpY2F0aW9uIEZhaWxlZCB0byBJbml0aWFsaXplIFByb3Blcmx5ICgweGMwMTUwMDAyKSIgZXJyb3IuCisgIC0gRml4ZWQgbWlzc2luZyBTU0wgc3RhdGUgZGVidWcgbG9nIGVudHJpZXMuCisgIC0gRml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiBsaWJ3cmFwIGNvZGUgcmVzdWx0aW5nIGluIHJhbmRvbSBzdGFsbHMgKHRoeAorICAgIHRvIEFuZHJldyBTa2Fsc2tpKS4KKyAgLSBTZXNzaW9uIGNhY2hlIHB1cmdlZCBhdCBjb25maWd1cmF0aW9uIGZpbGUgcmVsb2FkIHRvIHJlZHVjZSBtZW1vcnkgbGVhay4KKyAgICBSZW1haW5pbmcgbGVhayBvZiBhIGZldyBraWxvYnl0ZXMgcGVyIHNlY3Rpb24gaXMgeWV0IHRvIGJlIGZpeGVkLgorICAtIEZpeGVkIGEgcmVncmVzc2lvbiBidWcgaW4gInRyYW5zcGFyZW50ID0gZGVzdGluYXRpb24iIGZ1bmN0aW9uYWxpdHkgKHRoeAorICAgIHRvIFN0ZWZhbiBMYXV0ZXJiYWNoKS4gVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gc3R1bm5lbCA0LjUxLgorICAtICJ0cmFuc3BhcmVudCA9IGRlc3RpbmF0aW9uIiBpcyBub3cgYSB2YWxpZCBlbmRwb2ludCBpbiBpbmV0ZCBtb2RlLgorICAtICJkZWxheSA9IHllcyIgZml4ZWQgdG8gd29yayBldmVuIGlmIHNwZWNpZmllZCAqYWZ0ZXIqICJjb25uZWN0IiBvcHRpb24uCisgIC0gTXVsdGlwbGUgImNvbm5lY3QiIHRhcmdldHMgZml4ZWQgdG8gYWxzbyB3b3JrIHdpdGggZGVsYXllZCByZXNvbHZlci4KKyAgLSBUaGUgbnVtYmVyIG9mIHJlc29sdmVyIHJldHJpZXMgb2YgRUFJX0FHQUlOIGVycm9yIGhhcyBiZWVuIGxpbWl0ZWQgdG8gMworICAgIGluIG9yZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuCisKK1ZlcnNpb24gNC41MywgMjAxMi4wMy4xOSwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBBZGRlZCBjbGllbnQtbW9kZSAic25pIiBvcHRpb24gdG8gZGlyZWN0bHkgY29udHJvbCB0aGUgdmFsdWUgb2YKKyAgICBUTFMgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoUkZDIDM1NDYpIGV4dGVuc2lvbi4KKyAgLSBBZGRlZCBzdXBwb3J0IGZvciBJUF9GUkVFQklORCBzb2NrZXQgb3B0aW9uIHdpdGggYSBwYWNoZWQgTGludXgga2VybmVsLgorICAtIEdsaWJjLXNwZWNpZmljIGR5bmFtaWMgYWxsb2NhdGlvbiB0dW5pbmcgd2FzIGFwcGxpZWQgdG8gaGVscCB1bnVzZWQgbWVtb3J5CisgICAgZGVhbGxvY2F0aW9uLgorICAtIE5vbi1ibG9ja2luZyBPQ1NQIGltcGxlbWVudGF0aW9uLgorKiBCdWdmaXhlcworICAtIENvbXBpbGF0aW9uIGZpeGVzIGZvciBvbGQgdmVyc2lvbnMgb2YgT3BlblNTTCAodGVzdGVkIGFnYWluc3QgMC45LjYpLgorICAtIFVzYWdlIG9mIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGZpeGVkIGluIGV4ZWMrY29ubmVjdCBzZXJ2aWNlcy4KKyAgLSBPY2Nhc2lvbmFsIGxvZ2dpbmcgc3Vic3lzdGVtIGNyYXNoIHdpdGggZXhlYytjb25uZWN0IHNlcnZpY2VzLgorICAtIE9wZW5CU0QgY29tcGlsYXRpb24gZml4ICh0aHggdG8gTWljaGVsZSBPcnJ1JykuCisgIC0gU2Vzc2lvbiBpZCBjb250ZXh0IGluaXRpYWxpemVkIHdpdGggc2Vzc2lvbiBuYW1lIHJhdGhlciB0aGFuIGEgY29uc3RhbnQuCisgIC0gRml4ZWQgaGFuZGxpbmcgb2YgYSByYXJlIGluZXRkIG1vZGUgdXNlIGNhc2UsIHdoZXJlIGVpdGhlciBzdGRpbiBvciBzdGRvdXQKKyAgICBpcyBhIHNvY2tldCwgYnV0IG5vdCBib3RoIG9mIHRoZW0gYXQgdGhlIHNhbWUgdGltZS4KKyAgLSBGaXhlZCBtaXNzaW5nIE9QRU5TU0xfQXBwbGluayBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL3N1cHBvcnQvZmFxLmh0bWwjUFJPRzIKKyAgLSBGaXhlZCBjcmFzaCBvbiB0ZXJtaW5hdGlvbiB3aXRoIEZPUksgdGhyZWFkaW5nIG1vZGVsLgorICAtIEZpeGVkIGRlYWQgY2FuYXJ5IGFmdGVyIGNvbmZpZ3VyYXRpb24gcmVsb2FkIHdpdGggb3BlbiBjb25uZWN0aW9ucy4KKyAgLSBGaXhlZCBtaXNzaW5nIGZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIHRvIGxvY2FsIG1vZGUgcHJvY2Vzc2VzLgorICAtIEZpeGVkIHJlcXVpcmVkIGptcF9idWYgYWxpZ25tZW50IG9uIEl0YW5pdW0gcGxhdGZvcm0uCisgIC0gUmVtb3ZlZCBjcmVhdGluZyAvZGV2L3plcm8gaW4gdGhlIGNocm9vdCBqYWlsIG9uIFNvbGFyaXMgcGxhdGZvcm0uCisgIC0gRml4ZWQgZGV0ZWN0aW9uIG9mIFdTQUVDT05OUkVGVVNFRCBXaW5zb2NrIGVycm9yLgorICAtIE1pc3NpbmcgTWljcm9zb2Z0LlZDOTAuQ1JULm1hbmlmZXN0IGFkZGVkIHRvIFdpbmRvd3MgaW5zdGFsbGVyLgorCitWZXJzaW9uIDQuNTIsIDIwMTIuMDEuMTIsIHVyZ2VuY3k6IE1FRElVTToKKyogQnVnZml4ZXMKKyAgLSBGaXhlZCB3cml0ZSBjbG9zdXJlIG5vdGlmaWNhdGlvbiBmb3Igbm9uLXNvY2tldCBmaWxlIGRlc2NyaXB0b3JzLgorICAtIFJlbW92ZWQgYSBsaW5lIGxvZ2dlZCB0byBzdGRlcnIgaW4gaW5ldGQgbW9kZS4KKyAgLSBGaXhlZCAiU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0IiBlcnJvciBpbiBpbmV0ZCBtb2RlIG9uIE1hYyBPUyBYCisgICAgcGxhdGZvcm0uCisgIC0gUmVtb3ZlZCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBmaWVsZHMgb2YgdGhlIFg1MDlfU1RPUkVfQ1RYIGRhdGEgc3RydWN0dXJlLgorCitWZXJzaW9uIDQuNTEsIDIwMTIuMDEuMDksIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gVXBkYXRlZCBXaW4zMiBiaW5hcnkgZGlzdHJpYnV0aW9uIE9wZW5TU0wgRExMcyB0byB2ZXJzaW9uIDAuOS44cy1maXBzLgorICAtIFVwZGF0ZWQgQW5kcm9pZCBiaW5hcnkgT3BlblNTTCB0byB2ZXJzaW9uIDEuMC4wZi4KKyAgLSBabGliIHN1cHBvcnQgYWRkZWQgdG8gV2luMzIgYW5kIEFuZHJvaWQgYmluYXJ5IGJ1aWxkcy4KKyAgLSBOZXcgImNvbXByZXNzaW9uID0gZGVmbGF0ZSIgZ2xvYmFsIG9wdGlvbiB0byBlbmFibGUgUkZDIDIyNDYgY29tcHJlc2lvbi4KKyAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zICJjb21wcmVzc2lvbiA9IHpsaWIiIGFuZAorICAgICJjb21wcmVzc2lvbiA9IHJsZSIgYWxzbyBlbmFibGUgdGhlIGRlZmxhdGUgKFJGQyAyMjQ2KSBjb21wcmVzc2lvbi4KKyAgLSBDb21wcmVzc2lvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICAtIFNlcGFyYXRlIGRlZmF1bHQgY2lwaGVycyBhbmQgc3NsVmVyc2lvbiBmb3IgImZpcHMgPSB5ZXMiIGFuZCAiZmlwcyA9IG5vIi4KKyAgLSBVQUMgc3VwcG9ydCBmb3IgZWRpdGluZyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCBXaW5kb3dzIEdVSS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBleGVjK2Nvbm5lY3Qgc2VjdGlvbnMuCisgIC0gQWRkZWQgYSB3b3JrYXJvdW5kIGZvciBicm9rZW4gQW5kcm9pZCBnZXRhZGRyaW5mbygpOgorICAgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzgxODI0Ni9zZWdtZW50YXRpb24tZmF1bHQtaW4tZ2V0YWRkcmluZm8KKworVmVyc2lvbiA0LjUwLCAyMDExLjEyLjAzLCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIEFkZGVkIEFuZHJvaWQgcG9ydC4KKyAgLSBVcGRhdGVkIElOU1RBTEwuRklQUy4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBpbnRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIGluZXRkIG1vZGUuCisgIC0gRml4ZWQgRklQUyBtb2RlIG9uIE1pY3Jvc29mdCBWaXN0YSwgU2VydmVyIDIwMDgsIGFuZCBXaW5kb3dzIDcuCisgICAgVGhpcyBmaXggcmVxdWlyZWQgdG8gY29tcGlsZSBPcGVuU1NMIEZJUFMtY29tcGxpYW50IERMTHMgd2l0aCBNU1ZDIDkuMCwKKyAgICBpbnN0ZWFkIG9mIE1TVkMgMTAuMC4gIG1zdmNyMTAwLmRsbCB3YXMgcmVwbGFjZWQgd2l0aCBtc3ZjcjkwLmRsbC4KKyAgICBHUEwgY29tcGF0aWJpbGl0eSBpc3N1ZXMgYXJlIGV4cGxhaW5lZCBpbiB0aGUgR1BMIEZBUToKKyAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sI1dpbmRvd3NSdW50aW1lQW5kR1BMCisgIC0gUE9QMyBzZXJ2ZXItc2lkZSBwcm90b2NvbCBuZWdvdGlhdGlvbiB1cGRhdGVkIHRvIHJlcG9ydCBTVExTCisgICAgY2FwYWJpbGl0eSAodGh4IHRvIEFudGhvbnkgTW9yZ2FuKS4KKworVmVyc2lvbiA0LjQ5LCAyMDExLjExLjI4LCB1cmdlbmN5OiBNRURJVU06CisqIEJ1Z2ZpeGVzCisgIC0gTWlzc2luZyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBSZWRpc3RyaWJ1dGFibGUgKG1zdmNyMTAwLmRsbCkgcmVxdWlyZWQKKyAgICBieSBGSVBTLWNvbXBsaWFudCBPcGVuU1NMIGxpYnJhcnkgd2FzIGFkZGVkIHRvIHRoZSBXaW5kb3dzIGluc3RhbGxlci4KKyAgLSBBIGJ1ZyB3YXMgZml4ZWQgY2F1c2luZyBjcmFzaGVzIG9uIE1hY09TIFggYW5kIHNvbWUgb3RoZXIgcGxhdGZvcm1zLgorCitWZXJzaW9uIDQuNDgsIDIwMTEuMTEuMjYsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gRklQUyBzdXBwb3J0IG9uIFdpbjMyIHBsYXRmb3JtIGFkZGVkLiAgT3BlblNTTCAwLjkuOHIgRExMcyBiYXNlZCBvbgorICAgIEZJUFMgMS4yLjMgY2FuaXN0ZXIgYXJlIGluY2x1ZGVkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHN0dW5uZWwuICBGSVBTCisgICAgbW9kZSBjYW4gYmUgZGlzYWJsZWQgd2l0aCAiZmlwcyA9IG5vIiBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uLgorKiBCdWdmaXhlcworICAtIEZpeGVkIGNhbmFyeSBpbml0aWFsaXphdGlvbiBwcm9ibGVtIG9uIFdpbjMyIHBsYXRmb3JtLgorCitWZXJzaW9uIDQuNDcsIDIwMTEuMTEuMjEsIHVyZ2VuY3k6IE1FRElVTToKKyogSW50ZXJuYWwgaW1wcm92ZW1lbnRzCisgIC0gQ1ZFLTIwMTAtMzg2NCB3b3JrYXJvdW5kIGltcHJvdmVkIHRvIGNoZWNrIHJ1bnRpbWUgdmVyc2lvbiBvZiBPcGVuU1NMCisgICAgcmF0aGVyIHRoYW4gY29tcGlsZWQgdmVyc2lvbiwgYW5kIHRvIGFsbG93IE9wZW5TU0wgMC54LnggPj0gMC45LjhwLgorICAtIEVuY29kaW5nIG9mIG1hbiBwYWdlIHNvdXJjZXMgY2hhbmdlZCB0byBVVEYtOC4KKyogQnVnZml4ZXMKKyAgLSBIYW5kbGluZyBvZiBzb2NrZXQvU1NMIGNsb3NlIGluIHRyYW5zZmVyKCkgZnVuY3Rpb24gd2FzIGZpeGVkLgorICAtIExvZ2dpbmcgd2FzIG1vZGlmaWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgc3lzdGVtIGVycm9yIGNvZGVzLgorICAtIE9wdGlvbiAic2VydmljZSIgd2FzIHJlc3RyaWN0ZWQgdG8gVW5peCwgYXMgc2luY2Ugc3R1bm5lbCA0LjQyIGl0CisgICAgd2Fzbid0IGRvaW5nIGFueXRoaW5nIHVzZWZ1bCBvbiBXaW5kb3dzIHBsYXRmb3JtLgorCitWZXJzaW9uIDQuNDYsIDIwMTEuMTEuMDQsIHVyZ2VuY3k6IExPVzoKKyogTmV3IGZlYXR1cmVzCisgIC0gQWRkZWQgVW5peCBzb2NrZXQgc3VwcG9ydCAoZS5nLiAiY29ubmVjdCA9IC92YXIvcnVuL3N0dW5uZWwvc29ja2V0IikuCisgIC0gQWRkZWQgInZlcmlmeSA9IDQiIG1vZGUgdG8gaWdub3JlIENBIGNoYWluIGFuZCBvbmx5IHZlcmlmeSBwZWVyIGNlcnRpZmljYXRlLgorICAtIFJlbW92ZWQgdGhlIGxpbWl0IG9mIDE2IElQIGFkZHJlc3NlcyBmb3IgYSBzaW5nbGUgJ2Nvbm5lY3QnIG9wdGlvbi4KKyAgLSBSZW1vdmVkIHRoZSBsaW1pdCBvZiAyNTYgc3R1bm5lbC5jb25mIHNlY3Rpb25zIGluIFBUSFJFQUQgdGhyZWFkaW5nIG1vZGVsLgorICAgIEl0IGlzIHN0aWxsIG5vdCBwb3NzaWJsZSBoYXZlIG1vcmUgdGhhbiA2MyBzZWN0aW9ucyBvbiBXaW4zMiBwbGF0Zm9ybS4KKyAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNzQwMTQxKHY9dnMuODUpLmFzcHgKKyogT3B0aW1pemF0aW9ucworICAtIFJlZHVjZWQgcGVyLWNvbm5lY3Rpb24gbWVtb3J5IHVzYWdlLgorICAtIFBlcmZvcm1lZCBhIG1ham9yIHJlZmFjdG9yaW5nIG9mIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4gIEV4dGVuc2l2ZQorICAgIGludGVybmFsIHRlc3Rpbmcgd2FzIHBlcmZvcm1lZCwgYnV0IHNvbWUgcmVncmVzc2lvbiBidWdzIGFyZSBleHBlY3RlZC4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBXaW4zMiBjb21waWxhdGlvbiB3aXRoIE1pbmd3MzIuCisgIC0gRml4ZWQgbm9uLWJsb2NraW5nIEFQSSBlbXVsYXRpb24gbGF5ZXIgaW4gVUNPTlRFWFQgdGhyZWFkaW5nIG1vZGVsLgorICAtIEZpeGVkIHNpZ25hbCBoYW5kbGluZyBpbiBVQ09OVEVYVCB0aHJlYWRpbmcgbW9kZWwuCisKK1ZlcnNpb24gNC40NSwgMjAxMS4xMC4yNCwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSAicHJvdG9jb2wgPSBwcm94eSIgc3VwcG9ydCB0byBzZW5kIG9yaWdpbmFsIGNsaWVudCBJUCBhZGRyZXNzIHRvIGhhcHJveHk6CisgICAgaHR0cDovL2hhcHJveHkuMXd0LmV1L2Rvd25sb2FkLzEuNS9kb2MvcHJveHktcHJvdG9jb2wudHh0CisgICAgVGhpcyByZXF1aXJlcyBhY2NlcHQtcHJveHkgYmluZCBvcHRpb24gb2YgaGFwcm94eSAxLjUtZGV2MyBvciBsYXRlci4KKyAgLSBBZGRlZCBXaW4zMiBjb25maWd1cmF0aW9uIHJlbG9hZCB3aXRob3V0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBsb2FkZWQuCisgIC0gQWRkZWQgY29tcGF0aWJpbGl0eSB3aXRoIExUUyBPcGVuU1NMIHZlcnNpb25zIDAuOS42IGFuZCAwLjkuNy4KKyAgICBTb21lIGZlYXR1cmVzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBPcGVuU1NMIDEuMC4wIGFuZCBsYXRlci4KKyogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucworICAtIFVzZSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgaWYgc3VwcG9ydGVkIGJ5IHRoZSBPcGVuU1NMIGxpYnJhcnkuCisgIC0gTGlid3JhcCBoZWxwZXIgcHJvY2Vzc2VzIGFyZSBubyBsb25nZXIgc3RhcnRlZCBpZiBsaWJ3cmFwIGlzIGRpc2FibGVkCisgICAgaW4gYWxsIHNlY3Rpb25zIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisqIEludGVybmFsIGltcHJvdmVtZW50cworICAtIFByb3RvY29sIG5lZ290aWF0aW9uIGZyYW1ld29yayB3YXMgcmV3cml0dGVuIHRvIHN1cHBvcnQgYWRkaXRpb25hbAorICAgIGNvZGUgdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgU1NMX2FjY2VwdCgpL1NTTF9jb25uZWN0KCkuCisgIC0gSGFuZGxpbmcgb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3JzIHdhcyByZXdyaXR0ZW4gdG8gZ3JhY2VmdWxseQorICAgIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyAodGh4IHRvIHJlZ2VucmVjaHQgZm9yIHRoZSBpZGVhKS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCAtbCBvcHRpb24gaGFuZGxpbmcgaW4gc3R1bm5lbDMgc2NyaXB0ICh0aHggdG8gS2FpIEfDvGx6YXUpLgorICAtIFNjcmlwdCB0byBidWlsZCBkZWZhdWx0IHN0dW5uZWwucGVtIHdhcyBmaXhlZCAodGh4IHRvIFNlYmFzdGlhbiBLYXlzZXIpLgorICAtIE1pbkdXIGNvbXBpbGF0aW9uIHNjcmlwdCAobWluZ3cubWFrKSB3YXMgZml4ZWQgKHRoeCB0byBKb3NlIEFsZikuCisgIC0gTVNWQyBjb21waWxhdGlvbiBzY3JpcHQgKHZjLm1haykgd2FzIGZpeGVkLgorICAtIEEgbnVtYmVyIG9mIHByb2JsZW1zIGluIFdJTlNPQ0sgZXJyb3IgaGFuZGxpbmcgd2VyZSBmaXhlZC4KKworVmVyc2lvbiA0LjQ0LCAyMDExLjA5LjE3LCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIE1ham9yIGF1dG9tYWtlL2F1dG9jb25mIGNsZWFudXAuCisgIC0gSGVhcCBidWZmZXIgb3ZlcmZsb3cgcHJvdGVjdGlvbiB3aXRoIGNhbmFyaWVzLgorICAtIFN0YWNrIGJ1ZmZlciBvdmVyZmxvdyBwcm90ZWN0aW9uIHdpdGggLWZzdGFjay1wcm90ZWN0b3IuCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgZ2FyYmxlZCBlcnJvciBtZXNzYWdlcyBvbiBlcnJvcnMgd2l0aCBzZXR1aWQvc2V0Z2lkIG9wdGlvbnMuCisgIC0gU05JIGZpeGVzICh0aHggdG8gQWxleGV5IERyb3pkb3YpLgorICAtIFVzZSBhZnRlciBmcmVlIGluIGZkcHJpbnRmKCkgKHRoeCB0byBBbGV4ZXkgRHJvemRvdikuCisgICAgVGhpcyBpc3N1ZSBtaWdodCBjYXVzZSBHUEYgd2l0aCAicHJvdG9jb2wiIG9yICJpZGVudCIgb3B0aW9ucy4KKworVmVyc2lvbiA0LjQzLCAyMDExLjA5LjA3LCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIFVwZGF0ZWQgV2luMzIgRExMcyBmb3IgT3BlblNTTCAxLjAuMGUuCisgIC0gTWFqb3Igb3B0aW1pemF0aW9uIG9mIHRoZSBsb2dnaW5nIHN1YnN5c3RlbS4KKyAgICBCZW5jaG1hcmtzIGluZGljYXRlIHVwIHRvIDE1JSBzdHVubmVsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LgorKiBCdWdmaXhlcworICAtIEZpeGVkIFdpbjMyIGNvbmZpZ3VyYXRpb24gZmlsZSByZWxvYWQuCisgIC0gRml4ZWQgRk9SSyBhbmQgVUNPTlRFWFQgdGhyZWFkaW5nIG1vZGVscy4KKyAgLSBDb3JyZWN0ZWQgSU5TVEFMTC5XMzIgZmlsZS4KKworVmVyc2lvbiA0LjQyLCAyMDExLjA4LjE4LCB1cmdlbmN5OiBISUdIOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBOZXcgdmVyaWZ5IGxldmVsIDAgdG8gcmVxdWVzdCBhbmQgaWdub3JlIHBlZXIgY2VydGlmaWNhdGUuICBUaGlzCisgICAgZmVhdHVyZSBpcyB1c2VmdWwgd2l0aCB0aGUgbmV3IFdpbmRvd3MgR1VJIG1lbnUgdG8gc2F2ZSBjYWNoZWQgcGVlcgorICAgIGNlcnRpZmljYXRlIGNoYWlucywgYXMgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZXMgYXJlIG5vdCBzZW50IGJ5IGRlZmF1bHQuCisgIC0gTWFudWFsIHBhZ2UgaGFzIGJlZW4gdXBkYXRlZC4KKyAgLSBSZW1vdmVkIHN1cHBvcnQgZm9yIGNoYW5naW5nIFdpbmRvd3MgU2VydmljZSBuYW1lIHdpdGggInNlcnZpY2UiIG9wdGlvbi4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBhIGhlYXAgY29ycnVwdGlvbiB2dWxuZXJhYmlsaXR5IGluIHZlcnNpb25zIDQuNDAgYW5kIDQuNDEuICBJdCBtYXkKKyAgICBwb3NzaWJseSBiZSBsZXZlcmFnZWQgdG8gcGVyZm9ybSBEb1Mgb3IgcmVtb3RlIGNvZGUgZXhlY3V0aW9uIGF0dGFja3MuCisgIC0gVGhlIC1xdWlldCBjb21tYW5kbGluZSBvcHRpb24gd2FzIGFwcGxpZWQgdG8gKmFsbCogbWVzc2FnZSBib3hlcy4KKyAgLSBTaWxlbnQgaW5zdGFsbCAoL1Mgb3B0aW9uKSBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY3JlYXRlIHN0dW5uZWwucGVtLgorCitWZXJzaW9uIDQuNDEsIDIwMTEuMDcuMjUsIHVyZ2VuY3k6IE1FRElVTToKKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBXaW5kb3dzIHNlcnZpY2UgY3Jhc2ggb2Ygc3R1bm5lbCA0LjQwLgorCitWZXJzaW9uIDQuNDAsIDIwMTEuMDcuMjMsIHVyZ2VuY3k6IExPVzoKKyogTmV3IFdpbjMyIGZlYXR1cmVzCisgIC0gQWRkZWQgYSBHVUkgbWVudSB0byBzYXZlIGNhY2hlZCBwZWVyIGNlcnRpZmljYXRlIGNoYWlucy4KKyAgLSBBZGRlZCBjb21hbmRsaW5lICItZXhpdCIgb3B0aW9uIHRvIHN0b3Agc3R1bm5lbCAqbm90KiBydW5uaW5nCisgICAgYXMgYSBzZXJ2aWNlLiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWZ1bCBmb3Igc2NyaXB0cy4KKyAgLSBBZGRlZCBmaWxlIHZlcnNpb24gaW5mb3JtYXRpb24gdG8gc3R1bm5lbC5leGUuCisgIC0gQSBudW1iZXIgb2Ygb3RoZXIgR1VJIGltcHJvdmVtZW50cy4KKyogT3RoZXIgbmV3IGZlYXR1cmVzCisgIC0gSGFyZGNvZGVkIDIwNDgtYml0IERIIHBhcmFtZXRlcnMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayBpZiBESCBwYXJhbWV0ZXJzCisgICAgYXJlIG5vdCBwcm92aWRlZCBpbiBzdHVubmVsLnBlbS4KKyAgLSBEZWZhdWx0ICJjaXBoZXJzIiB2YWx1ZSB1cGRhdGVkIHRvIHByZWZlciBFQ0RIOgorICAgICJBTEw6IVNTTHYyOiFhTlVMTDohRVhQOiFMT1c6LU1FRElVTTpSQzQ6K0hJR0giLgorICAtIERlZmF1bHQgRUNESCBjdXJ2ZSB1cGRhdGVkIHRvICJwcmltZTI1NnYxIi4KKyAgLSBSZW1vdmVkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBSU0Ega2V5cyAodXNlZCBpbiBvYnNvbGV0ZSBleHBvcnQgY2lwaGVycykuCisKK1ZlcnNpb24gNC4zOSwgMjAxMS4wNy4wNiwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBOZXcgV2luMzIgaW5zdGFsbGVyIG1vZHVsZSB0byBidWlsZCBzZWxmLXNpZ25lZCBzdHVubmVsLnBlbS4KKyAgLSBBZGRlZCBjb25maWd1cmF0aW9uIGZpbGUgZWRpdGluZyB3aXRoIFdpbmRvd3MgR1VJLgorICAtIEFkZGVkIGxvZyBmaWxlIHJlb3BlbmluZyBmaWxlIGVkaXRpbmcgd2l0aCBXaW5kb3dzIEdVSS4KKyAgICBJdCBtaWdodCBiZSB1c2VmdWwgdG8gYWxzbyBpbXBsZW1lbnQgbG9nIGZpbGUgcm90YXRpb24uCisgIC0gSW1wcm92ZWQgY29uZmlndXJhdGlvbiBmaWxlIHJlbG9hZCB3aXRoIFdpbmRvd3MgR1VJLgorCitWZXJzaW9uIDQuMzgsIDIwMTEuMDYuMjgsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gU2VydmVyLXNpZGUgU05JIGltcGxlbWVudGVkIChSRkMgMzU0NiBzZWN0aW9uIDMuMSkgd2l0aCBhIG5ldworICAgIHNlcnZpY2UtbGV2ZWwgb3B0aW9uICJuc2kiLgorICAtICJzb2NrZXQiIG9wdGlvbiBhbHNvIGFjY2VwdHMgInllcyIgYW5kICJubyIgZm9yIGZsYWdzLgorICAtIE5hZ2xlJ3MgYWxnb3JpdGhtIGlzIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvciBpbXByb3ZlZCBpbnRlcmFjdGl2aXR5LgorKiBCdWdmaXhlcworICAtIEEgY29tcGlsYXRpb24gZml4IHdhcyBhZGRlZCBmb3IgT3BlblNTTCB2ZXJzaW9uIDwgMS4wLjAuCisgIC0gU2lnbmFsIHBpcGUgc2V0IHRvIG5vbi1ibG9ja2luZyBtb2RlLiAgVGhpcyBidWcgY2F1c2VkIGhhbmdzIG9mIHN0dW5uZWwKKyAgICBmZWF0dXJlcyBiYXNlZCBvbiBzaWduYWxzLCBlLmcuIGxvY2FsIG1vZGUsIEZPUksgdGhyZWFkaW5nLCBvcgorICAgIGNvbmZpZ3VyYXRpb24gZmlsZSByZWxvYWQgb24gVW5peC4gIFdpbjMyIHBsYXRmb3JtIHdhcyBub3QgYWZmZWN0ZWQuCisKK1ZlcnNpb24gNC4zNywgMjAxMS4wNi4xNywgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBDbGllbnQtc2lkZSBTTkkgaW1wbGVtZW50ZWQgKFJGQyAzNTQ2IHNlY3Rpb24gMy4xKS4KKyAgLSBEZWZhdWx0ICJjaXBoZXJzIiBjaGFuZ2VkIGZyb20gdGhlIE9wZW5TU0wgZGVmYXVsdCB0byBhIG1vcmUgc2VjdXJlCisgICAgYW5kIGZhc3RlciAiUkM0LU1ENTpISUdIOiFhTlVMTDohU1NMdjIiLgorICAgIEEgcGFyYW5vaWQgKGFuZCB1c3VhbGx5IHNsb3dlcikgc2V0dGluZyB3b3VsZCBiZSAiSElHSDohYU5VTEw6IVNTTHYyIi4KKyAgLSBSZWNvbW1lbmRlZCAib3B0aW9ucyA9IE5PX1NTTHYyIiBhZGRlZCB0byB0aGUgc2FtcGxlIHN0dW5uZWwuY29uZiBmaWxlLgorICAtIERlZmF1bHQgY2xpZW50IG1ldGhvZCB1cGdyYWRlZCBmcm9tIFNTTHYzIHRvIFRMU3YxLgorICAgIFRvIGNvbm5lY3Qgc2VydmVycyB3aXRob3V0IFRMUyBzdXBwb3J0IHVzZSAic3NsVmVyc2lvbiA9IFNTTHYzIiBvcHRpb24uCisgIC0gSW1wcm92ZWQgLS1lbmFibGUtZmlwcyBhbmQgLS1kaXNhYmxlLWZpcHMgLi9jb25maWd1cmUgb3B0aW9uIGhhbmRsaW5nLgorICAtIE9uIHN0YXJ0dXAgc3R1bm5lbCBub3cgY29tcGFyZXMgdGhlIGNvbXBpbGVkIHZlcnNpb24gb2YgT3BlblNTTCBhZ2FpbnN0CisgICAgdGhlIHJ1bm5pbmcgdmVyc2lvbiBvZiBPcGVuU1NMLiBBIHdhcm5pbmcgaXMgbG9nZ2VkIG9uIG1pc21hdGNoLgorKiBCdWdmaXhlcworICAtIE5vbi1ibG9ja2luZyBzb2NrZXQgaGFuZGxpbmcgaW4gbG9jYWwgbW9kZSBmaXhlZCAoRGViaWFuIGJ1ZyAjNjI2ODU2KS4KKyAgLSBVQ09OVEVYVCB0aHJlYWRpbmcgbW9kZSBmaXhlZC4KKyAgLSBSZW1vdmVkIHRoZSB1c2Ugb2YgZ2NjIFRocmVhZC1Mb2NhbCBTdG9yYWdlIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eS4KKyAgLSB2YV9jb3B5IG1hY3JvIGRlZmluZWQgZm9yIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBoYXZlIGl0LgorICAtIEZpeGVkICJsb2NhbCIgb3B0aW9uIHBhcnNpbmcgb24gSVB2NCBzeXN0ZW1zLgorICAtIFNvbGFyaXMgY29tcGlsYXRpb24gZml4IChyZWRlZmluaXRpb24gb2YgIlNUUiIpLgorCitWZXJzaW9uIDQuMzYsIDIwMTEuMDUuMDMsIHVyZ2VuY3k6IExPVzoKKyogTmV3IGZlYXR1cmVzCisgIC0gVXBkYXRlZCBXaW4zMiBETExzIGZvciBPcGVuU1NMIDEuMC4wZC4KKyAgLSBEeW5hbWljIG1lbW9yeSBtYW5hZ2VtZW50IGZvciBzdHJpbmdzIG1hbmlwdWxhdGlvbjoKKyAgICBubyBtb3JlIHN0YXRpYyBTVFJMRU4gbGltaXQsIGxvd2VyIHN0YWNrIGZvb3RwcmludC4KKyAgLSBTdHJpY3QgcHVibGljIGtleSBjb21wYXJpc29uIGFkZGVkIGZvciAidmVyaWZ5ID0gMyIgY2VydGlmaWNhdGUKKyAgICBjaGVja2luZyBtb2RlICh0aHggdG8gUGhpbGlwcCBIYXJ0d2lnKS4KKyAgLSBCYWNrbG9nIHBhcmFtZXRlciBvZiBsaXN0ZW4oMikgY2hhbmdlZCBmcm9tIDUgdG8gU09NQVhDT05OOgorICAgIGltcHJvdmVkIGJlaGF2aW9yIG9uIGhlYXZ5IGxvYWQuCisgIC0gRXhhbXBsZSB0b29scy9zdHVubmVsLnNlcnZpY2UgZmlsZSBhZGRlZCBmb3Igc3lzdGVtZCBzZXJ2aWNlIG1hbmFnZXIuCisqIEJ1Z2ZpeGVzCisgIC0gTWlzc2luZyBwdGhyZWFkX2F0dHJfZGVzdHJveSgpIGFkZGVkIHRvIGZpeCBtZW1vcnkgbGVhayAodGh4IHRvCisgICAgUGF1bCBBbGxleCBhbmQgUGV0ZXIgUGVudGNoZXYpLgorICAtIEZpeGVkIHRoZSBpbmNvcnJlY3Qgd2F5IG9mIHNldHRpbmcgRkRfQ0xPRVhFQyBmbGFnLgorICAtIEZpeGVkIC0tZW5hYmxlLWxpYndyYXAgb3B0aW9uIG9mIC4vY29uZmlndXJlIHNjcmlwdC4KKyAgLSAvb3B0L2xvY2FsIGFkZGVkIHRvIE9wZW5TU0wgc2VhcmNoIHBhdGggZm9yIE1hY1BvcnRzIGNvbXBhdGliaWxpdHkuCisgIC0gV29ya2Fyb3VuZCBpbXBsZW1lbnRlZCBmb3Igc2lnbmFsIGhhbmRsaW5nIG9uIE1hY09TIFguCisgIC0gQSB0cml2aWFsIGJ1ZyBmaXhlZCBpbiB0aGUgc3R1bm5lbC5pbml0IHNjcmlwdC4KKyAgLSBSZXRyeSBpbXBsZW1lbnRlZCBvbiBFQUlfQUdBSU4gZXJyb3IgcmV0dXJuZWQgYnkgcmVzb2x2ZXIgY2FsbHMuCisKK1ZlcnNpb24gNC4zNSwgMjAxMS4wMi4wNSwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBVcGRhdGVkIFdpbjMyIERMTHMgZm9yIE9wZW5TU0wgMS4wLjBjLgorICAtIFRyYW5zcGFyZW50IHNvdXJjZSAobm9uLWxvY2FsIGJpbmQpIGFkZGVkIGZvciBGcmVlQlNEIDgueC4KKyAgLSBUcmFuc3BhcmVudCBkZXN0aW5hdGlvbiAoInRyYW5zcGFyZW50ID0gZGVzdGluYXRpb24iKSBhZGRlZCBmb3IgTGludXguCisqIEJ1Z2ZpeGVzCisgIC0gRml4ZWQgcmVsb2FkIG9mIEZJUFMtZW5hYmxlZCBzdHVubmVsLgorICAtIENvbXBpbGVyIG9wdGlvbnMgYXJlIG5vdyBhdXRvLWRldGVjdGVkIGJ5IC4vY29uZmlndXJlIHNjcmlwdAorICAgIGluIG9yZGVyIHRvIHN1cHBvcnQgb2Jzb2xldGUgdmVyc2lvbnMgb2YgZ2NjLgorICAtIEFzeW5jLXNpZ25hbC11bnNhZmUgc19sb2coKSByZW1vdmVkIGZyb20gU0lHVEVSTS9TSUdRVUlUL1NJR0lOVCBoYW5kbGVyLgorICAtIENMT0VYRUMgZmlsZSBkZXNjcmlwdG9yIGxlYWtzIGZpeGVkIG9uIExpbnV4ID49IDIuNi4yOCB3aXRoIGdsaWJjID49IDIuMTAuCisgICAgSXJyZXBhcmFibGUgcmFjZSBjb25kaXRpb24gbGVha3MgcmVtYWluIG9uIG90aGVyIFVuaXggcGxhdGZvcm1zLgorICAgIFRoaXMgaXNzdWUgbWF5IGhhdmUgc2VjdXJpdHkgaW1wbGljYXRpb25zIG9uIHNvbWUgZGVwbG95bWVudHM6CisgICAgaHR0cDovL3VkcmVwcGVyLmxpdmVqb3VybmFsLmNvbS8yMDQwNy5odG1sCisgIC0gRGlyZWN0b3J5IGxpYjY0IGluY2x1ZGVkIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkgc2VhcmNoIHBhdGguCisgIC0gV2luZG93cyBDRSBjb21waWxhdGlvbiBmaXhlcyAodGh4IHRvIFBpZXJyZSBEZWxhYWdlKS4KKyAgLSBEZXByZWNhdGVkIFJTQV9nZW5lcmF0ZV9rZXkoKSByZXBsYWNlZCB3aXRoIFJTQV9nZW5lcmF0ZV9rZXlfZXgoKS4KKyogRG9tYWluIG5hbWUgY2hhbmdlcyAoY291cnRlc3kgb2YgQnJpIEhhdGNoKQorICAtIGh0dHA6Ly9zdHVubmVsLm1pcnQubmV0LyAtLT4gaHR0cDovL3d3dy5zdHVubmVsLm9yZy8KKyAgLSBmdHA6Ly9zdHVubmVsLm1pcnQubmV0LyAtLT4gaHR0cDovL2Z0cC5zdHVubmVsLm9yZy8KKyAgLSBzdHVubmVsLm1pcnQubmV0OjpzdHVubmVsIC0tPiByc3luYy5zdHVubmVsLm9yZzo6c3R1bm5lbAorICAtIHN0dW5uZWwtdXNlcnNAbWlydC5uZXQgLS0+IHN0dW5uZWwtdXNlcnNAc3R1bm5lbC5vcmcKKyAgLSBzdHVubmVsLWFubm91bmNlQG1pcnQubmV0IC0tPiBzdHVubmVsLWFubm91bmNlQHN0dW5uZWwub3JnCisKK1ZlcnNpb24gNC4zNCwgMjAxMC4wOS4xOSwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBVcGRhdGVkIFdpbjMyIERMTHMgZm9yIE9wZW5TU0wgMS4wLjBhLgorICAtIFVwZGF0ZWQgV2luMzIgRExMcyBmb3IgemxpYiAxLjIuNS4KKyAgLSBVcGRhdGVkIGF1dG9tYWtlIHRvIHZlcnNpb24gMS4xMS4xCisgIC0gVXBkYXRlZCBsaWJ0b29sIHRvIHZlcnNpb24gMi4yLjZiCisgIC0gQWRkZWQgRUNDIHN1cHBvcnQgd2l0aCBhIG5ldyBzZXJ2aWNlLWxldmVsICJjdXJ2ZSIgb3B0aW9uLgorICAtIERIIHN1cHBvcnQgaXMgbm93IGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgLSBBZGRlZCBzdXBwb3J0IGZvciBPcGVuU1NMIGJ1aWxkcyB3aXRoIHNvbWUgYWxnb3JpdGhtcyBkaXNhYmxlZC4KKyAgLSAuL2NvbmZpZ3VyZSBtb2RpZmllZCB0byBzdXBwb3J0IGNyb3NzLWNvbXBpbGF0aW9uLgorICAtIFNhbXBsZSBzdHVubmVsLmluaXQgdXBkYXRlZCBiYXNlZCBvbiBEZWJpYW4gaW5pdCBzY3JpcHQuCisqIEJ1Z2ZpeGVzCisgIC0gSW1wbGVtZW50ZWQgZml4ZXMgaW4gdXNlciBpbnRlcmZhY2UgdG8gZW50ZXIgZW5naW5lIFBJTi4KKyAgLSBGaXhlZCBhIHRyYW5zZmVyKCkgbG9vcCBpc3N1ZSBvbiBzb2NrZXQgZXJyb3JzLgorICAtIEZpeGVkIG1pc3NpbmcgV2luMzIgdGFza2JhciBpY29uIHdoaWxlIGRpc3BsYXlpbmcgYSBnbG9iYWwgb3B0aW9uIGVycm9yLgorCitWZXJzaW9uIDQuMzMsIDIwMTAuMDQuMDUsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gV2luMzIgRExMcyBmb3IgT3BlblNTTCAxLjAuMC4KKyAgICBUaGlzIGxpYnJhcnkgcmVxdWlyZXMgdG8gY19yZWhhc2ggQ0FwYXRoL0NSTHBhdGggZGlyZWN0b3JpZXMgb24gdXBncmFkZS4KKyAgLSBXaW4zMiBETExzIGZvciB6bGliIDEuMi40LgorICAtIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBsb2NhbCBtb2RlIG9uIFdpbjMyIHBsYXRmb3JtLgorICAgIFRyeSAiZXhlYyA9IGM6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSIuCisqIEJ1Z2ZpeGVzCisgIC0gSW5ldGQgbW9kZSBmaXhlZC4KKworVmVyc2lvbiA0LjMyLCAyMDEwLjAzLjI0LCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIE5ldyBzZXJ2aWNlLWxldmVsICJsaWJ3cmFwIiBvcHRpb24gZm9yIHJ1bi10aW1lIGNvbnRyb2wgd2hldGhlcgorICAgIC9ldGMvaG9zdHMuYWxsb3cgYW5kIC9ldGMvaG9zdHMuZGVueSBhcmUgdXNlZCBmb3IgYWNjZXNzIGNvbnRyb2wuCisgICAgRGlzYWJsaW5nIGxpYndyYXAgc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMgcGVyZm9ybWFuY2Ugb2Ygc3R1bm5lbC4KKyAgLSBXaW4zMiBETExzIGZvciBPcGVuU1NMIDAuOS44bS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBhIHRyYW5zZmVyKCkgbG9vcCBpc3N1ZSB3aXRoIFNTTHYyIGNvbm5lY3Rpb25zLgorICAtIEZpeGVkIGEgInNldHNvY2tvcHQgSVBfVFJBTlNQQVJFTlQiIHdhcm5pbmcgd2l0aCAibG9jYWwiIG9wdGlvbi4KKyAgLSBMb2dnaW5nIHN1YnN5c3RlbSBidWdmaXhlcyBhbmQgY2xlYW51cC4KKyAgLSBJbnN0YWxsZXIgYnVnZml4ZXMgZm9yIFZpc3RhIGFuZCBsYXRlciB2ZXJzaW9ucyBvZiBXaW5kb3dzLgorICAtIEZJUFMgbW9kZSBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lLgorCitWZXJzaW9uIDQuMzEsIDIwMTAuMDIuMDMsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gTG9nIGZpbGUgcmVvcGVuIG9uIFVTUjEgc2lnbmFsIHdhcyBhZGRlZC4KKyogQnVnZml4ZXMKKyAgLSBTb21lIHJlZ3Jlc3Npb24gaXNzdWVzIGludHJvZHVjZWQgaW4gNC4zMCB3ZXJlIGZpeGVkLgorCitWZXJzaW9uIDQuMzAsIDIwMTAuMDEuMjEsIHVyZ2VuY3k6IExPVy9FWFBFUklNRU5UQUw6CisqIE5ldyBmZWF0dXJlcworICAtIEdyYWNlZnVsIGNvbmZpZ3VyYXRpb24gcmVsb2FkIHdpdGggSFVQIHNpZ25hbCBvbiBVbml4CisgICAgYW5kIHdpdGggR1VJIG9uIFdpbmRvd3MuCisKK1ZlcnNpb24gNC4yOSwgMjAwOS4xMi4wMiwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZSBzcG9uc29yZWQgYnkgU2VhcmNodGVjaCBMaW1pdGVkIGh0dHA6Ly93d3cuYXN0cmF3ZWIuY29tLworICAtIHNlc3Npb25kLCBhIGhpZ2ggcGVyZm9ybWFuY2UgU1NMIHNlc3Npb24gY2FjaGUgd2FzIGJ1aWx0IGZvciBzdHVubmVsLgorICAgIEEgbmV3IHNlcnZpY2UtbGV2ZWwgInNlc3Npb25kIiBvcHRpb24gd2FzIGFkZGVkLiAgc2Vzc2lvbmQgaXMKKyAgICBhdmFpbGFibGUgZm9yIGRvd25sb2FkIG9uIGZ0cDovL2Z0cC5zdHVubmVsLm9yZy9zdHVubmVsL3Nlc3Npb25kLyAuCisgICAgc3R1bm5lbCBjbHVzdGVycyB3aWxsIGJlIGEgbG90IGZhc3Rlciwgbm93IQorKiBCdWdmaXhlcworICAtICJleGVjYXJncyIgZGVmYXVsdHMgdG8gdGhlICJleGVjIiBwYXJhbWV0ZXIgKHRoeCB0byBQZXRlciBQZW50Y2hldikuCisgIC0gQ29tcGlsYXRpb24gZml4ZXMgYWRkZWQgZm9yIEFJWCBhbmQgb2xkIHZlcnNpb25zIG9mIE9wZW5TU0wuCisgIC0gTWlzc2luZyAiZmlwcyIgb3B0aW9uIHdhcyBhZGRlZCB0byB0aGUgbWFudWFsLgorCitWZXJzaW9uIDQuMjgsIDIwMDkuMTEuMDgsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gV2luMzIgRExMcyBmb3IgT3BlblNTTCAwLjkuOGwuCisgIC0gVHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydCBvbiBMaW51eCBrZXJuZWxzID49Mi42LjI4LgorICAgIFNlZSB0aGUgbWFudWFsIGZvciBkZXRhaWxzLgorICAtIE5ldyBzb2NrZXQgb3B0aW9ucyB0byBjb250cm9sIFRDUCBrZWVwYWxpdmUgb24gTGludXg6CisgICAgVENQX0tFRVBDTlQsIFRDUF9LRUVQSURMRSwgVENQX0tFRVBJTlRWTC4KKyAgLSBTU0wgb3B0aW9ucyB1cGRhdGVkIGZvciB0aGUgcmVjZW50IHZlcnNpb24gb2YgT3BlblNTTCBsaWJyYXJ5LgorKiBCdWdmaXhlcworICAtIEEgc2VyaW91cyBidWcgaW4gYXN5bmNocm9ub3VzIHNodXRkb3duIGNvZGUgZml4ZWQuCisgIC0gRGF0YSBhbGlnbm1lbnQgdXBkYXRlZCBpbiBsaWJ3cmFwLmMuCisgIC0gUG9saXNoIG1hbnVhbCBlbmNvZGluZyBmaXhlZC4KKyAgLSBOb3RlcyBvbiBjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvbiBpbiBPcGVuU1NMIGFkZGVkIHRvIHRoZSBtYW51YWwuCisKK1ZlcnNpb24gNC4yNywgMjAwOS4wNC4xNiwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBXaW4zMiBETExzIGZvciBPcGVuU1NMIDAuOS44ay4KKyAgLSBGSVBTIHN1cHBvcnQgd2FzIHVwZGF0ZWQgZm9yIG9wZW5zc2wtZmlwcyAxLjIuCisgIC0gTmV3IHByaW9yaXR5IGZhaWxvdmVyIHN0cmF0ZWd5IGZvciBtdWx0aXBsZSAiY29ubmVjdCIgdGFyZ2V0cywKKyAgICBjb250cm9sbGVkIHdpdGggImZhaWxvdmVyPXJyIiAoZGVmYXVsdCkgb3IgImZhaWxvdmVyPXByaW8iLgorICAtIHBnc3FsIHByb3RvY29sIG5lZ290aWF0aW9uIGJ5IE1hcmtvIEtyZWVuIDxtYXJrb2tyQGdtYWlsLmNvbT4uCisgIC0gQnVpbGRpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgdXBkYXRlZCBpbiBJTlNUQUxMLlczMiBmaWxlLgorKiBCdWdmaXhlcworICAtIExpYndyYXAgaGVscGVyIHByb2Nlc3NlcyBmaXhlZCB0byBjbG9zZSBzdGFuZGFyZAorICAgIGlucHV0L291dHB1dC9lcnJvciBmaWxlIGRlc2NyaXB0b3JzLgorICAtIE9TMiBjb21waWxhdGlvbiBmaXhlcy4KKyAgLSBXQ0UgZml4ZXMgYnkgUGllcnJlIERlbGFhZ2UgPGRlbGFhZ2UucGllcnJlQGZyZWUuZnI+LgorCitWZXJzaW9uIDQuMjYsIDIwMDguMDkuMjAsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gV2luMzIgRExMcyBmb3IgT3BlblNTTCAwLjkuOGkuCisgIC0gL2V0Yy9ob3N0cy5hbGxvdyBhbmQgL2V0Yy9ob3N0cy5kZW55IG5vIGxvbmdlciBuZWVkIHRvIGJlCisgICAgY29waWVkIHRvIHRoZSBjaHJvb3RlZCBkaXJlY3RvcnksIGFzIHRoZSBsaWJ3cmFwIHByb2Nlc3NlcworICAgIGFyZSBubyBsb25nZXIgY2hyb290ZWQuCisgIC0gQSBtb3JlIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBpbnZhbGlkIHBvcnQgbnVtYmVyCisgICAgc3BlY2lmaWVkIGluIHN0dW5uZWwuY29uZiBmaWxlLgorICAtIFN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMCBFeHByZXNzIEVkaXRpb24uCisqIEJ1Z2ZpeGVzCisgIC0gS2lsbGluZyBhbGwgbGlid3JhcCBwcm9jZXNzZXMgYXQgc3R1bm5lbCBzaHV0ZG93biBmaXhlZC4KKyAgLSBBIG1pbm9yIGJ1ZyBpbiBzdHVubmVsLmluaXQgc2FtcGxlIFN5c1Ygc3RhcnR1cCBmaWxlIGZpeGVkLgorCitWZXJzaW9uIDQuMjUsIDIwMDguMDYuMDEsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gV2luMzIgRExMcyBmb3IgT3BlblNTTCAwLjkuOGguCisqIEJ1Z2ZpeGVzCisgIC0gU3Bhd25pbmcgbGlid3JhcCBwcm9jZXNzZXMgZGVsYXllZCB1bnRpbCBwcml2aWxlZ2VzIGFyZSBkcm9wcGVkLgorICAtIENvbXBpbGF0aW9uIGZpeCBmb3Igc3lzdGVtcyB3aXRob3V0IHN0cnVjdCBtc2doZHIubXNnX2NvbnRyb2wuCisKK1ZlcnNpb24gNC4yNCwgMjAwOC4wNS4xOSwgdXJnZW5jeTogSElHSDoKKyogQnVnZml4ZXMKKyAgLSBPQ1NQIGNvZGUgd2FzIGZpeGVkIHRvIHByb3Blcmx5IHJlamVjdCByZXZva2VkIGNlcnRpZmljYXRlcy4KKworVmVyc2lvbiA0LjIzLCAyMDA4LjA1LjAzLCB1cmdlbmN5OiBISUdIOgorKiBCdWdmaXhlcworICAtIExvY2FsIHByaXZpbGVnZSBlc2NhbGF0aW9uIGJ1ZyBvbiBXaW5kb3dzIE5UIGJhc2VkCisgICAgc3lzdGVtcyBmaXhlZC4gIEEgbG9jYWwgdXNlciBjb3VsZCBleHBsb2l0IHN0dW5uZWwKKyAgICBydW5uaW5nIGFzIGEgc2VydmljZSB0byBnYWluIGxvY2Fsc3lzdGVtIHByaXZpbGVnZXMuCisKK1ZlcnNpb24gNC4yMiwgMjAwOC4wMy4yOCwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBNYWtlZmlsZSB3YXMgdXBkYXRlZCB0byB1c2Ugc3RhbmRhcmQgYXV0b2NvbmYgdmFyaWFibGVzOgorICAgIHN5c2NvbmZkaXIsIGxvY2Fsc3RhdGVkaXIgYW5kIHBrZ2xpYmRpci4KKyAgLSBBIG5ldyBnbG9iYWwgb3B0aW9uIHRvIGNvbnRyb2wgbG9nZ2luZyB0byBzeXNsb2c6CisgICAgICBzeXNsb2cgPSB5ZXN8bm8KKyAgICBTaW11bHRhbmVvdXMgbG9nZ2luZyB0byBhIGZpbGUgYW5kIHRoZSBzeXNsb2cgaXMgbm93IHBvc3NpYmxlLgorICAtIEEgbmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uIHRvIGNvbnRyb2wgc3RhY2sgc2l6ZToKKyAgICAgIHN0YWNrID0gPG51bWJlciBvZiBieXRlcz4KKyogQnVnZml4ZXMKKyAgLSBSZXN0b3JlZCBjaHJvb3QoKSB0byBiZSBleGVjdXRlZCBhZnRlciBkZWNvZGluZyBudW1lcmljYWwKKyAgICB1c2VyaWQgYW5kIGdyb3VwaWQgdmFsdWVzIGluIGRyb3BfcHJpdmlsZWdlcygpLgorICAtIEEgZmV3IGJ1Z3MgZml4ZWQgdGhlIGluIHRoZSBuZXcgbGlid3JhcCBzdXBwb3J0IGNvZGUuCisgIC0gVExTdjEgbWV0aG9kIHVzZWQgYnkgZGVmYXVsdCBpbiBGSVBTIG1vZGUgaW5zdGVhZCBvZgorICAgIFNTTHYzIGNsaWVudCBhbmQgU1NMdjIzIHNlcnZlciBtZXRob2RzLgorICAtIE9wZW5TU0wgR1BMIGxpY2Vuc2UgZXhjZXB0aW9uIHVwZGF0ZSBiYXNlZCBvbgorICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwjR1BMSW5jb21wYXRpYmxlTGlicworCitWZXJzaW9uIDQuMjEsIDIwMDcuMTAuMjcsIHVyZ2VuY3k6IExPVy9FWFBFUklNRU5UQUw6CisqIE5ldyBmZWF0dXJlcyBzcG9uc29yZWQgYnkgT3Blbi1Tb3VyY2UgU29mdHdhcmUgSW5zdGl0dXRlCisgIC0gSW5pdGlhbCBGSVBTIDE0MC0yIHN1cHBvcnQgKHNlZSBJTlNUQUxMLkZJUFMgZm9yIGRldGFpbHMpLgorICAgIFdpbjMyIHBsYXRmb3JtIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorKiBOZXcgZmVhdHVyZXMKKyAgLSBFeHBlcmltZW50YWwgZmFzdCBzdXBwb3J0IGZvciBub24tTVQtc2FmZSBsaWJ3cmFwIGlzIHByb3ZpZGVkCisgICAgd2l0aCBwcmUtc3Bhd25lZCBwcm9jZXNzZXMuCisgIC0gU3R1bm5lbCBiaW5hcnkgbW92ZWQgZnJvbSAvdXNyL2xvY2FsL3NiaW4gdG8gL3Vzci9sb2NhbC9iaW4KKyAgICBpbiBvcmRlciB0byBtZWV0IEZIUyBhbmQgTFNCIHJlcXVpcmVtZW50cy4KKyAgICBQbGVhc2UgZGVsZXRlIHRoZSAvdXNyL2xvY2FsL3NiaW4vc3R1bm5lbCB3aGVuIHVwZ3JhZGluZy4KKyAgLSBBZGRlZCBjb2RlIHRvIGRpc2FsbG93IGNvbXBpbGluZyBzdHVubmVsIHdpdGggcHRocmVhZHMgd2hlbgorICAgIE9wZW5TU0wgaXMgY29tcGlsZWQgd2l0aG91dCB0aHJlYWRzIHN1cHBvcnQuCisgIC0gV2luMzIgRExMcyBmb3IgT3BlblNTTCAwLjkuOGcuCisgIC0gTWlub3IgbWFudWFsIHVwZGF0ZS4KKyAgLSBUT0RPIGZpbGUgdXBkYXRlZC4KKyogQnVnZml4ZXMKKyAgLSBEeW5hbWljIGxvY2tpbmcgY2FsbGJhY2tzIGFkZGVkIChuZWVkZWQgYnkgc29tZSBlbmdpbmVzIHRvIHdvcmspLgorICAtIEFDX0FSR19FTkFCTEUgZml4ZWQgaW4gY29uZmlndXJlLmFtIHRvIGFjY2VwdCB5ZXMvbm8gYXJndW1lbnRzLgorICAtIE9uIHNvbWUgc3lzdGVtcyBsaWJ3cmFwIHJlcXVpcmVzIHlwX2dldF9kZWZhdWx0X2RvbWFpbiBmcm9tIGxpYm5zbCwKKyAgICBhZGRpdGlvbmFsIGNoZWNraW5nIGZvciBsaWJuc2wgd2FzIGFkZGVkIHRvIHRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQuCisgIC0gU2VuZGluZyBhIGxpc3Qgb2YgdHJ1c3RlZCBDQXMgZm9yIHRoZSBjbGllbnQgdG8gY2hvb3NlIHRoZSByaWdodAorICAgIGNlcnRpZmljYXRlIHJlc3RvcmVkLgorICAtIFNvbWUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBOVExNIGF1dGhlbnRpY2F0aW9uIGZpeGVkLgorICAtIFRhc2tiYXIgaWNvbiAodW5sZXNzIHRoZXJlIGlzIGEgY29uZmlnIGZpbGUgcGFyc2luZyBlcnJvcikgYW5kCisgICAgIlNhdmUgQXMiIGRpc2FibGVkIGluIHRoZSBzZXJ2aWNlIG1vZGUgZm9yIGxvY2FsIFdpbjMyIHNlY3VyaXR5CisgICAgKGl0J3MgbXVjaCBsaWtlIFlldGkgLS0gc29tZSBwZW9wbGUgY2xhaW0gdGhleSBoYXZlIHNlZW4gaXQpLgorCitWZXJzaW9uIDQuMjAsIDIwMDYuMTEuMzAsIHVyZ2VuY3k6IE1FRElVTToKKyogUmVsZWFzZSBub3RlcworICAtIFRoZSBuZXcgdHJhbnNmZXIoKSBmdW5jdGlvbiBoYXMgYmVlbiB3ZWxsIHRlc3RlZC4KKyAgICBJIHJlY29tbWVuZCB1cGdyYWRpbmcgYW55IHByZXZpb3VzIHZlcnNpb24gd2l0aCB0aGlzIG9uZS4KKyogQnVnZml4ZXMKKyAgLSBGaXhlZCBzdXBwb3J0IGZvciBlbmNyeXB0ZWQgcGFzc3BocmFzZXMgb24gVW5peCAoYnJva2VuIGluIDQuMTkpLgorICAtIFJlZHVjZWQgYW1vdW50IG9mIGRlYnVnIGxvZ3MuCisgIC0gQSBtaW5vciBtYW4gcGFnZSB1cGRhdGUuCisKK1ZlcnNpb24gNC4xOSwgMjAwNi4xMS4xMSwgdXJnZW5jeTogTE9XL0VYUEVSSU1FTlRBTDoKKyogUmVsZWFzZSBub3RlcworICAtIFRoZXJlIGFyZSBhIGxvdCBvZiBuZXcgZmVhdHVyZXMgaW4gdGhpcyB2ZXJzaW9uLiAgSSByZWNvbW1lbmQKKyAgICB0byB0ZXN0IGl0IHdlbGwgYmVmb3JlIHVwZ3JhZGluZyB5b3VyIG1pc3Npb24tY3JpdGljYWwgc3lzdGVtcy4KKyogTmV3IGZlYXR1cmVzCisgIC0gTmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uIHRvIHNwZWNpZnkgT0NTUCBzZXJ2ZXIgZmxhZzoKKyAgICBPQ1NQZmxhZyA9IDxmbGFnPgorICAtICJwcm90b2NvbENyZWRlbnRpYWxzIiBvcHRpb24gY2hhbmdlZCB0byAicHJvdG9jb2xVc2VybmFtZSIKKyAgICBhbmQgInByb3RvY29sUGFzc3dvcmQiCisgIC0gTlRMTSBzdXBwb3J0IHRvIGJlIGVuYWJsZWQgd2l0aCB0aGUgbmV3IHNlcnZpY2UtbGV2ZWwgb3B0aW9uOgorICAgIHByb3RvY29sQXV0aGVudGljYXRpb24gPSBOVExNCisgIC0gaW1hcCBwcm90b2NvbCBuZWdvdGlhdGlvbiBzdXBwb3J0IGFkZGVkLgorICAtIFBhc3NwaHJhc2UgY2FjaGUgd2FzIGFkZGVkIHNvIHRoZSB1c2VyIGRvZXMgbm90IG5lZWQgdG8gcmVlbnRlcgorICAgIHRoZSBzYW1lIHBhc3NwaHJhc2UgZm9yIGVhY2ggZGVmaW5lZCBzZXJ2aWNlIGFueSBtb3JlLgorICAtIE5ldyBzZXJ2aWNlLWxldmVsIG9wdGlvbiB0byByZXRyeSBleGVjK2Nvbm5lY3Qgc2VjdGlvbjoKKyAgICByZXRyeSA9IHllc3xubworICAtIExvY2FsIElQIGFuZCBwb3J0IGlzIGxvZ2dlZCBmb3IgZWFjaCBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLgorICAtIFdpbjMyIERMTHMgZm9yIE9wZW5TU0wgMC45LjhkLgorKiBCdWdmaXhlcworICAtIFNlcmlvdXMgcHJvYmxlbSB3aXRoIFNTTF9XQU5UXyogcmV0cmllcyBmaXhlZC4KKyAgICBUaGUgbmV3IGNvZGUgcmVxdWlyZXMgZXh0ZW5zaXZlIHRlc3RpbmchCisKK1ZlcnNpb24gNC4xOCwgMjAwNi4wOS4yNiwgdXJnZW5jeTogTUVESVVNOgorKiBCdWdmaXhlcworICAtIEdQRiBvbiBlbnRlcmluZyBwcml2YXRlIGtleSBwYXNzIHBocmFzZSBvbiBXaW4zMiBmaXhlZC4KKyAgLSBVcGRhdGVkIE9wZW5TU0wgV2luMzIgRExMcy4KKyAgLSBNaW5vciBjb25maWd1cmUgc2NyaXB0IHVwZGF0ZS4KKworVmVyc2lvbiA0LjE3LCAyMDA2LjA5LjEwLCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIFdpbjMyIERMTHMgZm9yIE9wZW5TU0wgMC45LjhjLgorKiBCdWdmaXhlcworICAtIFByb2JsZW0gd2l0aCBkZXRlY3RpbmcgZ2V0YWRkcmluZm8oKSBpbiAuL2NvbmZpZ3VyZSBmaXhlZC4KKyAgLSBDb21waWxhdGlvbiBwcm9ibGVtIGR1ZSB0byBtaXNwbGFjZWQgI2VuZGlmIGluIHNzbC5jIGZpeGVkLgorICAtIER1cGxpY2F0ZSAyMjAgaW4gc210cF9zZXJ2ZXIoKSBmdW5jdGlvbiBpbiBwcm90b2NvbC5jIGZpeGVkLgorICAtIE1pbm9yIG9zMi5tYWsgdXBkYXRlLgorICAtIE1pbm9yIHVwZGF0ZSBvZiBzYWZlc3RyaW5nKCkvc2FmZW5hbWUoKSBtYWNyb3MuCisKK1ZlcnNpb24gNC4xNiwgMjAwNi4wOC4zMSwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMgc3BvbnNvcmVkIGJ5IEhld2xldHQtUGFja2FyZAorICAtIEEgbmV3IGdsb2JhbCBvcHRpb24gdG8gY29udHJvbCBlbmdpbmU6CisgICAgZW5naW5lQ3RybCA9IDxjb21tYW5kPls6PHBhcmFtZXRlcj5dCisgIC0gQSBuZXcgc2VydmljZS1sZXZlbCBvcHRpb24gdG8gc2VsZWN0IGVuZ2luZSB0byByZWFkIHByaXZhdGUga2V5OgorICAgIGVuZ2luZU51bSA9IDxlbmdpbmUgbnVtYmVyPgorICAtIE9DU1Agc3VwcG9ydDoKKyAgICBvY3NwID0gPFVSTD4KKyogTmV3IGZlYXR1cmVzCisgIC0gQSBuZXcgb3B0aW9uIHRvIHNlbGVjdCB2ZXJzaW9uIG9mIFNTTCBwcm90b2NvbDoKKyAgICBzc2xWZXJzaW9uID0gYWxsfFNTTHYyfFNTTHYzfFRMU3YxCisgIC0gVmlzdWFsIFN0dWRpbyB2Yy5tYWsgYnkgRGF2aWQgR2lsbGluZ2hhbSA8ZGdpbGxpbmdoYW1AZ21haWwuY29tPi4KKyAgLSBPUzIgc3VwcG9ydCBieSBQYXVsIFNtZWRsZXkgKGh0dHA6Ly9zbWVkbGV5LmluZm8pCisqIEJ1Z2ZpeGVzCisgIC0gQW4gb3JkaW5hcnkgdXNlciBjYW4gaW5zdGFsbCBzdHVubmVsIGFnYWluLgorICAtIENvbXBpbGF0aW9uIHByb2JsZW0gd2l0aCAtLWVuYWJsZS1kaCBmaXhlZC4KKyAgLSBTb21lIG1pbm9yIGNvbXBpbGF0aW9uIHdhcm5pbmdzIGZpeGVkLgorICAtIFNlcnZpY2UtbGV2ZWwgQ1JMIGNlcnQgc3RvcmUgaW1wbGVtZW50ZWQuCisgIC0gR1BGIG9uIHByb3RvY29sIG5lZ290aWF0aW9ucyBmaXhlZC4KKyAgLSBQcm9ibGVtIGRldGVjdGluZyBhZGRyaW5mbygpIG9uIFRydTY0IGZpeGVkLgorICAtIERlZmF1bHQgZ3JvdXAgaXMgbm93IGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHQuCisgIC0gQ2hlY2sgZm9yIG1heGltdW0gbnVtYmVyIG9mIGRlZmluZWQgc2VydmljZXMgYWRkZWQuCisgIC0gT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSBhZGRlZCB0byBTU0wgaW5pdGlhbGl6YXRpb24uCisgIC0gY29uZmlndXJlIHNjcmlwdCBzZWN0aW9ucyByZW9yZGVyZWQgdG8gZGV0ZWN0IHB0aHJlYWQgbGlicmFyeSBmdW5jdGlvbnMuCisgIC0gUkZDIDI0ODcgYXV0b2RldGVjdGlvbiBpbXByb3ZlZC4gIEhpZ2ggcmVzb2x1dGlvbiBzX3BvbGxfd2FpdCgpCisgICAgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgVUNPTlRFWFQgdGhyZWFkaW5nLgorICAtIE1vcmUgcHJlY2lzZSBkZXNjcmlwdGlvbiBvZiBjZXJ0IGRpcmVjdG9yeSBmaWxlIG5hbWVzICh0aHggdG8gTXVoYW1tYWQKKyAgICBNdXF1aXQpLgorKiBPdGhlciBjaGFuZ2VzCisgIC0gTWF4aW11bSBudW1iZXIgb2Ygc2VydmljZXMgaW5jcmVhc2VkIGZyb20gNjQgdG8gMjU2IHdoZW4gcG9sbCgpIGlzIHVzZWQuCisKK1ZlcnNpb24gNC4xNSwgMjAwNi4wMy4xMSwgdXJnZW5jeTogTE9XOgorKiBSZWxlYXNlIG5vdGVzCisgIC0gVGhlcmUgYXJlIGEgbG90IG9mIG5ldyBmZWF0dXJlcyBpbiB0aGlzIHZlcnNpb24uICBJIHJlY29tbWVuZAorICAgIHRvIHRlc3QgaXQgd2VsbCBiZWZvcmUgdXBncmFkaW5nIHlvdXIgbWlzc2lvbi1jcml0aWNhbCBzeXN0ZW1zLgorKiBCdWdmaXhlcworICAtIEZpeCBmb3IgcHRocmVhZHMgb24gU29sYXJpcyAxMC4KKyAgLSBBdHRlbXB0IHRvIGF1dG9kZXRlY3Qgc29ja2xlbl90IHR5cGUgaW4gY29uZmlndXJlIHNjcmlwdC4KKyAgLSBEZWZhdWx0IHRocmVhZGluZyBtb2RlbCBjaGFuZ2VkIHRvIHB0aHJlYWQgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4KKyAgLSBESCBwYXJhbWV0ZXJzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNlcnRpZmljYXRlIGJ5IGRlZmF1bHQuCisqIE5ldyBmZWF0dXJlcyBzcG9uc29yZWQgYnkgU29mdHdhcmUgSG91c2UgaHR0cDovL3d3dy5zd2hvdXNlLmNvbS8KKyAgLSBNb3N0IFNTTC1yZWxhdGVkIG9wdGlvbnMgKGluY2x1ZGluZyBjbGllbnQsIGNlcnQsIGtleSkgYXJlIG5vdworICAgIGF2YWlsYWJsZSBvbiBzZXJ2aWNlLWxldmVsLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGFuIFNTTAorICAgIGNsaWVudCBhbmQgYW4gU1NMIHNlcnZlciBpbiBhIHNpbmdsZSBzdHVubmVsIHByb2Nlc3MuCisgIC0gV2luZG93cyBDRSAodmVyc2lvbiAzLjAgYW5kIGhpZ2hlcikgc3VwcG9ydC4KKyogTmV3IGZlYXR1cmVzCisgIC0gQ2xpZW50IG1vZGUgQ09OTkVDVCBwcm90b2NvbCBzdXBwb3J0IChSRkMgMjgxNyBzZWN0aW9uIDUuMikuCisgICAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgxNy50eHQKKyAgLSBSZXRyeWluZyBleGVjK2Nvbm5lY3Qgc2VydmljZXMgYWRkZWQuCisqIEZpbGUgbG9jYXRpb25zIGFyZSBtb3JlIGNvbXBsaWFudCB0byBGaWxlc3lzdGVtIEhpZXJhcmNoeSBTdGFuZGFyZCAyLjMKKyAgLSBjb25maWd1cmF0aW9uIGFuZCBjZXJ0aWZpY2F0ZXMgYXJlIGluICRwcmVmaXgvZXRjL3N0dW5uZWwvCisgIC0gYmluYXJpZXMgYXJlIGluICRwcmVmaXgvc2Jpbi8KKyAgLSBkZWZhdWx0IHBpZCBmaWxlIGlzICRwcmVmaXgvdmFyL3J1bi9zdHVubmVsLnBpZAorICAtIG1hbnVhbCBpcyAkcHJlZml4L21hbi9tYW44L3N0dW5uZWwuOAorICAtIG90aGVyIGRvY3MgYXJlIGluICRwcmVmaXgvc2hhcmUvZG9jL3N0dW5uZWwvCisgIC0gbGlic3R1bm5lbCBpcyBpbiAkcHJlZml4L2xpYgorICAtIGNocm9vdCBkaXJlY3RvcnkgaXMgc2V0dXAgaW4gJHByZWZpeC92YXIvbGliL3N0dW5uZWwvCisgICAgdGhpcyBkaXJlY3RvcnkgaXMgY2htb2RlZCAxNzcwIGFuZCBncm91cCBub2dyb3VwCisKK1ZlcnNpb24gNC4xNCwgMjAwNS4xMS4wMiwgdXJnZW5jeTogSElHSDoKKyogQnVnZml4ZXMKKyAgLSB0cmFuc2ZlcigpIGZpeGVkIHRvIGF2b2lkIHJhbmRvbSBzdGFsbHMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDQuMTIuCisgIC0gcG9sbCgpIGVycm9yIGhhbmRpbmcgYnVnIGZpeGVkLgorICAtIENoZWNraW5nIGZvciBkeW5hbWljIGxvYWRlciBsaWJyYXJpZXMgYWRkZWQgYWdhaW4uCisgIC0gRGVmYXVsdCBwaWRmaWxlIGNoYW5nZWQgZnJvbSAkbG9jYWxzdGF0ZWRpci9ydW4vc3R1bm5lbC5waWQKKyAgICB0byAkbG9jYWxzdGF0ZWRpci9zdHVubmVsL3N0dW5uZWwucGlkLgorICAtIEJhc2ljIFNTTCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgZXhlY3V0aW9uLgorKiBSZWxlYXNlIG5vdGVzCisgIC0gVGhpcyBpcyBhbiBpbXBvcnRhbnQgYnVnZml4IHJlbGVhc2UuICBVcGdyYWRlIGlzIHJlY29tbWVuZGVkLgorCitWZXJzaW9uIDQuMTMsIDIwMDUuMTAuMjEsIHVyZ2VuY3k6IE1FRElVTToKKyogRExMcyBmb3IgT3BlblNTTCAwLjkuN2kgaW5jbHVkZWQgYmVjYXVzZSBwcm90ZWN0aW9uIGZhdWx0cyB3ZXJlIHJlcG9ydGVkCisgIGluIDAuOS44IGFuZCAwLjkuOGEuCisqIE5ldyBmZWF0dXJlcworICAtIExpYndyYXAgY29kZSBpcyBleGVjdXRlZCBhcyBhIHNlcGFyYXRlIHByb2Nlc3MgKG5vIG1vcmUgZGVsYXlzIGR1ZQorICAgIHRvIGEgZ2xvYmFsIGFuZCBwb3RlbnRpYWxseSBsb25nIGNyaXRpY2FsIHNlY3Rpb24pLgorKiBCdWdmaXhlcworICAtIFByb2JsZW0gd2l0aCB6b21iaWVzIGluIFVDT05URVhUIHRocmVhZGluZyBmaXhlZC4KKyAgLSBXb3JrYXJvdW5kIGZvciBub24tc3RhbmRhcmQgbWFrZWNvbnRleHQoKSB1Y19zdGFjay5zc19zcCBwYXJhbWV0ZXIKKyAgICBzZW1hbnRpY3Mgb24gU0dJIElSSVguCisgIC0gUHJvdGVjdGlvbiBmYXVsdCBpbiBzaWduYWxzIGhhbmRsaW5nIG9uIElSSVggZml4ZWQuCisgIC0gUHJvYmxlbSBmaW5kaW5nIHB0aHJlYWQgbGlicmFyeSBvbiBBSVggZml4ZWQuCisgIC0gc2l6ZV90IHByaW50ZigpIGZpeGVkIGluIHN0YWNrX2luZm8oKSAodGhlIHByZXZpb3VzIGZpeCBkaWRuJ3Qgd29yaykuCisgIC0gc29ja2xlbl90IGlzIHVzZWQgaW5zdGVhZCBvZiBpbnQgd2hlcmUgcmVxdWlyZWQuCisKK1ZlcnNpb24gNC4xMiwgMjAwNS4wOS4yOSwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBXaW4zMiBpbnN0YWxsZXIgYWRkZWQuCisgIC0gTmV3IFdpbjMyIGNvbW1hbmRsaW5lIG9wdGlvbnM6IC1zdGFydCBhbmQgLXN0b3AuCisgIC0gTG9nIGxldmVsIGFuZCB0aHJlYWQgbnVtYmVyIGFyZSByZXBvcnRlZCB0byBzeXNsb2cuCisgIC0gRExMcyBmb3IgT3BlblNTTCAwLjkuOC4KKyAgLSBzdHVubmVsLnNwZWMgdXBkYXRlZCBieSBuZWVvIDxuZWVvQGlyYy5wbD4uCisqIEJ1Z2ZpeGVzCisgIC0gVXNlIG9mIGJyb2tlbiBwb2xsKCkgaXMgZGlzYWJsZWQgb24gTWFjIE9TIFguCisgIC0gWWV0IGFub3RoZXIgdHJhbnNmZXIoKSBpbmZpbml0ZSBsb29wIGNvbmRpdGlvbiBmaXhlZC4KKyAgLSBXb3JrYXJvdW5kIGZvciBhIHNlcmlvdXMgTSQgYnVnIChLQjE3NzM0NikuCisgIC0gSVB2NiBETExzIGFsbG9jYXRpb24gcHJvYmxlbSByZXN1bHRpbmcgaW4gR1BGIG9uIFcySyBmaXhlZC4KKyAgLSB6bGliIGFkZGVkIHRvIHNoYXJlZCBsaWJyYXJpZXMgKE9wZW5TU0wgbWF5IG5lZWQgaXQpLgorICAtIHNpemVfdCBwcmludGYoKSBmaXhlZCBpbiBzdGFja19pbmZvKCkuCisqIFJlbGVhc2Ugbm90ZXMKKyAgLSBUaGlzIGlzIGEgYnVnZml4IHJlbGVhc2UuICBVcGdyYWRlIGlzIHJlY29tbWVuZGVkLgorCitWZXJzaW9uIDQuMTEsIDIwMDUuMDcuMDksIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmVzCisgIC0gTmV3IC4vY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtdGhyZWFkcyB0byBzZWxlY3QgdGhyZWFkIG1vZGVsLgorICAtIC4vY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtdGNwLXdyYXBwZXJzIHJlbmFtZWQgdG8gLS1kaXNhYmxlLWxpYndyYXAuCisgICAgSSBob3BlIHRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb24gaXMgbXVjaCBtb3JlIGNsZWFyLCBub3cuCisqIEJ1Z2ZpeGVzCisgIC0gV29ya2Fyb3VuZCBmb3Igbm9uLXN0YW5kYXJkIG1ha2Vjb250ZXh0KCkgdWNfc3RhY2suc3Nfc3AgcGFyYW1ldGVyCisgICAgc2VtYW50aWNzIG9uIFNwYXJjL1NvbGFyaXMgOSBhbmQgZWFybGllci4KKyAgLSBzY2FuX3dhaXRpbmdfcXVldWUoKSBubyBsb25nZXIgZHJvcHMgY29udGV4dHMuCisgIC0gSW5ldGQgbW9kZSBHUEZzIHdpdGggVUNPTlRFWFQgZml4ZWQuCisgIC0gQ2xlYW51cCBjb250ZXh0IGlzIG5vIGxvbmdlciB1c2VkLgorICAtIFJlbGVhc2luZyBtZW1vcnkgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBkZWxheWVkLgorICAtIFdpbjMyIGhlYWRlcnMgcmVvcmRlcmVkIGZvciBWaXN1YWwgU3R1ZGlvIDcuCisgIC0gU29tZSBTb2xhcmlzIGNvbXBpbGF0aW9uIHdhcm5pbmdzIGZpeGVkLgorICAtIFJlamVjdGVkIGluZXRkIG1vZGUgd2l0aG91dCAnY29ubmVjdCcgb3IgJ2V4ZWMnLgorKiBSZWxlYXNlIG5vdGVzCisgIC0gVUNPTlRFWFQgdGhyZWFkaW5nIHNlZW1zIHN0YWJsZSwgbm93LiAgVXBncmFkZSBpcyByZWNvbW1lbmRlZC4KKworVmVyc2lvbiA0LjEwLCAyMDA1LjA0LjIzLCB1cmdlbmN5OiBMT1cvRVhQRVJJTUVOVEFMOgorKiBETExzIGZvciBPcGVuU1NMIDAuOS43Zy4KKyogQnVnZml4ZXMKKyAgLSBNaXNzaW5nIGxvY2tpbmcgb24gV2luMzIgcGxhdGZvcm0gd2FzIGFkZGVkICh0aHggdG8gWWkgTGluCisgICAgPHlpLmxpbkBjb252ZXJneXMuY29tPikKKyAgLSBTb21lIHByb2JsZW1zIHdpdGggY2xvc2luZyBTU0wgZml4ZWQuCisqIE5ldyBmZWF0dXJlcworICAtIE5ldyBVQ09OVEVYVCB1c2VyLWxldmVsIG5vbi1wcmVlbXB0aXZlIHRocmVhZHMgbW9kZWwgaXMgdXNlZAorICAgIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IFNZU1YtY29tcGF0aWJsZSB1Y29udGV4dC5oLgorICAtIEltcHJvdmVkIHN0dW5uZWwzIHNjcmlwdCB3aXRoIGdldG9wdC1jb21wYXRpYmxlIHN5bnRheC4KKyogUmVsZWFzZSBub3RlcworICAtIFRoaXMgdmVyc2lvbiBzaG91bGQgYmUgdGhvcm91Z2hseSB0ZXN0ZWQgYmVmb3JlIHVzaW5nIGl0IGluIHRoZQorICAgIG1pc3Npb24tY3JpdGljYWwgZW52aXJvbm1lbnQuCisKK1ZlcnNpb24gNC4wOSwgMjAwNS4wMy4yNiwgdXJnZW5jeTogTUVESVVNOgorKiBETExzIGZvciBPcGVuU1NMIDAuOS43Zi4KKyogQnVnZml4ZXMKKyAgLSBDb21waWxhdGlvbiBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCBzb2NrbGVuX3QgZml4ZWQuCisgIC0gVElNRU9VVGNsb3NlIGlzIG5vdCB1c2VkIHdoZW4gdGhlcmUgaXMgYW55IGRhdGEgaW4gdGhlIGJ1ZmZlcnMuCisgIC0gU3R1bm5lbCBubyBsb25nZXIgcmVsaWVzIG9uIGNsb3NlX25vdGlmeSB3aXRoIFNTTCAyLjAgY29ubmVjdGlvbnMsCisgICAgc2luY2UgU1NMIDIuMCBwcm90b2NvbCBkb2VzIG5vdCBoYXZlIGFueSBhbGVydHMgZGVmaW5lZC4KKyAgLSBDbG9zaW5nIFNTTCBzb2NrZXQgd2hlbiB0aGVyZSBpcyBzb21lIGRhdGEgaW4gU1NMIG91dHB1dCBidWZmZXIKKyAgICBpcyBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgYXMgYW4gZXJyb3IuCisgIC0gSW5zdGFsbC9jaG1vZCByYWNlIGNvbmRpdGlvbiB3aGVuIGluc3RhbGxpbmcgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBmaXhlZC4KKyAgLSBTdHVubmVsIG5vIGxvbmdlciBpbnN0YWxscyBzaWduYWxfaGFuZGxlciBvbiBpZ25vcmVkIHNpZ25hbHMuCisKK1ZlcnNpb24gNC4wOCwgMjAwNS4wMi4yNywgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMKKyAgLSBOZXcgLXF1aWV0IG9wdGlvbiB3YXMgYWRkZWQgdG8gaW5zdGFsbCBOVCBzZXJ2aWNlIHdpdGhvdXQgYSBtZXNzYWdlIGJveC4KKyogQnVnZml4ZXMKKyAgLSBVc2luZyAkKERFU1RESVIpIGluIHRvb2xzL01ha2VmaWxlLmFtLgorICAtIERlZmluZSBOSV9OVU1FUklDSE9TVCBhbmQgTklfTlVNRVJJQ1NFUlYgd2hlbiBuZWVkZWQuCisgIC0gTGVuZ3RoIG9mIGNvbmZpZ3VyYXRpb24gZmlsZSBsaW5lIGluY3JlYXNlZCBmcm9tIDI1NkIgdG8gMTZLQi4KKyAgLSBTdHVubmVsIHNlbmRzIGNsb3NlX25vdGlmeSB3aGVuIGEgY2xvc2Vfbm90aWZ5IGlzIHJlY2VpdmVkIGZyb20gU1NMCisgICAgcGVlciBhbmQgYWxsIHJlbWFpbmluZyBkYXRhIGlzIHNlbnQgdG8gU1NMIHBlZXIuCisgIC0gU29tZSBmaXhlcyBmb3IgYnVncyBkZXRlY3RlZCBieSB0aGUgd2F0Y2hkb2cuCisqIFJlbGVhc2Ugbm90ZXMKKyAgLSBUaGVyZSB3ZXJlIG1hbnkgY2hhbmdlcyBpbiB0aGUgdHJhbnNmZXIoKSBmdW5jdGlvbiAodGhlIG1haW4gbG9vcCkuCisgIC0gVGhpcyB2ZXJzaW9uIHNob3VsZCBiZSB0aG9yb3VnaGx5IHRlc3RlZCBiZWZvcmUgdXNpbmcgaXQgaW4gdGhlCisgICAgbWlzc2lvbi1jcml0aWNhbCBlbnZpcm9ubWVudC4KKworVmVyc2lvbiA0LjA3LCAyMDA1LjAxLjAzLCB1cmdlbmN5OiBNRURJVU06CisqIEJ1Z2ZpeGVzCisgIC0gUHJvYmxlbSB3aXRoIGluZmluaXRlIHBvbGwoKSB0aW1lb3V0IG5lZ2F0aXZlLCBidXQgbm90IGVxdWFsIHRvIC0xIGZpeGVkLgorICAtIFByb2JsZW0gd2l0aCBhIGZpbGUgZGVzY3JpcHRvciByZWFkeSB0byBiZSByZWFkIGp1c3QgYWZ0ZXIgYSBub24tYmxvY2tpbmcKKyAgICBjb25uZWN0IGNhbGwgZml4ZWQuCisgIC0gQ29tcGlsZSBlcnJvciB3aXRoIEVBSV9OT0RBVEEgbm90IGRlZmluZWQgb3IgZXF1YWwgdG8gRUFJX05PTkFNRSBmaXhlZC4KKyAgLSBJUCBhZGRyZXNzIGFuZCBUQ1AgcG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGxlbmd0aCAoSVBMRU4pIGluY3JlYXNlZAorICAgIHRvIDEyOCBieXRlcy4KKyAgLSBPcGVuU1NMIGVuZ2luZSBzdXBwb3J0IGlzIG9ubHkgdXNlZCBpZiBlbmdpbmUuaCBoZWFkZXIgZmlsZSBleGlzdHMuCisgIC0gQnJva2VuIE5UIFNlcnZpY2UgbW9kZSBvbiBXaW4zMiBwbGF0Zm9ybSBmaXhlZC4KKyAgLSBTdXBwb3J0IGZvciBJUHY0LW9ubHkgV2luMzIgbWFjaGluZXMgcmVzdG9yZWQuCisKK1ZlcnNpb24gNC4wNiwgMjAwNC4xMi4yNiwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZSBzcG9uc29yZWQgYnkgU1VSRm5ldCBodHRwOi8vd3d3LnN1cmZuZXQubmwvCisgIC0gSVB2NiBzdXBwb3J0ICh0byBiZSBlbmFibGVkIHdpdGggLi9jb25maWd1cmUgLS1lbmFibGUtaXB2NikuCisqIE5ldyBmZWF0dXJlcworICAtIHBvbGwoKSBzdXBwb3J0IC0gbm8gbW9yZSBGRF9TRVRTSVpFIGxpbWl0IQorICAtIE11bHRpcGxlIGNvbm5lY3Q9aG9zdDpwb3J0IG9wdGlvbnMgYXJlIGFsbG93ZWQgaW4gYSBzaW5nbGUgc2VydmljZQorICAgIHNlY3Rpb24uICBSZW1vdGUgaG9zdHMgYXJlIGNvbm5lY3RlZCB1c2luZyByb3VuZC1yb2JpbiBhbGdvcml0aG0uCisgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggZGVsYXllZCByZXNvbHZlci4KKyAgLSBOZXcgJ2NvbXByZXNzaW9uJyBvcHRpb24gdG8gZW5hYmxlIGNvbXByZXNzaW9uLiAgVG8gdXNlIHpsaWIKKyAgICBhbGdvcml0aG0geW91IGhhdmUgdG8gZW5hYmxlIGl0IHdoZW4gYnVpbGRpbmcgT3BlblNTTCBsaWJyYXJ5LgorICAtIE5ldyAnZW5naW5lJyBvcHRpb24gdG8gc2VsZWN0IGEgaGFyZHdhcmUgZW5naW5lLgorICAtIE5ldyAnVElNRU9VVGNvbm5lY3QnIG9wdGlvbiB3aXRoIDEwIHNlY29uZHMgZGVmYXVsdCBhZGRlZC4KKyAgLSBzdHVubmVsMyBwZXJsIHNjcmlwdCB0byBlbXVsYXRlIHZlcnNpb24gMy54IGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAtIEZyZW5jaCBtYW51YWwgdXBkYXRlZCBieSBCZXJuYXJkIENob3BweSA8Y2hvcHB5IEFUIGZyZWUgUE9JTlQgZnI+LgorICAtIEEgd2F0Y2hkb2cgdG8gZGV0ZWN0IHRyYW5zZmVyKCkgaW5maW5pdGUgbG9vcHMgYWRkZWQuCisgIC0gQ29uZmlndXJhdGlvbiBmaWxlIGNvbW1lbnQgY2hhcmFjdGVyIGNoYW5nZWQgZnJvbSAnIycgdG8gJzsnLgorICAgICcjJyB3aWxsIHN0aWxsIGJlIHJlY29nbml6ZWQgdG8ga2VlcCBjb21wYXRpYmlsaXR5LgorICAtIE1ULXNhZmUgZ2V0YWRkcmluZm8oKSBhbmQgZ2V0bmFtZWluZm8oKSBhcmUgdXNlZCB3aGVyZSBhdmFpbGFibGUKKyAgICB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIHJlc29sdmVyIGNhbGxzLgorICAtIEF1dG9tYWtlIHVwZ3JhZGVkIGZyb20gMS40LXA0IHRvIDEuNy45LgorKiBCdWdmaXhlcworICAtIGxvZygpIGNoYW5nZWQgdG8gc19sb2coKSB0byBhdm9pZCBjb25mbGljdHMgb24gc29tZSBzeXN0ZW1zLgorICAtIENvbW1vbiBDUklUX0lORVQgY3JpdGljYWwgc2VjdGlvbiBpbnRyb2R1Y2VkIGluc3RlYWQgb2Ygc2VwYXJhdGUKKyAgICBDUklUX05UT0EgYW5kIENSSVRfUkVTT0xWRVIgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIHdpdGgKKyAgICBsaWJ3cmFwIChUQ1AgV3JhcHBlcnMpIGxpYnJhcnkuCisgIC0gQ3JlYXRlVGhyZWFkKCkgZmluYWxseSByZXBsYWNlZCB3aXRoIF9iZWdpbnRocmVhZCgpIG9uIFdpbjMyLgorICAtIG1ha2UgaW5zdGFsbCBjcmVhdGVzICQobG9jYWxzdGF0ZWRpcikvc3R1bm5lbC4KKyAgICAkKGxvY2Fsc3RhdGVkaXIpL3N0dW5uZWwvZGV2L3plcm8gaXMgYWxzbyBjcmVhdGVkIG9uIFNvbGFyaXMuCisgIC0gUmFjZSBjb25kaXRpb24gd2l0aCBjbGllbnQgc2Vzc2lvbiBjYWNoZSBmaXhlZC4KKyAgLSBPdGhlciBtaW5vciBidWdmaXhlcy4KKyogUmVsZWFzZSBub3RlcworICAtIFdpbjMyIHBvcnQgcmVxdWlyZXMgV2luc29jazIgdG8gd29yay4KKyAgICBTb21lIFdpbjk1IHN5c3RlbXMgbWF5IG5lZWQgYSBmcmVlIHVwZGF0ZSBmcm9tIE1pY3Jvc29mdC4KKyAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93czk1L2Rvd25sb2Fkcy8KKyAgLSBEZWZhdWx0IGlzICpub3QqIHRvIHVzZSBJUHY2ICc6OicgZm9yIGFjY2VwdCBhbmQgJzo6MScgZm9yCisgICAgY29ubmVjdC4gIEZvciBleGFtcGxlIHRvIGFjY2VwdCBwb3AzcyBvbiBJUHY2IHlvdSBjb3VsZCB1c2U6CisgICAgJ2FjY2VwdCA9IDo6Ojk5NScuICBJIGhvcGUgdGhlIG5ldyBzeW50YXggaXMgY2xlYXIgZW5vdWdoLgorCitWZXJzaW9uIDQuMDUsIDIwMDQuMDIuMTQsIHVyZ2VuY3k6IE1FRElVTToKKyogTmV3IGZlYXR1cmUgc3BvbnNvcmVkIGJ5IFNVUkZuZXQgaHR0cDovL3d3dy5zdXJmbmV0Lm5sLworICAtIFN1cHBvcnQgZm9yIENJRlMgYWthIFNNQiBwcm90b2NvbCBTU0wgbmVnb3RpYXRpb24uCisqIE5ldyBmZWF0dXJlcworICAtIENSTCBzdXBwb3J0IHdpdGggbmV3IENSTHBhdGggYW5kIENSTGZpbGUgZ2xvYmFsIG9wdGlvbnMuCisgIC0gTmV3ICd0YXNrYmFyJyBvcHRpb24gb24gV2luMzIgKHRoeCB0byBLZW4gTWF0dHNlbgorICAgIDxrZW4uTWF0dHNlbkByb3hpby5jb20+KS4KKyAgLSBOZXcgLWZkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgdG8gcmVhZCBjb25maWd1cmF0aW9uCisgICAgZnJvbSBhIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBhIGZpbGUuCisgIC0gYWNjZXB0IGlzIHJlcG9ydGVkIGFzIGVycm9yIHdoZW4gbm8gJ1tzZWN0aW9uXScgaXMKKyAgICBkZWZpbmVkIChpbiBzdHVubmVsIDQuMDQgaXQgd2FzIHNpbGVudGx5IGlnbm9yZWQgY2F1c2luZworICAgIHByb2JsZW1zIGZvciBsdXNlcnMgd2hvIGRpZCBub3QgcmVhZCB0aGUgZmluZSBtYW51YWwpLgorICAtIFVzZSBmY250bCgpIGluc3RlYWQgb2YgaW9jdGxzb2NrZXQoKSB0byBzZXQgc29ja2V0CisgICAgbm9uYmxvY2tpbmcgd2hlcmUgaXQgaXMgc3VwcG9ydGVkLgorICAtIEJhc2ljIHN1cHBvcnQgZm9yIGhhcmR3YXJlIGVuZ2luZXMgd2l0aCBPcGVuU1NMID49IDAuOS43LgorICAtIEZyZW5jaCBtYW51YWwgYnkgQmVybmFyZCBDaG9wcHkgPGNob3BweUBpbWFnaW5ldC5mcj4uCisgIC0gVGhyZWFkIHN0YWNrIHNpemUgcmVkdWNlZCB0byA2NEtCIGZvciBtYXhpbXVtIHNjYWxhYmlsaXR5LgorICAtIEFkZGVkIG9wdGlvbmFsIGNvZGUgdG8gZGVidWcgdGhyZWFkIHN0YWNrIHVzYWdlLgorICAtIFN1cHBvcnQgZm9yIG5zci10YW5kZW0tbnNrICh0aHggdG8gVG9tIEJhdGVzIDx0b20uYmF0ZXNAaHAuY29tPikuCisqIEJ1Z2ZpeGVzCisgIC0gVENQIHdyYXBwZXJzIGNvZGUgbW92ZWQgdG8gQ1JJVF9OVE9BIGNyaXRpY2FsIHNlY3Rpb24KKyAgICBzaW5jZSBpdCB1c2VzIHN0YXRpYyBpbmV0X250b2EoKSByZXN1bHQgYnVmZmVyLgorICAtIFNTTF9FUlJPUl9TWVNDQUxMIGhhbmRsaW5nIHByb2JsZW1zIGZpeGVkLgorICAtIGFkZGVkIGNvZGUgdG8gcmV0cnkgbm9uYmxvY2tpbmcgU1NMX3NodXRkb3duKCkgY2FsbHMuCisgIC0gVXNlIEZEX1NFVFNJWkUgaW5zdGVhZCBvZiAxNiBmaWxlIGRlc2NyaXB0b3JzIGluIGluZXRkCisgICAgbW9kZS4KKyAgLSBmZHNjYW5mIGdyb2tzIGxvd2VyY2FzZSBwcm90b2NvbCBuZWdvdGlhdGlvbiBjb21tYW5kcy4KKyAgLSBXaW4zMiB0YXNrYmFyIEdESSBvYmplY3RzIGxlYWsgZml4ZWQuCisgIC0gTGlid3JhcCBkZXRlY3Rpb24gYnVnIGluIC4vY29uZmlndXJlIHNjcmlwdCBmaXhlZC4KKyAgLSBncnAuaCBoZWFkZXIgZGV0ZWN0aW9uIGZpeGVkIGZvciBOZXRCU0QgYW5kIHBvc3NpYmx5CisgICAgb3RoZXIgc3lzdGVtcy4KKyAgLSBTb21lIG90aGVyIG1pbm9yIHVwZGF0ZXMuCisKK1ZlcnNpb24gNC4wNCwgMjAwMy4wMS4xMiwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgZmVhdHVyZSBzcG9uc29yZWQgYnkgU1VSRm5ldCBodHRwOi8vd3d3LnN1cmZuZXQubmwvCisgIC0gRW5jcnlwdGVkIHByaXZhdGUga2V5IGNhbiBiZSB1c2VkIHdpdGggV2luMzIgR1VJLgorKiBOZXcgZmVhdHVyZXMKKyAgLSBOZXcgJ29wdGlvbnMnIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIHNldHVwCisgICAgT3BlblNTTCBsaWJyYXJ5IGhhY2tzIHdpdGggU1NMX0NUWF9zZXRfb3B0aW9ucygpLgorICAtICdzZXJ2aWNlJyBvcHRpb24gYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIGZvcgorICAgIFRDUCBXcmFwcGVycyBhY2Nlc3MgY29udHJvbCBpbiBpbmV0ZCBtb2RlLgorICAtIFN1cHBvcnQgZm9yIEJlT1MgKHRoeCB0byBNaWtlIEkuIEtvemluIDxtaWtAc2Jvci5uZXQ+KQorICAtIFNTTCBpcyBuZWdvdGlhdGVkIGJlZm9yZSBjb25uZWN0aW5nIHJlbW90ZSBob3N0CisgICAgb3Igc3Bhd25pbmcgbG9jYWwgcHJvY2VzcyB3aGVuZXZlciBwb3NzaWJsZS4KKyAgLSBSRU1PVEVfSE9TVCB2YXJpYWJsZSBpcyBhbHdheXMgcGxhY2VkIGluIHRoZQorICAgIGVucml2b25tZW50IG9mIGEgcHJvY2VzcyBzcGF3bmVkIHdpdGggJ2V4ZWMnLgorICAtIFdob2xlIFNTTCBlcnJvciBzdGFjayBpcyBkdW1wZWQgb24gZXJyb3JzLgorICAtICdtYWtlIGNlcnQnIHJ1bGUgaXMgYmFjayAod2FzIG1pc3Npbmcgc2luY2UgNC4wMCkuCisgIC0gTWFudWFsIHBhZ2UgdXBkYXRlZCAoc3BlY2lhbCB0aGFua3MgdG8gQnJpYW4gSGF0Y2gpLgorICAtIFRPRE8gdXBkYXRlZC4KKyogQnVnZml4ZXMKKyAgLSBNYWpvciBjb2RlIGNsZWFudXAgKHRoeCB0byBTdGV2ZSBHcnViYiA8bGludXhfNGV2ZXJAeWFob28uY29tPikuCisgIC0gVW5zYWZlIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZCBmcm9tIFNJR0NITEQgaGFuZGxlci4KKyAgLSBTZXZlcmFsIGJ1Z3MgaW4gYXV0aF91c2VyKCkgZml4ZWQuCisgIC0gSW5jb3JyZWN0IHBvcnQgd2hlbiB1c2luZyAnbG9jYWwnIG9wdGlvbiBmaXhlZC4KKyAgLSBPcGVuU1NMIHRvb2xzICctcmFuZCcgb3B0aW9uIGlzIG5vIGxvbmdlciBkaXJlY3RseQorICAgIHVzZWQgd2l0aCBhIGRldmljZSAobGlrZSAnL2Rldi91cmFuZG9tJykuCisgICAgVGVtcG9yYXJ5IHJhbmRvbSBmaWxlIGlzIGNyZWF0ZWQgd2l0aCAnZGQnIGluc3RlYWQuCisqIERMTHMgZm9yIE9wZW5TU0wgMC45LjcuCisKK1ZlcnNpb24gNC4wMywgMjAwMi4xMC4yNywgdXJnZW5jeTogSElHSDoKKyogTlQgU2VydmljZSAoYnJva2VuIHNpbmNlIDQuMDEpIGlzIG9wZXJhdGlvbmFsIGFnYWluLgorKiBNZW1vcnkgbGVhayBpbiBGT1JLIGVudmlyb25tZW50cyBmaXhlZC4KKyogc2lncHJvY21hc2soKSBtaXN0YWtlIGNvcnJlY3RlZC4KKyogc3RydWN0IHRpbWV2YWwgaXMgcmVpbml0aWFsaXplZCBiZWZvcmUgc2VsZWN0KCkuCisqIEVBR0FJTiBoYW5kbGVkIGluIGNsaWVudC5jIGZvciBBSVguCisqIE1hbnVhbCBwYWdlIHVwZGF0ZWQuCisKK1ZlcnNpb24gNC4wMiwgMjAwMi4xMC4yMSwgdXJnZW5jeTogSElHSDoKKyogU2VyaW91cyBidWcgaW4gRUNPTk5SRVNFVCBoYW5kbGluZyBmaXhlZC4KKworVmVyc2lvbiA0LjAxLCAyMDAyLjEwLjIwLCB1cmdlbmN5OiBNRURJVU06CisqIE5ldyBmZWF0dXJlcworICAtIE9wZW5WTVMgc3VwcG9ydC4KKyAgLSBQb2xpc2ggbWFudWFsIGFuZCBzb21lIG1hbnVhbCB1cGRhdGVzLgorICAtICdzZXJ2aWNlJyBvcHRpb24gYWRkZWQgb24gV2luMzIgcGxhdGZvcm0uCisgIC0gT2Jzb2xldGUgRkFRIGhhcyBiZWVuIHJlbW92ZWQuCisgIC0gTG9nIGZpbGUgaXMgY3JlYXRlZCB3aXRoIDA2NDAgbW9kZS4KKyAgLSBleGVjLT5jb25uZWN0IHNlcnZpY2Ugc2VjdGlvbnMgKG5lZWQgbW9yZSB0ZXN0aW5nKS4KKyogQnVnZml4ZXMKKyAgLSBFSU5UUiBpbmdvcmVkIGluIG1haW4gc2VsZWN0KCkgbG9vcC4KKyAgLSBGaXhlZCBwcm9ibGVtIHdpdGggc3R1bm5lbCBjbG9zaW5nIGNvbm5lY3Rpb25zIG9uCisgICAgVElNRU9VVGNsb3NlIGJlZm9yZSBhbGwgdGhlIGRhdGEgaXMgc2VudC4KKyAgLSBGaXhlZCBFV09VTERCTE9DSyBvbiB3cml0ZXNvY2tldCBwcm9ibGVtLgorICAtIFBvdGVudGlhbCBET1MgaW4gV2luMzIgR1VJIGZpeGVkLgorICAtIFNvbGFyaXMgY29tcGlsYXRpb24gcHJvYmxlbSBmaXhlZC4KKyAgLSBMaWJ0b29sIGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMgZml4ZWQuCisgIC0gU2lnbmFsIG1hc2sgaXMgY2xlYXJlZCBqdXN0IGJlZm9yZSBleGVjIGluIGxvY2FsIG1vZGUuCisgIC0gQWNjZXB0aW5nIHNvY2tldHMgYW5kIGxvZyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBubyBsb25nZXIKKyAgICBsZWFrZWQgdG8gdGhlIGNoaWxkIHByb2Nlc3Nlcy4KK1NwZWNpYWwgdGhhbmtzIHRvIFN0ZXZlIEdydWJiIGZvciB0aGUgc291cmNlIGNvZGUgYXVkaXQuCisKK1ZlcnNpb24gNC4wMCwgMjAwMi4wOC4zMCwgdXJnZW5jeTogTE9XOgorKiBOZXcgZmVhdHVyZXMgc3BvbnNvcmVkIGJ5IE1BWElNVVMgaHR0cDovL3d3dy5tYXhpbXVzLmNvbS8KKyAgLSBOZXcgdXNlciBpbnRlcmZhY2UgKGNvbmZpZyBmaWxlKS4KKyAgLSBTaW5nbGUgZGFlbW9uIGNhbiBsaXN0ZW4gb24gbXVsdGlwbGUgcG9ydHMsIG5vdy4KKyAgLSBOYXRpdmUgV2luMzIgR1VJIGFkZGVkLgorICAtIE5hdGl2ZSBOVC8yMDAwL1hQIHNlcnZpY2UgYWRkZWQuCisgIC0gRGVsYXllZCBETlMgbG9va3VwIGFkZGVkLgorKiBPdGhlciBuZXcgZmVhdHVyZXMKKyAgLSBBbGwgdGhlIHRpbWVvdXRzIGFyZSBub3cgY29uZmlndXJhYmxlIGluY2x1ZGluZworICAgIFRJTUVPVVRjbG9zZSB0aGF0IGNhbiBiZSBzZXQgdG8gMCBmb3IgTVNJRSBhbmQgb3RoZXIKKyAgICBidWdneSBjbGllbnRzIHRoYXQgZG8gbm90IHNlbmQgY2xvc2Vfbm90aWZ5LgorICAtIFN0dW5uZWwgcHJvY2VzcyBjYW4gYmUgY2hyb290ZWQgaW4gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorICAtIE51bWVyaWNhbCB2YWx1ZXMgZm9yIHNldHVpZCgpIGFuZCBzZXRnaWQoKSBhcmUgYWxsb3dlZCwgbm93LgorICAtIENvbmZ1c2luZyBjb2RlIGZvciBzZXR0aW5nIGNlcnRpZmljYXRlIGRlZmF1bHRzIGludHJvZHVjZWQgaW4KKyAgICB2ZXJzaW9uIDMuOHAzIHdhcyByZW1vdmVkIHRvIHNpbXBsaWZ5IHN0dW5uZWwgc2V0dXAuCisgICAgVGhlcmUgYXJlIG5vIGJ1aWx0LWluIGRlZmF1bHRzIGZvciBDQXBhdGggYW5kIENBZmlsZSBvcHRpb25zLgorICAtIFByaXZhdGUga2V5IGZpbGUgZm9yIGEgY2VydGlmaWNhdGUgY2FuIGJlIGtlcHQgaW4gYSBzZXBhcmF0ZQorICAgIGZpbGUuICBEZWZhdWx0IHJlbWFpbnMgdG8ga2VlcCBpdCBpbiB0aGUgY2VydCBmaWxlLgorICAtIE1hbnVhbCBwYWdlIHVwZGF0ZWQuCisgIC0gTmV3IEZIUy1jb21wYXRpYmxlIGJ1aWxkIHN5c3RlbSBiYXNlZCBvbiBhdXRvbWFrZSBhbmQgbGlidG9vbC4KKyogQnVnZml4ZXMKKyAgLSBgU1NMIHNvY2tldCBjbG9zZWQgb24gU1NMX3dyaXRlJyBwcm9ibGVtIGZpeGVkLgorICAtIFByb2JsZW0gd2l0aCBsb2NhbHRpbWUoKSBjcmFzaGluZyBTb2xhcmlzIDggZml4ZWQuCisgIC0gUHJvYmxlbSB3aXRoIHRjcCB3cmFwcGVycyBsaWJyYXJ5IGRldGVjdGlvbiBmaXhlZC4KKyAgLSBDeWd3aW4gKGh0dHA6Ly93d3cuY3lnd2luLmNvbS8pIHN1cHBvcnQgYWRkZWQuCisgIC0gX19zdnI0X18gbWFjcm8gZGVmaW5lZCBmb3IgU3VuIEMvQysrIGNvbXBpbGVyLgorKiBETExzIGZvciBPcGVuU1NMIDAuOS42Zy4KKworVmVyc2lvbiAzLjIyLCAyMDAxLjEyLjIwLCB1cmdlbmN5OiBISUdIOgorKiBGb3JtYXQgc3RyaW5nIGJ1ZyBmaXhlZCBpbiBwcm90b2NvbC5jCisgIHNtdHAsIHBvcDMgYW5kIG5udHAgaW4gY2xpZW50IG1vZGUgd2VyZSBhZmZlY3RlZC4KKyAgKHN0dW5uZWwgY2xpZW50cyBjb3VsZCBiZSBhdHRhY2tlZCBieSBtYWxpY2lvdXMgc2VydmVycykKKyogQ2VydGlmaWNhdGUgY2hhaW4gY2FuIGJlIHN1cHBsaWVkIHdpdGggLXAgb3B0aW9uIG9yIGluIHN0dW5uZWwucGVtLgorKiBQcm9ibGVtIHdpdGggLXIgYW5kIC1sIG9wdGlvbnMgdXNlZCB0b2dldGhlciBmaXhlZC4KKyogbWVtbW92ZSgpIGluc3RlYWQgb2YgbWVtY3B5KCkgaXMgdXNlZCB0byBtb3ZlIGRhdGEgaW4gYnVmZmVycy4KKyogTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBuZWdvdGlhdGVkIGNpcGhlcnMgaXMgcHJpbnRlZC4KKyogTmV3IC4vY29uZmlndXJlIG9wdGlvbnM6ICctLWVuYWJsZS1uby1yc2EnIGFuZCAnLS1lbmFibGUtZGgnLgorCitWZXJzaW9uIDMuMjFjLCAyMDAxLjExLjExLCB1cmdlbmN5OiBMT1c6CisqIGF1dG9jb25mIHNjcmlwdHMgdXBncmFkZWQgdG8gdmVyc2lvbiAyLjUyLgorKiBQcm9ibGVtIHdpdGggcHRocmVhZF9zaWdtYXNrIG9uIERhcndpbiBmaXhlZCAoSSBob3BlKS4KKyogU29tZSBkb2N1bWVudGF0aW9uIHR5cG9zIGNvcnJlY3RlZC4KKyogQXR0ZW1wdCB0byBpZ25vcmUgRUlOVFIgaW4gdHJhbnNmZXIoKS4KKyogU2hhcmVkIGxpYnJhcnkgdmVyc2lvbiByZXBvcnRlZCBvbiBzdGFydHVwLgorKiBETExzIGZvciBPcGVuU1NMIDAuOS42Yi4KKworVmVyc2lvbiAzLjIxYiwgMjAwMS4xMS4wMywgdXJnZW5jeTogTUVESVVNOgorKiBGaWxlIGRlc2NyaXB0b3IgbGVhayBvbiBmYWlsZWQgY29ubmVjdCgpIGZpeGVkLgorCitWZXJzaW9uIDMuMjFhLCAyMDAxLjEwLjMxLCB1cmdlbmN5OiBNRURJVU06CisqIFNtYWxsIGJ1ZyBpbiBNYWtlZmlsZSBmaXhlZC4KKworVmVyc2lvbiAzLjIxLCAyMDAxLjEwLjMxLCB1cmdlbmN5OiBNRURJVU06CisqIFByb2JsZW0gd2l0aCBlcnJubyBhbmQgcG9zaXggdGhyZWFkcyBmaXhlZC4KKyogSXQgaXMgYXNzdW1lZCB0aGF0IHN5c3RlbSBoYXMgZ2V0b3B0KCkgaWYgaXQgaGFzIGdldG9wdC5oIGhlYWRlciBmaWxlLgorKiBTU0xfQ0xJRU5UX0ROIGFuZCBTU0xfQ0xJRU5UX0lfRE4gZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCBpbiBsb2NhbCBtb2RlCisgICgtbCkgcHJvY2Vzcy4gIFRoaXMgZmVhdHVyZSBkb2Vzbid0IHdvcmsgaWYKKyAgY2xpZW50IG1vZGUgKC1jKSBvciBwcm90b2NvbCBuZWdvdGlhdGlvbiAoLW4pIGlzIHVzZWQuCisqIFdpbnNvY2sgZXJyb3IgZGVzY3JpcHRpb25zIGhhcmRjb2RlZCAoRW5nbGlzaCB2ZXJzaW9uIG9ubHkpLgorKiBTZXRDb25zb2xlQ3RybEhhbmRsZXIoKSB1c2VkIHRvIGhhbmRsZSBDVFJMK0MsIGxvZ29mZiBhbmQgc2h1dGRvd24gb24gV2luMzIuCisqIFN0dW5uZWwgYWx3YXlzIHJlcXVlc3RzIHBlZXIgY2VydGlmaWNhdGUgd2l0aCAtdiAwLgorKiBzeXNjb25mKCkvZ2V0cmxpbWl0KCkgdXNlZCB0byBjYWxjdWxhdGUgbnVtYmVyIG9mIGNsaWVudHMgYWxsb3dlZC4KKyogU1NMIG1vZGUgY2hhbmdlZCBmb3IgT3BlblNTTCA+PSAwLjkuNi4KKyogY2xvc2Utb24tZXhlYyBvcHRpb24gdXNlZCB0byBhdm9pZCBzb2NrZXQgaW5oZXJpdGluZy4KKyogQnVmZmVyIHNpemUgaW5jcmVhc2VkIGZyb20gOEtCIHRvIDE2S0IuCisqIGZkc2NhbmYoKS9mZHByaW50ZigpIGNoYW5nZXM6CisgICAtIG5vbi1ibG9ja2luZyBzb2NrZXQgc3VwcG9ydCwKKyAgIC0gdGltZW91dCBhZnRlciAxIG1pbnV0ZSBvZiBpbmFjdGl2aXR5LgorKiBhdXRoX3VzZXIoKSByZWRlc2lnbmVkIHRvIGZvcmNlIDEgbWludXRlIHRpbWVvdXQuCisqIFNvbWUgc291cmNlIGFycmFuZ2VtZW50IHRvd2FyZHMgNC54IGFyY2hpdGVjdHVyZS4KKyogTm8gbmVlZCBmb3IgJ2dvdG8nIGFueSBtb3JlLgorKiBOZXcgTWFrZWZpbGUgJ3Rlc3QnIHJ1bGUuICBJdCBwZXJmb3JtcyBiYXNpYyB0ZXN0IG9mCisgIHN0YW5kYWxvbmUvaW5ldGQsIHJlbW90ZS9sb2NhbCBhbmQgc2VydmVyL2NsaWVudCBtb2RlLgorKiBwb3AzIHNlcnZlciBtb2RlIHN1cHBvcnQgYWRkZWQuCisKK1ZlcnNpb24gMy4yMCwgMjAwMS4wOC4xNSwgdXJnZW5jeTogTE9XOgorKiBzZXRzb2Nrb3B0KCkgb3B0bGVuIHNldCBhY2NvcmRpbmcgdG8gdGhlIG9wdHZhbCBmb3IgU29sYXJpcy4KKyogTWlub3IgTmV0QlNEIGNvbXBhdGliaWxpdHkgZml4ZXMgYnkgTWFydHRpIEt1cGFyaW5lbi4KKyogTWlub3IgTVNWQyA2LjAgY29tcGF0aWJpbGl0eSBmaXhlcyBieSBQYXRyaWNrIE1heXdlZy4KKyogU1NMIGNsb3NlX25vdGlmeSB0aW1lb3V0IHJlZHVjZWQgdG8gMTAgc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgorKiBTb2NrZXQgY2xvc2UgaW5zdGVhZCBvZiByZXNldCBvbiBjbG9zZV9ub3RpZnkgdGltZW91dC4KKyogU29tZSBzb3VyY2UgYXJyYW5nZW1lbnQgYW5kIG1pbm9yIGJ1Z2ZpeGVzLgorCitWZXJzaW9uIDMuMTksIDIwMDEuMDguMTAsIHVyZ2VuY3k6IE1FRElVTToKKyogQ3JpdGljYWwgc2VjdGlvbiBhZGRlZCBhcm91bmQgbm9uIE1ULXNhZmUgVENQIFdyYXBwZXJzIGNvZGUuCisqIFByb2JsZW0gd2l0aCAnc2VsZWN0OiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCcgZXJyb3IgZml4ZWQuCisqIGVycm5vIHJlcGxhY2VkIHdpdGggZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgZm9yIFdpbjMyLgorKiBTb21lIEZyZWVCU0QvTmV0QlNEIHBhdGNoZXMgdG8gLi9jb25maWd1cmUgZnJvbSBNYXJ0dGkgS3VwYXJpbmVuLgorKiBMb2NhbCBtb2RlIHByb2Nlc3MgcGlkIGxvZ2dlZC4KKyogRGVmYXVsdCBGUUROIChsb2NhbGhvc3QpIHJlbW92ZWQgZnJvbSBzdHVubmVsLmNuZgorKiAuL2NvbmZpZ3VyZSBjaGFuZ2VkIHRvIHJlY29nbml6ZSBQT1NJWCB0aHJlYWRzIGxpYnJhcnkgb24gT1NGLgorKiBOZXcgLU8gb3B0aW9uIHRvIHNldCBzb2NrZXQgb3B0aW9ucy4KKworVmVyc2lvbiAzLjE4LCAyMDAxLjA3LjMxLCB1cmdlbmN5OiBNRURJVU06CisqIE1BWF9DTElFTlRTIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gRkRfU0VUU0laRSwgbm93LgorKiBQcm9ibGVtcyB3aXRoIGNsb3NpbmcgU1NMIGluIHRyYW5zZmVyKCkgZml4ZWQuCisqIC1JIG9wdGlvbiB0byBiaW5kIGEgc3RhdGljIGxvY2FsIElQIGFkZHJlc3MgYWRkZWQuCisqIERlYnVnIG91dHB1dCBvZiBpbmZvX2NhbGxiYWNrIHJlZGVzaWduZWQuCisKK1ZlcnNpb24gMy4xNywgMjAwMS4wNy4yOSwgdXJnZW5jeTogTUVESVVNOgorKiBQcm9ibGVtIHdpdGggR1BGIG9uIGV4aXQgd2l0aCBhY3RpdmUgdGhyZWFkcyBmaXhlZC4KKyogVGltZW91dCBmb3IgdHJhbnNmZXIoKSBmdW5jdGlvbiBhZGRlZDoKKyAgIC0gMSBob3VyIGlmIHNvY2tldCBpcyBvcGVuIGZvciByZWFkCisgICAtIDEgbWludXRlIGlmIHNvY2tldCBpcyBjbG9zZWQgZm9yIHJlYWQKKworVmVyc2lvbiAzLjE2LCAyMDAxLjA3LjIyLCB1cmdlbmN5OiBNRURJVU06CisqIFNvbWUgdHJhbnNmZXIoKSBidWdmaXhlcy9pbXByb3ZlbWVudHMuCisqIFNURElOL1NURE9VVCBhcmUgbm8gbG9uZ2VyIGFzc3VtZWQgdG8gYmUgbm9uLXNvY2tldCBkZXNjcmlwdG9ycy4KKyogUHJvYmxlbSB3aXRoIC0td2l0aC10Y3Atd3JhcHBlcnMgcGF0Y2ggZml4ZWQuCisqIHBvcDMgYW5kIG5udHAgc3VwcG9ydCBidWcgZml4ZWQgYnkgTWFydGluIEdlcm1hbm4uCisqIC1vIG9wdGlvbiB0byBhcHBlbmQgbG9nIG1lc3NhZ2VzIHRvIGEgZmlsZSBhZGRlZC4KKyogQ2hhbmdlZCBlcnJvciBtZXNzYWdlIGZvciBTU0wgZXJyb3IgMC4KKworVmVyc2lvbiAzLjE1LCAyMDAxLjA3LjE1LCB1cmdlbmN5OiBNRURJVU06CisqIFNlcmlvdXMgYnVnIHJlc3VsdGluZyBpbiByYW5kb20gdHJhbnNmZXIoKSBoYW5ncyBmaXhlZC4KKyogU2VwYXJhdGUgZmlsZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCBmb3IgaW5ldGQgbW9kZS4KKyogLWYgKGZvcmVncm91bmQpIGxvZ3MgYXJlIG5vdyBzdGFtcGVkIHdpdGggdGltZS4KKyogTmV3IC4vY29uZmlndXJlIG9wdGlvbjogLS13aXRoLXRjcC13cmFwcGVycyBieSBCcmlhbiBIYXRjaC4KKyogcG9wMyBwcm90b2NvbCBjbGllbnQgc3VwcG9ydCAoLW4gcG9wMykgYnkgTWFydGluIEdlcm1hbm4uCisqIG5udHAgcHJvdG9jb2wgY2xpZW50IHN1cHBvcnQgKC1uIG5udHApIGJ5IE1hcnRpbiBHZXJtYW5uLgorKiBSRkMgMjQ4NyAoc210cCBTVEFSVFRMUykgY2xpZW50IG1vZGUgc3VwcG9ydC4KKyogVHJhbnNwYXJlbmN5IHN1cHBvcnQgZm9yIFRydTY0IGFkZGVkLgorKiBTb21lICNpbmNsdWRlcyBmb3IgQUlYIGFkZGVkLgorCitWZXJzaW9uIDMuMTQsIDIwMDEuMDIuMjEsIHVyZ2VuY3k6IExPVzoKKyogUGlkZmlsZSBjcmVhdGlvbiBhbGdvcml0aG0gaGFzIGJlZW4gY2hhbmdlZC4KKworVmVyc2lvbiAzLjEzLCAyMDAxLjAxLjI1LCB1cmdlbmN5OiBNRURJVU06CisqIHB0aHJlYWRfc2lnbWFzaygpIGFyZ3VtZW50IGluIHN0aHJlYWRzLmMgY29ycmVjdGVkLgorKiBPT0IgZGF0YSBpcyBub3cgaGFuZGxlZCBjb3JyZWN0bHkuCisKK1ZlcnNpb24gMy4xMiwgMjAwMS4wMS4yNCwgdXJnZW5jeTogTE9XOgorKiBBdHRlbXB0ZWQgdG8gZml4IHByb2JsZW0gd2l0aCB6b21iaWVzIGluIGxvY2FsIG1vZGUuCisqIFBhdGNoIGZvciA2NC1iaXQgbWFjaGluZXMgYnkgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiBhcHBsaWVkLgorKiBUaW55IGJ1Z2ZpeCBmb3IgT1NGIGNjIGJ5IERvYnJpY2EgUGF2bGludXNpYyA8ZHBhdmxpbkByb3QxMy5vcmc+IGFkZGVkLgorKiBQT1JUUyBmaWxlIHVwZGF0ZWQuCisKK1ZlcnNpb24gMy4xMSwgMjAwMC4xMi4yMSwgdXJnZW5jeTogTUVESVVNOgorKiBOZXcgcHJvYmxlbSB3aXRoIHpvbWJpZXMgZml4ZWQuCisqIEF0dGVtcHQgdG8gYmUgaW50ZWdlci1zaXplIGluZGVwZW5kZW50LgorKiBTSUdIVVAgaGFuZGxlciBhZGRlZC4KKworVmVyc2lvbiAzLjEwLCAyMDAwLjEyLjE5LCB1cmdlbmN5OiBNRURJVU06CisqIEludGVybmFsIHRocmVhZCBzeW5jaHJvbml6YXRpb24gY29kZSBhZGRlZC4KKyogbGliZGwgYWRkZWQgdG8gc3R1bm5lbCBkZXBlbmRlbmNpZXMgaWYgaXQgZXhpc3RzLgorKiBNYW5wYWdlIGNvbnZlcnRlZCB0byBzZGYgZm9ybWF0LgorKiBzdHVubmVsIGRlbGV0ZXMgcGlkIGZpbGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGl0LgorKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisqIC1EIG9wdGlvbiBub3cgdGFrZXMgW2ZhY2lsaXR5XS5sZXZlbCBhcyBhcmd1bWVudC4gIDAtNyBzdGlsbCBzdXBwb3J0ZWQuCisqIFByb2JsZW1zIHdpdGggb2NjYXNpb25hbCB6b21iaWVzIGluIEZPUksgbW9kZSBmaXhlZC4KKyogJ3N0dW5uZWwuZXhlJyBydWxlIGFkZGVkIHRvIE1ha2VmaWxlLgorICBZb3UgY2FuIGNyb3NzLWNvbXBpbGUgc3R1bm5lbC5leGUgb24gVW5peCwgbm93LgorICBJJ2QgbGlrZSB0byBiZSBhYmxlIHRvIGNvbXBpbGUgT3BlblNTTCB0aGlzIHdheSwgdG9vLi4uCisKK1ZlcnNpb24gMy45LCAyMDAwLjEyLjEzLCB1cmdlbmN5OiBISUdIOgorKiBVcGRhdGVkIHRlbXBvcmFyeSBrZXkgZ2VuZXJhdGlvbjoKKyAgIC0gc3R1bm5lbCBpcyBub3cgaG9ub3JpbmcgcmVxdWVzdGVkIGtleS1sZW5ndGhzIGNvcnJlY3RseSwKKyAgIC0gdGVtcG9yYXJ5IGtleSBpcyBjaGFuZ2VkIGV2ZXJ5IGhvdXIuCisqIHRyYW5zZmVyKCkgbm8gbG9uZ2VyIGhhbmdzIG9uIHNvbWUgcGxhdGZvcm1zLgorICBTcGVjaWFsIHRoYW5rcyB0byBQZXRlciBXYWdlbWFucyBmb3IgdGhlIHBhdGNoLgorKiBQb3RlbnRpYWwgc2VjdXJpdHkgcHJvYmxlbSB3aXRoIHN5c2xvZygpIGNhbGwgZml4ZWQuCisKK1ZlcnNpb24gMy44cDQsIDIwMDAuMDYuMjUgIGJyaUBzdHVubmVsLm9yZzoKKyogZml4ZXMgZm9yIFdpbmRvd3MgcGxhdGZvcm0KKworVmVyc2lvbiAzLjhwMywgMjAwMC4wNi4yNCAgYnJpQHN0dW5uZWwub3JnOgorKiBDb21waWxlIHRpbWUgZGVmaW5pdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmc6CisgICAgLS13aXRoLWNlcnQtZGlyCisgICAgLS13aXRoLWNlcnQtZmlsZQorICAgIC0td2l0aC1wZW0tZGlyCisgICAgLS1lbmFibGUtc3NsbGliLWNzCisqIHVzZSBkYWVtb24oKSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGRhZW1vbml6ZSwgaWYgYXZhaWxhYmxlCisqIGZpeGVkIEZyZWVCU0QgdGhyZWFkcyBjaGVja2luZyAocGF0Y2ggZnJvbSByb2JlcnR3QHdvam8uY29tKQorKiBhZGRlZCAtUyBmbGFnLCBhbGxvd2luZyB5b3UgdG8gY2hvb3NlIHdoaWNoIGRlZmF1bHQgdmVyaWZ5CisgIHNvdXJjZXMgdG8gdXNlCisqIHJlbG9jYXRlZCBzZXJ2aWNlIG5hbWUgb3V0cHV0IGxvZ2dpbmcgdW50aWwgYWZ0ZXIgbG9nX29wZW4uCisgIChubyBsb25nZXIgb3V0cHV0cyBsb2cgaW5mbyB0byBpbmV0ZCBzb2NrZXQsIGNhdXNpbmcgYmFkIFNTTCkKKyogLVYgZmxhZyBub3cgb3V0cHV0cyB0aGUgZGVmYXVsdCB2YWx1ZXMgdXNlZCBieSBzdHVubmVsCisqIFJlbW92ZWQgREggcGFyYW0gZ2VuZXJhdGlvbiBpbiBNYWtlZmlsZS5pbgorKiBNb3ZlZCBzdHVubmVsLnBlbSB0byBzYW1wbGUucGVtIHRvIGtlZXAgcGVvcGxlIGZyb20gYmxpbmRseSB1c2luZyBpdAorKiBSZW1vdmVkIGNvbmZ1c2luZyBzdHVubmVsLnBlbSBjaGVjayBmcm9tIE1ha2VmaWxlLgorCisqIFVQR1JBREUgTk9URTogdGhpcyB2ZXJzaW9uIHNlcmlvdXNseSBjaGFuZ2VzIHNldmVyYWwgcHJldmlvdXMgc3R1bm5lbAorICBkZWZhdWx0IGJlaGF2aW91cnMuICBUaGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBkZWZhdWx0IGNlcnQgZmlsZS9kaXJzCisgIGNvbXBpbGVkIGludG8gc3R1bm5lbCwgeW91IG11c3QgdXNlIHRoZSAtLXdpdGgtY2VydC1kaXIgYW5kCisgIC0td2l0aC1jZXJ0LWZpbGUgY29uZmlndXJlIGFyZ3VtZW50cyB0byBzZXQgdGhlc2UgbWFudWFsbHksIGlmIGRlc2lyZWQuCisgIFN0dW5uZWwgZG9lcyBub3QgdXNlIHRoZSB1bmRlcmx5aW5nIHNzbCBsaWJyYXJ5IGRlZmF1bHRzIGJ5IGRlZmF1bHQKKyAgdW5sZXNzIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1zc2xsaWItY3MuICBOb3RlIHRoYXQgdGhlc2UgY2FuIGFsd2F5cworICBiZSBlbmFibGVkIGF0IHJ1biB0aW1lIHdpdGggdGhlIC1BLC1hLCBhbmQgLVMgZmxhZ3MuCisgIEFkZGl0aW9uYWxseSwgdW5sZXNzIC0td2l0aC1wZW0tZGlyIGlzIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUsCisgIHN0dW5uZWwgd2lsbCBkZWZhdWx0IHRvIGxvb2tpbmcgZm9yIHN0dW5uZWwucGVtIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworVmVyc2lvbiAzLjhwMiwgMjAwMC4wNi4xMyAgYnJpQHN0dW5uZWwub3JnOgorKiBGaXhlcyBmb3IgV2luMzIgcGxhdGZvcm0KKyogTWlub3Igb3V0cHV0IGZvcm1hdHRpbmcgY2hhbmdlcworKiBGaXhlZCB2ZXJzaW9uIG51bWJlciBpbiBmaWxlcworCitWZXJzaW9uIDMuOHAxLCAyMDAwLjA2LjExICBicmlAc3R1bm5lbC5vcmc6CisqIEFkZGVkIHJpZ29yb3VzIFBSTkcgc2VlZGluZworKiBQSUQgY2hhbmdlcyAoYW5kIHJlbGF0ZWQgc2VjdXJpdHktZml4KQorKiBNYW4gcGFnZSBmaXhlcworKiBDbGllbnQgU1NMIFNlc3Npb24tSURzIG5vdyB1c2VkCisqIC1OIGZsYWcgdG8gc3BlY2lmeSB0Y3B3cmFwcGVyIHNlcnZpY2UgbmFtZQorCitWZXJzaW9uIDMuOCwgMjAwMC4wMi4yNDoKKyogQ2hlY2tpbmcgZm9yIHRocmVhZHMgaW4gY19yIGxpYnJhcnkgZm9yIEZyZWVCU0QuCisqIFNvbWUgY29tcGF0aWJpbGl0eSBmaXhlcyBmb3IgVWx0cml4LgorKiBjb25maWd1cmUuaW4gaGFzIGJlZW4gY2xlYW5lZCB1cC4KKyAgU2VwYXJhdGUgZGlyZWN0b3JpZXMgZm9yIFNTTCBjZXJ0cyBhbmQgU1NMIGxpYnJhcmllcy9oZWFkZXJzCisgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiAgU1NMIHBvcnRzIG1haW50YWluZXJzIHNob3VsZCBjcmVhdGUKKyAgc29mdGxpbmtzIGluIHRoZSBtYWluIG9wZW5zc2wgZGlyZWN0b3J5IGlmIG5lY2Vzc2FyeS4KKyogQWRkZWQgLS13aXRoLXNzbCBvcHRpb24gdG8gc3BlY2lmeSBTU0wgZGlyZWN0b3J5LgorKiBBZGRlZCBzZXRnaWQgKC1nKSBvcHRpb24uCisgIChTcGVjaWFsIHRoYW5rcyB0byBCcmlhbiBIYXRjaCBmb3IgaGlzIGZlZWRiYWNrIGFuZCBzdXBwb3J0KQorKiBBZGRlZCBwdHkuYyBiYXNlZCBvbiBhIFB1YmxpYyBEb21haW4gY29kZSBieSBUYXR1IFlsb25lbgorKiBEaXN0cmlidXRpb24gZmlsZXMgYXJlIG5vdyBzaWduZWQgd2l0aCBHbnVQRworCitWZXJzaW9uIDMuNywgMjAwMC4wMi4xMDoKKyogL3Vzci9wa2cgYWRkZWQgdG8gbGlzdCBvZiBwb3NzaWJsZSBTU0wgZGlyZWN0b3JpZXMgZm9yIHBrZ3NyYyBpbnN0YWxscworICBvZiBPcGVuU1NMIHVuZGVyIE5ldEJTRC4KKyogQWRkZWQgdGhlIC1zIG9wdGlvbiwgd2hpY2ggc2V0dWlkKClzIHRvIHRoZSBzcGVjaWZpZWQgdXNlciB3aGVuIHJ1bm5pbmcKKyAgaW4gZGFlbW9uIG1vZGUuIFVzZWZ1bCBmb3IgY3lydXMgaW1hcGQuCisgIChib3RoIGJhc2VkIG9uIHBhdGNoIGJ5IEdlb3JnZSBDb3Vsb3VyaXMpCisqIFBUWSBjb2RlIHBvcnRlZCB0byBTb2xhcmlzLiAgVGhlIHBvcnQgbmVlZHMgc29tZSBtb3JlIHRlc3RpbmcuCisqIEFkZGVkIGhhbmRsZXIgZm9yIFNJR0lOVC4KKyogQWRkZWQgLS13aXRoLXJhbmRvbSBvcHRpb24gdG8gLi9jb25maWd1cmUgc2NyaXB0LgorKiBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggYXV0b2NvbmZpZ3VyYXRpb24gb24gU29sYXJpcyBhbmQgb3RoZXJzLgorICBJdCBkb2Vzbid0IHVzZSBjb25maWcuaCBhbnkgbW9yZS4KKyogL3Zhci9ydW4gY2hhbmdlZCB0byBAbG9jYWxzdGF0ZWRpckAvc3R1bm5lbCBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5LgorICBUaGUgZGlyZWN0b3J5IGlzIGNobW9kZWQgYT1yd3gsK3QuCisqIEZBUSBoYXMgYmVlbiB1cGRhdGVkLgorCiszLjYgMjAwMC4wMi4wMworKiBBdXRvbWF0aWMgUkZDIDI0ODcgZGV0ZWN0aW9uIGJhc2VkIG9uIHBhdGNoIGJ5IFBhc2N1YWwgUGVyZXogYW5kIEJvcmphIFBlcmV6LgorKiBOb24tYmxvY2tpbmcgc29ja2V0cyBub3QgdXNlZCBieSBkZWZhdWx0LgorKiBESCBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisqIChib3RoIGNhbiBiZSBlbmFibGVkIGluIHNzbC5jKQorCiszLjUgMjAwMC4wMi4wMgorKiBTdXBwb3J0IGZvciBvcGVuc3NsIDAuOS40IGFkZGVkLgorKiAvdXNyL3NzbCBhZGRlZCB0byBjb25maWd1cmUgYnkgQ2hyaXN0aWFuIFp1Y2tzY2h3ZXJkdC4KKyogQWRkZWQgdHVubmVsaW5nIGZvciBQUFAgdGhyb3VnaCB0aGUgYWRkaXRpb24gb2YgUFRZIGhhbmRsaW5nLgorKiBBZGRlZCBzb21lIGRvY3VtZW50YXRpb24uCisKKzMuNGEgMTk5OS4wNy4xMyAoYnVnZml4IHJlbGVhc2UpCisqIFByb2JsZW0gd2l0aCBjaXBoZXIgbmVnb3RpYXRpb24gZml4ZWQuCisqIHNldGVudiBjaGFuZ2VkIHRvIHB1dGVudi4KKworMy40IDE5OTkuMDcuMTIKKyogTG9jYWwgdHJhbnNwYXJlbnQgcHJveHkgYWRkZWQgd2l0aCBMRF9QUkVMT0FEZWQgc2hhcmVkIGxpYnJhcnkuCisqIERIIGNvZGUgcmV3cml0dGVuLgorKiBBZGRlZCAtQyBvcHRpb24gdG8gc2V0IGNpcGhlciBsaXN0LgorKiBzdGRlcnIgZmZsdXNoZWQgYWZ0ZXIgZnByaW50ZigpLgorKiBNaW5vciBwb3J0YWJpbGl0eSBidWdmaXhlcy4KKyogTWFudWFsIHVwZGF0ZWQgKGJ1dCBzdGlsbCBub3QgcGVyZmVjdCkuCisKKzMuMyAxOTk5LjA2LjE4CisqIFN1cHBvcnQgZm9yIG9wZW5zc2wgMC45LjMgYWRkZWQuCisqIEdlbmVyaWMgc3VwcG9ydCBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb24gYWRkZWQgKHByb3RvY29sLmMpLgorKiBTTVRQIHByb3RvY29sIG5lZ290aWF0aW9uIHN1cHBvcnQgZm9yIE5ldHNjYXBlIGNsaWVudCBhZGRlZC4KKyogVHJhbnNwYXJlbnQgcHJveHkgbW9kZSAoY3VycmVudGx5IHdvcmtzIG9uIExpbnV4IG9ubHkpLgorKiBTT19SRVVTRUFERFIgZW5hYmxlZCBvbiBsaXN0ZW5pbmcgc29ja2V0IGluIGRhZW1vbiBtb2RlLgorKiAuL2NvbmZpZ3VyZSBub3cgYWNjZXB0cyAtLXByZWZpeCBwYXJhbWV0ZXIuCisqIC1XYWxsIGlzIG9ubHkgdXNlZCB3aXRoIGdjYyBjb21waWxlci4KKyogTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZS5pbiB1cGRhdGVkLgorKiBTU0wtcmVsYXRlZCBmdW5jdGlvbnMgbW92ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlLgorKiB2c3ByaW50ZiBjaGFuZ2VkIHRvIHZzbnByaW50ZiBpbiBsb2cuYyBvbiBzeXN0ZW1zIGhhdmUgaXQuCisqIFBpZGZpbGUgaW4gL3Zhci9ydW4gYWRkZWQgZm9yIGRhZW1vbiBtb2RlLgorKiBSU0FyZWYgc3VwcG9ydCBmaXggKG5vdCB0ZXN0ZWQpLgorKiBTb21lIGNvbXBhdGliaWxpdHkgZml4ZXMgZm9yIFNvbGFyaXMgYW5kIE5ldEJTRCBhZGRlZC4KKworMy4yIDE5OTkuMDQuMjgKKyogUlNBcmVmIHN1cHBvcnQgKG5vdCB0ZXN0ZWQpLgorKiBBZGRlZCBmdWxsIGR1cGxleCB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLgorKiBSU1Qgc2VudCBpbnN0ZWFkIG9mIEZJTiBvbiBwZWVyIGVycm9yIChvbiBlcnJvciBwZWVyCisgIHNvY2tldCBpcyByZXNldCAtIG5vdCBqdXN0IGNsb3NlZCkuCisqIFJTQSB0ZW1wb3Jhcnkga2V5IGxlbmd0aCBjaGFuZ2VkIGJhY2sgdG8gNTEyIGJpdHMgdG8gZml4CisgIGEgcHJvYmxlbSB3aXRoIE5ldHNjYXBlLgorKiBBZGRlZCBOT19SU0EgZm9yIFVTIGNpdGl6ZW5zIGhhdmluZyBwcm9ibGVtcyB3aXRoIHBhdGVudHMuCisKKzMuMSAxOTk5LjA0LjIyCisqIENoYW5nZWQgLWwgc3ludGF4IChmaXJzdCBhcmd1bWVudCBzcGVjaWZpZWQgaXMgbm93IGFyZ3ZbMF0pLgorKiBGaXhlZCBwcm9ibGVtIHdpdGggb3B0aW9ucyBwYXNzZWQgdG8gbG9jYWxseSBleGVjdXRlZCBkYWVtb24uCisqIEZpeGVkIHByb2JsZW0gd2l0aCAnOicgcGFzc2VkIHRvIGxpYndyYXAgaW4gYSBzZXJ2aWNlIG5hbWU6CisgIC0gJzonIGhhcyBiZWVuIGNoYW5nZWQgdG8gJy4nOworICAtIHVzZXIgY2FuIHNwZWNpZnkgaGlzIG93biBzZXJ2aWNlIG5hbWUgYXMgYW4gYXJndW1lbnQuCisqIFJTQSB0ZW1wb3Jhcnkga2V5IGxlbmd0aCBjaGFuZ2VkIGZyb20gNTEyIHRvIDEwMjQgYml0cy4KKyogQWRkZWQgc2FmZWNvcHkgdG8gYXZvaWQgYnVmZmVyIG92ZXJmbG93cyBpbiBzdHVubmVsLmMuCisqIEZpeGVkIHByb2JsZW1zIHdpdGggR1BGIGFmdGVyIHVuc3VjY2Vzc2Z1bCByZXNvbHZlciBjYWxsCisgIGFuZCBpbmNvcnJlY3QgcGFyYW1ldGVycyBwYXNzZWQgdG8gZ2V0b3B0KCkgaW4gV2luMzIuCisqIEZBUSB1cGRhdGVkLgorCiszLjAgMTk5OS4wNC4xOQorKiBTb21lIGJ1Z2ZpeGVzLgorKiBGQVEgYWRkZWQuCisKKzMuMGI3IDE5OTkuMDQuMTQKKyogV2luMzIgbmF0aXZlIHBvcnQgZml4ZWQgKGxvb2tzIHF1aXRlIHN0YWJsZSkuCisqIE5ldyB0cmFuc2ZlcigpIGZ1bmN0aW9uIGFsZ29yaXRobS4KKyogTmV3ICdtYWtlIGNlcnQnIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvcGVuc3NsLTAuOS4yYi4KKyogUmVtb3ZlZCBzdXBwb3J0IGZvciBtZW1vcnkgbGVha3MgZGVidWdnaW5nLgorCiszLjBiNiAxOTk5LjA0LjAxCisqIEZpeGVkIHByb2JsZW1zIHdpdGggc2Vzc2lvbiBjYWNoZSAoYnkgQWRhbSkuCisqIEFkZGVkIGNsaWVudCBtb2RlIHNlc3Npb24gY2FjaGUuCisqIFNvdXJjZSBzdHJ1Y3R1cmUsIGF1dG9jb25mIHNjcmlwdCBhbmQgTWFrZWZpbGUgY2hhbmdlZC4KKyogQWRkZWQgLUQgb3B0aW9uIHRvIHNldCBkZWJ1ZyBsZXZlbC4KKyogQWRkZWQgc3VwcG9ydCBmb3IgbWVtb3J5IGxlYWtzIGRlYnVnZ2luZworICAoU1NMIGxpYnJhcnkgbmVlZHMgdG8gYmUgY29tcGlsZWQgd2l0aCAtRE1GVU5DKS4KKworMy4wYjUgMTk5OS4wMy4yNQorKiBMb3RzIG9mIGNoYW5nZXMgdG8gbWFrZSB0aHJlYWRzIHdvcmsuCisqIFBlZXIgKGNsaWVudCBhbmQgc2VydmVyKSBhdXRoZW50aWNhdGlvbiB3b3JrcyEKKyogQWRkZWQgLVYgb3B0aW9uIHRvIGRpc3BsYXkgdmVyc2lvbi4KKworMy4wYjQgMTk5OS4wMy4yMgorKiBFYXJseSBQT1NJWCB0aHJlYWRzIGltcGxlbWVudGF0aW9uLgorKiBXb3JrIG9uIHBvcnRpbmcgdG8gbmF0aXZlIFdpbjMyIGFwcGxpY2F0aW9uIHN0YXJ0ZWQuCisKKzMuMGIzIDE5OTkuMDMuMDUKKyogSW1wcm92ZWQgYmVoYXZpb3Igb24gaGVhdnkgbG9hZC4KKworMy4wYjIgMTk5OS4wMy4wNAorKiBGaXhlZCAtdiBwYXJzaW5nIGJ1Zy4KKworMy4wYjEgMTk5OS4wMS4xOAorKiBOZXcgdXNlciBpbnRlcmZhY2UuCisqIENsaWVudCBtb2RlIGFkZGVkLgorKiBQZWVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZGRlZCAoPXN0cm9uZyBhdXRoZW50aWNhdGlvbikuCisqIFdpbjMyIHBvcnQgYWRkZWQuCisqIE90aGVyIG1pbm9yIHByb2JsZW1zIGZpeGVkLgorCisyLjEgMTk5OC4wNi4wMQorKiBGZXcgYnVncyBmaXhlZC4KKworMi4wIDE5OTguMDUuMjUKKyogUmVtb3RlIG1vZGUgYWRkZWQhCisqIFN0YW5kYWxvbmUgbW9kZSBhZGRlZCEKKyogdGNwZCBmdW5jdGlvbmFsaXR5IGFkZGVkIGJ5IGxpYndyYXAgdXRpbGl6YXRpb24uCisqIERIIGNhbGxiYWNrcyByZW1vdmVkIGJ5IGtyYXZpZXRaLgorKiBiaW5kIGxvb3BiYWNrIG9uIEludGVsIGFuZCBvdGhlciBidWdzIGZpeGVkIGJ5IGtyYXZpZXRaLgorKiBOZXcgbWFudWFsIHBhZ2UgYnkga3JhdmlldFogJiBteXNlbGYuCisKKzEuNiAxOTk4LjAyLjI0CisqIExpbnV4IGJpbmQgZml4LgorKiBOZXcgVE9ETyBpZGVhcyEKKworMS41IDE5OTguMDIuMjQKKyogbWFrZV9zb2NrZXRzKCkgaW1wbGVtZW50ZWQgd2l0aCBJbnRlcm5ldCBzb2NrZXRzIGluc3RlYWQKKyAgb2YgVW5peCBzb2NrZXRzIGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS4KKyAgKGkuZS4gdG8gYXZvaWQgcmFuZG9tIGRhdGEgcmV0dXJuZWQgYnkgZ2V0cGVlcm5hbWUoMikpCisgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZGlzYWJsZWQgaW4gc3R1bm5lbC5jLgorCisxLjQgMTk5OC4wMi4xNgorKiBQb3J0ZWQgdG8gSFAtVVgsIFNvbGFyaXMgYW5kIHByb2JhYmx5IG90aGVyIFVOSVhlcy4KKyogQXV0b2NvbmZpZ3VyYXRpb24gYWRkZWQuCisKKzEuMyAxOTk4LjAyLjE0CisqIE1hbiBwYWdlIGJ5IFBhd2VsIEtyYXdjenlrIDxrcmF2aWV0ekBjZXRpLmNvbS5wbD4gYWRkZWQhCisqIENvcHlyaWdodHMgYWRkZWQuCisqIE1pbm9yIGVycm9ycyBjb3JyZWN0ZWQuCisKKzEuMiAxOTk4LjAyLjE0CisqIFNlcGFyYXRlIGNlcnRpZmljYXRlIGZvciBlYWNoIHNlcnZpY2UgYWRkZWQuCisqIENvbm5lY3Rpb24gbG9nZ2luZyBzdXBwb3J0LgorCisxLjEgMTk5OC4wMi4xNAorKiBDYWxsYmFjayBmdW5jdGlvbnMgYWRkZWQgYnkgUGF3ZWwgS3Jhd2N6eWsgPGtyYXZpZXR6QGNldGkuY29tLnBsPi4KKworMS4wIDE5OTguMDIuMTEKKyogRmlyc3QgdmVyc2lvbiB3aXRoIFNTTCBzdXBwb3J0CisgIC0gc3BlY2lhbCB0aHggdG8gQWRhbSBIZXJuaWsgPGFkYXNAaW5mb2NlbnRydW0uY29tPi4KKworMC4xIDE5OTguMDIuMTAKKyogVGVzdGluZyBza2VsZXRvbi4KKwpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5OTg0MAotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwKQEAgLTAsMCArMSwzNzAgQEAKK0luc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIDE5OTktMjAwMiwgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsCit3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLgorCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBCcmllZmx5LCB0aGUgc2hlbGwgY29tbWFuZCBgLi9jb25maWd1cmUgJiYgbWFrZSAmJiBtYWtlIGluc3RhbGwnCitzaG91bGQgY29uZmlndXJlLCBidWlsZCwgYW5kIGluc3RhbGwgdGhpcyBwYWNrYWdlLiAgVGhlIGZvbGxvd2luZworbW9yZS1kZXRhaWxlZCBpbnN0cnVjdGlvbnMgYXJlIGdlbmVyaWM7IHNlZSB0aGUgYFJFQURNRScgZmlsZSBmb3IKK2luc3RydWN0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UuICBTb21lIHBhY2thZ2VzIHByb3ZpZGUgdGhpcworYElOU1RBTEwnIGZpbGUgYnV0IGRvIG5vdCBpbXBsZW1lbnQgYWxsIG9mIHRoZSBmZWF0dXJlcyBkb2N1bWVudGVkCitiZWxvdy4gIFRoZSBsYWNrIG9mIGFuIG9wdGlvbmFsIGZlYXR1cmUgaW4gYSBnaXZlbiBwYWNrYWdlIGlzIG5vdAorbmVjZXNzYXJpbHkgYSBidWcuICBNb3JlIHJlY29tbWVuZGF0aW9ucyBmb3IgR05VIHBhY2thZ2VzIGNhbiBiZSBmb3VuZAoraW4gKm5vdGUgTWFrZWZpbGUgQ29udmVudGlvbnM6IChzdGFuZGFyZHMpTWFrZWZpbGUgQ29udmVudGlvbnMuCisKKyAgIFRoZSBgY29uZmlndXJlJyBzaGVsbCBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgY29ycmVjdCB2YWx1ZXMgZm9yCit2YXJpb3VzIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgSXQgdXNlcwordGhvc2UgdmFsdWVzIHRvIGNyZWF0ZSBhIGBNYWtlZmlsZScgaW4gZWFjaCBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCitJdCBtYXkgYWxzbyBjcmVhdGUgb25lIG9yIG1vcmUgYC5oJyBmaWxlcyBjb250YWluaW5nIHN5c3RlbS1kZXBlbmRlbnQKK2RlZmluaXRpb25zLiAgRmluYWxseSwgaXQgY3JlYXRlcyBhIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN0YXR1cycgdGhhdAoreW91IGNhbiBydW4gaW4gdGhlIGZ1dHVyZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhbmQgYQorZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQgKHVzZWZ1bCBtYWlubHkgZm9yCitkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJdCBjYW4gYWxzbyB1c2UgYW4gb3B0aW9uYWwgZmlsZSAodHlwaWNhbGx5IGNhbGxlZCBgY29uZmlnLmNhY2hlJworYW5kIGVuYWJsZWQgd2l0aCBgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScgb3Igc2ltcGx5IGAtQycpIHRoYXQgc2F2ZXMKK3RoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cCByZWNvbmZpZ3VyaW5nLiAgQ2FjaGluZyBpcworZGlzYWJsZWQgYnkgZGVmYXVsdCB0byBwcmV2ZW50IHByb2JsZW1zIHdpdGggYWNjaWRlbnRhbCB1c2Ugb2Ygc3RhbGUKK2NhY2hlIGZpbGVzLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgY2FjaGUsIGFuZCBhdAorc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJyBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdQorbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmFjJyAob3IgYGNvbmZpZ3VyZS5pbicpIGlzIHVzZWQgdG8gY3JlYXRlCitgY29uZmlndXJlJyBieSBhIHByb2dyYW0gY2FsbGVkIGBhdXRvY29uZicuICBZb3UgbmVlZCBgY29uZmlndXJlLmFjJyBpZgoreW91IHdhbnQgdG8gY2hhbmdlIGl0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uCitvZiBgYXV0b2NvbmYnLgorCisgICBUaGUgc2ltcGxlc3Qgd2F5IHRvIGNvbXBpbGUgdGhpcyBwYWNrYWdlIGlzOgorCisgIDEuIGBjZCcgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgYW5kIHR5cGUKKyAgICAgYC4vY29uZmlndXJlJyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UgZm9yIHlvdXIgc3lzdGVtLgorCisgICAgIFJ1bm5pbmcgYGNvbmZpZ3VyZScgbWlnaHQgdGFrZSBhIHdoaWxlLiAgV2hpbGUgcnVubmluZywgaXQgcHJpbnRzCisgICAgIHNvbWUgbWVzc2FnZXMgdGVsbGluZyB3aGljaCBmZWF0dXJlcyBpdCBpcyBjaGVja2luZyBmb3IuCisKKyAgMi4gVHlwZSBgbWFrZScgdG8gY29tcGlsZSB0aGUgcGFja2FnZS4KKworICAzLiBPcHRpb25hbGx5LCB0eXBlIGBtYWtlIGNoZWNrJyB0byBydW4gYW55IHNlbGYtdGVzdHMgdGhhdCBjb21lIHdpdGgKKyAgICAgdGhlIHBhY2thZ2UsIGdlbmVyYWxseSB1c2luZyB0aGUganVzdC1idWlsdCB1bmluc3RhbGxlZCBiaW5hcmllcy4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4gIFdoZW4gaW5zdGFsbGluZyBpbnRvIGEgcHJlZml4IG93bmVkIGJ5IHJvb3QsIGl0IGlzCisgICAgIHJlY29tbWVuZGVkIHRoYXQgdGhlIHBhY2thZ2UgYmUgY29uZmlndXJlZCBhbmQgYnVpbHQgYXMgYSByZWd1bGFyCisgICAgIHVzZXIsIGFuZCBvbmx5IHRoZSBgbWFrZSBpbnN0YWxsJyBwaGFzZSBleGVjdXRlZCB3aXRoIHJvb3QKKyAgICAgcHJpdmlsZWdlcy4KKworICA1LiBPcHRpb25hbGx5LCB0eXBlIGBtYWtlIGluc3RhbGxjaGVjaycgdG8gcmVwZWF0IGFueSBzZWxmLXRlc3RzLCBidXQKKyAgICAgdGhpcyB0aW1lIHVzaW5nIHRoZSBiaW5hcmllcyBpbiB0aGVpciBmaW5hbCBpbnN0YWxsZWQgbG9jYXRpb24uCisgICAgIFRoaXMgdGFyZ2V0IGRvZXMgbm90IGluc3RhbGwgYW55dGhpbmcuICBSdW5uaW5nIHRoaXMgdGFyZ2V0IGFzIGEKKyAgICAgcmVndWxhciB1c2VyLCBwYXJ0aWN1bGFybHkgaWYgdGhlIHByaW9yIGBtYWtlIGluc3RhbGwnIHJlcXVpcmVkCisgICAgIHJvb3QgcHJpdmlsZWdlcywgdmVyaWZpZXMgdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGNvbXBsZXRlZAorICAgICBjb3JyZWN0bHkuCisKKyAgNi4gWW91IGNhbiByZW1vdmUgdGhlIHByb2dyYW0gYmluYXJpZXMgYW5kIG9iamVjdCBmaWxlcyBmcm9tIHRoZQorICAgICBzb3VyY2UgY29kZSBkaXJlY3RvcnkgYnkgdHlwaW5nIGBtYWtlIGNsZWFuJy4gIFRvIGFsc28gcmVtb3ZlIHRoZQorICAgICBmaWxlcyB0aGF0IGBjb25maWd1cmUnIGNyZWF0ZWQgKHNvIHlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IKKyAgICAgYSBkaWZmZXJlbnQga2luZCBvZiBjb21wdXRlciksIHR5cGUgYG1ha2UgZGlzdGNsZWFuJy4gIFRoZXJlIGlzCisgICAgIGFsc28gYSBgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB0YXJnZXQsIGJ1dCB0aGF0IGlzIGludGVuZGVkIG1haW5seQorICAgICBmb3IgdGhlIHBhY2thZ2UncyBkZXZlbG9wZXJzLiAgSWYgeW91IHVzZSBpdCwgeW91IG1heSBoYXZlIHRvIGdldAorICAgICBhbGwgc29ydHMgb2Ygb3RoZXIgcHJvZ3JhbXMgaW4gb3JkZXIgdG8gcmVnZW5lcmF0ZSBmaWxlcyB0aGF0IGNhbWUKKyAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgIDcuIE9mdGVuLCB5b3UgY2FuIGFsc28gdHlwZSBgbWFrZSB1bmluc3RhbGwnIHRvIHJlbW92ZSB0aGUgaW5zdGFsbGVkCisgICAgIGZpbGVzIGFnYWluLiAgSW4gcHJhY3RpY2UsIG5vdCBhbGwgcGFja2FnZXMgaGF2ZSB0ZXN0ZWQgdGhhdAorICAgICB1bmluc3RhbGxhdGlvbiB3b3JrcyBjb3JyZWN0bHksIGV2ZW4gdGhvdWdoIGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQorICAgICBHTlUgQ29kaW5nIFN0YW5kYXJkcy4KKworICA4LiBTb21lIHBhY2thZ2VzLCBwYXJ0aWN1bGFybHkgdGhvc2UgdGhhdCB1c2UgQXV0b21ha2UsIHByb3ZpZGUgYG1ha2UKKyAgICAgZGlzdGNoZWNrJywgd2hpY2ggY2FuIGJ5IHVzZWQgYnkgZGV2ZWxvcGVycyB0byB0ZXN0IHRoYXQgYWxsIG90aGVyCisgICAgIHRhcmdldHMgbGlrZSBgbWFrZSBpbnN0YWxsJyBhbmQgYG1ha2UgdW5pbnN0YWxsJyB3b3JrIGNvcnJlY3RseS4KKyAgICAgVGhpcyB0YXJnZXQgaXMgZ2VuZXJhbGx5IG5vdCBydW4gYnkgZW5kIHVzZXJzLgorCitDb21waWxlcnMgYW5kIE9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PQorCisgICBTb21lIHN5c3RlbXMgcmVxdWlyZSB1bnVzdWFsIG9wdGlvbnMgZm9yIGNvbXBpbGF0aW9uIG9yIGxpbmtpbmcgdGhhdAordGhlIGBjb25maWd1cmUnIHNjcmlwdCBkb2VzIG5vdCBrbm93IGFib3V0LiAgUnVuIGAuL2NvbmZpZ3VyZSAtLWhlbHAnCitmb3IgZGV0YWlscyBvbiBzb21lIG9mIHRoZSBwZXJ0aW5lbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisgICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScgaW5pdGlhbCB2YWx1ZXMgZm9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworYnkgc2V0dGluZyB2YXJpYWJsZXMgaW4gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUgZW52aXJvbm1lbnQuICBIZXJlCitpcyBhbiBleGFtcGxlOgorCisgICAgIC4vY29uZmlndXJlIENDPWM5OSBDRkxBR1M9LWcgTElCUz0tbHBvc2l4CisKKyAgICpOb3RlIERlZmluaW5nIFZhcmlhYmxlczo6LCBmb3IgbW9yZSBkZXRhaWxzLgorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBjYW4gdXNlIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuICBUaGlzCitpcyBrbm93biBhcyBhICJWUEFUSCIgYnVpbGQuCisKKyAgIFdpdGggYSBub24tR05VIGBtYWtlJywgaXQgaXMgc2FmZXIgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lCithcmNoaXRlY3R1cmUgYXQgYSB0aW1lIGluIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZQoraW5zdGFsbGVkIHRoZSBwYWNrYWdlIGZvciBvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUKK3JlY29uZmlndXJpbmcgZm9yIGFub3RoZXIgYXJjaGl0ZWN0dXJlLgorCisgICBPbiBNYWNPUyBYIDEwLjUgYW5kIGxhdGVyIHN5c3RlbXMsIHlvdSBjYW4gY3JlYXRlIGxpYnJhcmllcyBhbmQKK2V4ZWN1dGFibGVzIHRoYXQgd29yayBvbiBtdWx0aXBsZSBzeXN0ZW0gdHlwZXMtLWtub3duIGFzICJmYXQiIG9yCisidW5pdmVyc2FsIiBiaW5hcmllcy0tYnkgc3BlY2lmeWluZyBtdWx0aXBsZSBgLWFyY2gnIG9wdGlvbnMgdG8gdGhlCitjb21waWxlciBidXQgb25seSBhIHNpbmdsZSBgLWFyY2gnIG9wdGlvbiB0byB0aGUgcHJlcHJvY2Vzc29yLiAgTGlrZQordGhpczoKKworICAgICAuL2NvbmZpZ3VyZSBDQz0iZ2NjIC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0IC1hcmNoIHBwYyAtYXJjaCBwcGM2NCIgXAorICAgICAgICAgICAgICAgICBDWFg9ImcrKyAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCAtYXJjaCBwcGMgLWFyY2ggcHBjNjQiIFwKKyAgICAgICAgICAgICAgICAgQ1BQPSJnY2MgLUUiIENYWENQUD0iZysrIC1FIgorCisgICBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb2R1Y2Ugd29ya2luZyBvdXRwdXQgaW4gYWxsIGNhc2VzLCB5b3UKK21heSBoYXZlIHRvIGJ1aWxkIG9uZSBhcmNoaXRlY3R1cmUgYXQgYSB0aW1lIGFuZCBjb21iaW5lIHRoZSByZXN1bHRzCit1c2luZyB0aGUgYGxpcG8nIHRvb2wgaWYgeW91IGhhdmUgcHJvYmxlbXMuCisKK0luc3RhbGxhdGlvbiBOYW1lcworPT09PT09PT09PT09PT09PT09CisKKyAgIEJ5IGRlZmF1bHQsIGBtYWtlIGluc3RhbGwnIGluc3RhbGxzIHRoZSBwYWNrYWdlJ3MgY29tbWFuZHMgdW5kZXIKK2AvdXNyL2xvY2FsL2JpbicsIGluY2x1ZGUgZmlsZXMgdW5kZXIgYC91c3IvbG9jYWwvaW5jbHVkZScsIGV0Yy4gIFlvdQorY2FuIHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIGAvdXNyL2xvY2FsJyBieSBnaXZpbmcKK2Bjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tcHJlZml4PVBSRUZJWCcsIHdoZXJlIFBSRUZJWCBtdXN0IGJlIGFuCithYnNvbHV0ZSBmaWxlIG5hbWUuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorcGFzcyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBSRUZJWCcgdG8gYGNvbmZpZ3VyZScsIHRoZSBwYWNrYWdlIHVzZXMKK1BSRUZJWCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHN0aWxsIHVzZSB0aGUgcmVndWxhciBwcmVmaXguCisKKyAgIEluIGFkZGl0aW9uLCBpZiB5b3UgdXNlIGFuIHVudXN1YWwgZGlyZWN0b3J5IGxheW91dCB5b3UgY2FuIGdpdmUKK29wdGlvbnMgbGlrZSBgLS1iaW5kaXI9RElSJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4gIEluIGdlbmVyYWwsIHRoZQorZGVmYXVsdCBmb3IgdGhlc2Ugb3B0aW9ucyBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YgYCR7cHJlZml4fScsIHNvIHRoYXQKK3NwZWNpZnlpbmcganVzdCBgLS1wcmVmaXgnIHdpbGwgYWZmZWN0IGFsbCBvZiB0aGUgb3RoZXIgZGlyZWN0b3J5CitzcGVjaWZpY2F0aW9ucyB0aGF0IHdlcmUgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQuCisKKyAgIFRoZSBtb3N0IHBvcnRhYmxlIHdheSB0byBhZmZlY3QgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyBpcyB0byBwYXNzIHRoZQorY29ycmVjdCBsb2NhdGlvbnMgdG8gYGNvbmZpZ3VyZSc7IGhvd2V2ZXIsIG1hbnkgcGFja2FnZXMgcHJvdmlkZSBvbmUgb3IKK2JvdGggb2YgdGhlIGZvbGxvd2luZyBzaG9ydGN1dHMgb2YgcGFzc2luZyB2YXJpYWJsZSBhc3NpZ25tZW50cyB0byB0aGUKK2BtYWtlIGluc3RhbGwnIGNvbW1hbmQgbGluZSB0byBjaGFuZ2UgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyB3aXRob3V0CitoYXZpbmcgdG8gcmVjb25maWd1cmUgb3IgcmVjb21waWxlLgorCisgICBUaGUgZmlyc3QgbWV0aG9kIGludm9sdmVzIHByb3ZpZGluZyBhbiBvdmVycmlkZSB2YXJpYWJsZSBmb3IgZWFjaAorYWZmZWN0ZWQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIGBtYWtlIGluc3RhbGwKK3ByZWZpeD0vYWx0ZXJuYXRlL2RpcmVjdG9yeScgd2lsbCBjaG9vc2UgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uIGZvciBhbGwKK2RpcmVjdG9yeSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IHdlcmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mCitgJHtwcmVmaXh9Jy4gIEFueSBkaXJlY3RvcmllcyB0aGF0IHdlcmUgc3BlY2lmaWVkIGR1cmluZyBgY29uZmlndXJlJywKK2J1dCBub3QgaW4gdGVybXMgb2YgYCR7cHJlZml4fScsIG11c3QgZWFjaCBiZSBvdmVycmlkZGVuIGF0IGluc3RhbGwKK3RpbWUgZm9yIHRoZSBlbnRpcmUgaW5zdGFsbGF0aW9uIHRvIGJlIHJlbG9jYXRlZC4gIFRoZSBhcHByb2FjaCBvZgorbWFrZWZpbGUgdmFyaWFibGUgb3ZlcnJpZGVzIGZvciBlYWNoIGRpcmVjdG9yeSB2YXJpYWJsZSBpcyByZXF1aXJlZCBieQordGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLCBhbmQgaWRlYWxseSBjYXVzZXMgbm8gcmVjb21waWxhdGlvbi4KK0hvd2V2ZXIsIHNvbWUgcGxhdGZvcm1zIGhhdmUga25vd24gbGltaXRhdGlvbnMgd2l0aCB0aGUgc2VtYW50aWNzIG9mCitzaGFyZWQgbGlicmFyaWVzIHRoYXQgZW5kIHVwIHJlcXVpcmluZyByZWNvbXBpbGF0aW9uIHdoZW4gdXNpbmcgdGhpcworbWV0aG9kLCBwYXJ0aWN1bGFybHkgbm90aWNlYWJsZSBpbiBwYWNrYWdlcyB0aGF0IHVzZSBHTlUgTGlidG9vbC4KKworICAgVGhlIHNlY29uZCBtZXRob2QgaW52b2x2ZXMgcHJvdmlkaW5nIHRoZSBgREVTVERJUicgdmFyaWFibGUuICBGb3IKK2V4YW1wbGUsIGBtYWtlIGluc3RhbGwgREVTVERJUj0vYWx0ZXJuYXRlL2RpcmVjdG9yeScgd2lsbCBwcmVwZW5kCitgL2FsdGVybmF0ZS9kaXJlY3RvcnknIGJlZm9yZSBhbGwgaW5zdGFsbGF0aW9uIG5hbWVzLiAgVGhlIGFwcHJvYWNoIG9mCitgREVTVERJUicgb3ZlcnJpZGVzIGlzIG5vdCByZXF1aXJlZCBieSB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMsIGFuZAorZG9lcyBub3Qgd29yayBvbiBwbGF0Zm9ybXMgdGhhdCBoYXZlIGRyaXZlIGxldHRlcnMuICBPbiB0aGUgb3RoZXIgaGFuZCwKK2l0IGRvZXMgYmV0dGVyIGF0IGF2b2lkaW5nIHJlY29tcGlsYXRpb24gaXNzdWVzLCBhbmQgd29ya3Mgd2VsbCBldmVuCit3aGVuIHNvbWUgZGlyZWN0b3J5IG9wdGlvbnMgd2VyZSBub3Qgc3BlY2lmaWVkIGluIHRlcm1zIG9mIGAke3ByZWZpeH0nCithdCBgY29uZmlndXJlJyB0aW1lLgorCitPcHRpb25hbCBGZWF0dXJlcworPT09PT09PT09PT09PT09PT0KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworICAgU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCitgY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KK1RoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKK2lzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCitgUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCitwYWNrYWdlIHJlY29nbml6ZXMuCisKKyAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQorZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoreW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAorYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KKworICAgU29tZSBwYWNrYWdlcyBvZmZlciB0aGUgYWJpbGl0eSB0byBjb25maWd1cmUgaG93IHZlcmJvc2UgdGhlCitleGVjdXRpb24gb2YgYG1ha2UnIHdpbGwgYmUuICBGb3IgdGhlc2UgcGFja2FnZXMsIHJ1bm5pbmcgYC4vY29uZmlndXJlCistLWVuYWJsZS1zaWxlbnQtcnVsZXMnIHNldHMgdGhlIGRlZmF1bHQgdG8gbWluaW1hbCBvdXRwdXQsIHdoaWNoIGNhbiBiZQorb3ZlcnJpZGRlbiB3aXRoIGBtYWtlIFY9MSc7IHdoaWxlIHJ1bm5pbmcgYC4vY29uZmlndXJlCistLWRpc2FibGUtc2lsZW50LXJ1bGVzJyBzZXRzIHRoZSBkZWZhdWx0IHRvIHZlcmJvc2UsIHdoaWNoIGNhbiBiZQorb3ZlcnJpZGRlbiB3aXRoIGBtYWtlIFY9MCcuCisKK1BhcnRpY3VsYXIgc3lzdGVtcworPT09PT09PT09PT09PT09PT09CisKKyAgIE9uIEhQLVVYLCB0aGUgZGVmYXVsdCBDIGNvbXBpbGVyIGlzIG5vdCBBTlNJIEMgY29tcGF0aWJsZS4gIElmIEdOVQorQ0MgaXMgbm90IGluc3RhbGxlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbgorb3JkZXIgdG8gdXNlIGFuIEFOU0kgQyBjb21waWxlcjoKKworICAgICAuL2NvbmZpZ3VyZSBDQz0iY2MgLUFlIC1EX1hPUEVOX1NPVVJDRT01MDAiCisKK2FuZCBpZiB0aGF0IGRvZXNuJ3Qgd29yaywgaW5zdGFsbCBwcmUtYnVpbHQgYmluYXJpZXMgb2YgR0NDIGZvciBIUC1VWC4KKworICAgSFAtVVggYG1ha2UnIHVwZGF0ZXMgdGFyZ2V0cyB3aGljaCBoYXZlIHRoZSBzYW1lIHRpbWUgc3RhbXBzIGFzCit0aGVpciBwcmVyZXF1aXNpdGVzLCB3aGljaCBtYWtlcyBpdCBnZW5lcmFsbHkgdW51c2FibGUgd2hlbiBzaGlwcGVkCitnZW5lcmF0ZWQgZmlsZXMgc3VjaCBhcyBgY29uZmlndXJlJyBhcmUgaW52b2x2ZWQuICBVc2UgR05VIGBtYWtlJworaW5zdGVhZC4KKworICAgT24gT1NGLzEgYS5rLmEuIFRydTY0LCBzb21lIHZlcnNpb25zIG9mIHRoZSBkZWZhdWx0IEMgY29tcGlsZXIgY2Fubm90CitwYXJzZSBpdHMgYDx3Y2hhci5oPicgaGVhZGVyIGZpbGUuICBUaGUgb3B0aW9uIGAtbm9kdGsnIGNhbiBiZSB1c2VkIGFzCithIHdvcmthcm91bmQuICBJZiBHTlUgQ0MgaXMgbm90IGluc3RhbGxlZCwgaXQgaXMgdGhlcmVmb3JlIHJlY29tbWVuZGVkCit0byB0cnkKKworICAgICAuL2NvbmZpZ3VyZSBDQz0iY2MiCisKK2FuZCBpZiB0aGF0IGRvZXNuJ3Qgd29yaywgdHJ5CisKKyAgICAgLi9jb25maWd1cmUgQ0M9ImNjIC1ub2R0ayIKKworICAgT24gU29sYXJpcywgZG9uJ3QgcHV0IGAvdXNyL3VjYicgZWFybHkgaW4geW91ciBgUEFUSCcuICBUaGlzCitkaXJlY3RvcnkgY29udGFpbnMgc2V2ZXJhbCBkeXNmdW5jdGlvbmFsIHByb2dyYW1zOyB3b3JraW5nIHZhcmlhbnRzIG9mCit0aGVzZSBwcm9ncmFtcyBhcmUgYXZhaWxhYmxlIGluIGAvdXNyL2JpbicuICBTbywgaWYgeW91IG5lZWQgYC91c3IvdWNiJworaW4geW91ciBgUEFUSCcsIHB1dCBpdCBfYWZ0ZXJfIGAvdXNyL2JpbicuCisKKyAgIE9uIEhhaWt1LCBzb2Z0d2FyZSBpbnN0YWxsZWQgZm9yIGFsbCB1c2VycyBnb2VzIGluIGAvYm9vdC9jb21tb24nLAorbm90IGAvdXNyL2xvY2FsJy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgICAgLi9jb25maWd1cmUgLS1wcmVmaXg9L2Jvb3QvY29tbW9uCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW5ub3QgZmlndXJlIG91dAorYXV0b21hdGljYWxseSwgYnV0IG5lZWRzIHRvIGRldGVybWluZSBieSB0aGUgdHlwZSBvZiBtYWNoaW5lIHRoZSBwYWNrYWdlCit3aWxsIHJ1biBvbi4gIFVzdWFsbHksIGFzc3VtaW5nIHRoZSBwYWNrYWdlIGlzIGJ1aWx0IHRvIGJlIHJ1biBvbiB0aGUKK19zYW1lXyBhcmNoaXRlY3R1cmVzLCBgY29uZmlndXJlJyBjYW4gZmlndXJlIHRoYXQgb3V0LCBidXQgaWYgaXQgcHJpbnRzCithIG1lc3NhZ2Ugc2F5aW5nIGl0IGNhbm5vdCBndWVzcyB0aGUgbWFjaGluZSB0eXBlLCBnaXZlIGl0IHRoZQorYC0tYnVpbGQ9VFlQRScgb3B0aW9uLiAgVFlQRSBjYW4gZWl0aGVyIGJlIGEgc2hvcnQgbmFtZSBmb3IgdGhlIHN5c3RlbQordHlwZSwgc3VjaCBhcyBgc3VuNCcsIG9yIGEgY2Fub25pY2FsIG5hbWUgd2hpY2ggaGFzIHRoZSBmb3JtOgorCisgICAgIENQVS1DT01QQU5ZLVNZU1RFTQorCit3aGVyZSBTWVNURU0gY2FuIGhhdmUgb25lIG9mIHRoZXNlIGZvcm1zOgorCisgICAgIE9TCisgICAgIEtFUk5FTC1PUworCisgICBTZWUgdGhlIGZpbGUgYGNvbmZpZy5zdWInIGZvciB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGVhY2ggZmllbGQuICBJZgorYGNvbmZpZy5zdWInIGlzbid0IGluY2x1ZGVkIGluIHRoaXMgcGFja2FnZSwgdGhlbiB0aGlzIHBhY2thZ2UgZG9lc24ndAorbmVlZCB0byBrbm93IHRoZSBtYWNoaW5lIHR5cGUuCisKKyAgIElmIHlvdSBhcmUgX2J1aWxkaW5nXyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3Ugc2hvdWxkCit1c2UgdGhlIG9wdGlvbiBgLS10YXJnZXQ9VFlQRScgdG8gc2VsZWN0IHRoZSB0eXBlIG9mIHN5c3RlbSB0aGV5IHdpbGwKK3Byb2R1Y2UgY29kZSBmb3IuCisKKyAgIElmIHlvdSB3YW50IHRvIF91c2VfIGEgY3Jvc3MgY29tcGlsZXIsIHRoYXQgZ2VuZXJhdGVzIGNvZGUgZm9yIGEKK3BsYXRmb3JtIGRpZmZlcmVudCBmcm9tIHRoZSBidWlsZCBwbGF0Zm9ybSwgeW91IHNob3VsZCBzcGVjaWZ5IHRoZQorImhvc3QiIHBsYXRmb3JtIChpLmUuLCB0aGF0IG9uIHdoaWNoIHRoZSBnZW5lcmF0ZWQgcHJvZ3JhbXMgd2lsbAorZXZlbnR1YWxseSBiZSBydW4pIHdpdGggYC0taG9zdD1UWVBFJy4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitEZWZpbmluZyBWYXJpYWJsZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBWYXJpYWJsZXMgbm90IGRlZmluZWQgaW4gYSBzaXRlIHNoZWxsIHNjcmlwdCBjYW4gYmUgc2V0IGluIHRoZQorZW52aXJvbm1lbnQgcGFzc2VkIHRvIGBjb25maWd1cmUnLiAgSG93ZXZlciwgc29tZSBwYWNrYWdlcyBtYXkgcnVuCitjb25maWd1cmUgYWdhaW4gZHVyaW5nIHRoZSBidWlsZCwgYW5kIHRoZSBjdXN0b21pemVkIHZhbHVlcyBvZiB0aGVzZQordmFyaWFibGVzIG1heSBiZSBsb3N0LiAgSW4gb3JkZXIgdG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB5b3Ugc2hvdWxkIHNldAordGhlbSBpbiB0aGUgYGNvbmZpZ3VyZScgY29tbWFuZCBsaW5lLCB1c2luZyBgVkFSPXZhbHVlJy4gIEZvciBleGFtcGxlOgorCisgICAgIC4vY29uZmlndXJlIENDPS91c3IvbG9jYWwyL2Jpbi9nY2MKKworY2F1c2VzIHRoZSBzcGVjaWZpZWQgYGdjYycgdG8gYmUgdXNlZCBhcyB0aGUgQyBjb21waWxlciAodW5sZXNzIGl0IGlzCitvdmVycmlkZGVuIGluIHRoZSBzaXRlIHNoZWxsIHNjcmlwdCkuCisKK1VuZm9ydHVuYXRlbHksIHRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHdvcmsgZm9yIGBDT05GSUdfU0hFTEwnIGR1ZSB0bworYW4gQXV0b2NvbmYgbGltaXRhdGlvbi4gIFVudGlsIHRoZSBsaW1pdGF0aW9uIGlzIGxpZnRlZCwgeW91IGNhbiB1c2UKK3RoaXMgd29ya2Fyb3VuZDoKKworICAgICBDT05GSUdfU0hFTEw9L2Jpbi9iYXNoIC4vY29uZmlndXJlIENPTkZJR19TSEVMTD0vYmluL2Jhc2gKKworYGNvbmZpZ3VyZScgSW52b2NhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWhlbHAnCitgLWgnCisgICAgIFByaW50IGEgc3VtbWFyeSBvZiBhbGwgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgorCitgLS1oZWxwPXNob3J0JworYC0taGVscD1yZWN1cnNpdmUnCisgICAgIFByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlJ3MKKyAgICAgYGNvbmZpZ3VyZScsIGFuZCBleGl0LiAgVGhlIGBzaG9ydCcgdmFyaWFudCBsaXN0cyBvcHRpb25zIHVzZWQKKyAgICAgb25seSBpbiB0aGUgdG9wIGxldmVsLCB3aGlsZSB0aGUgYHJlY3Vyc2l2ZScgdmFyaWFudCBsaXN0cyBvcHRpb25zCisgICAgIGFsc28gcHJlc2VudCBpbiBhbnkgbmVzdGVkIHBhY2thZ2VzLgorCitgLS12ZXJzaW9uJworYC1WJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgLS1jYWNoZS1maWxlPUZJTEUnCisgICAgIEVuYWJsZSB0aGUgY2FjaGU6IHVzZSBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgaW4gRklMRSwKKyAgICAgdHJhZGl0aW9uYWxseSBgY29uZmlnLmNhY2hlJy4gIEZJTEUgZGVmYXVsdHMgdG8gYC9kZXYvbnVsbCcgdG8KKyAgICAgZGlzYWJsZSBjYWNoaW5nLgorCitgLS1jb25maWctY2FjaGUnCitgLUMnCisgICAgIEFsaWFzIGZvciBgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScuCisKK2AtLXF1aWV0JworYC0tc2lsZW50JworYC1xJworICAgICBEbyBub3QgcHJpbnQgbWVzc2FnZXMgc2F5aW5nIHdoaWNoIGNoZWNrcyBhcmUgYmVpbmcgbWFkZS4gIFRvCisgICAgIHN1cHByZXNzIGFsbCBub3JtYWwgb3V0cHV0LCByZWRpcmVjdCBpdCB0byBgL2Rldi9udWxsJyAoYW55IGVycm9yCisgICAgIG1lc3NhZ2VzIHdpbGwgc3RpbGwgYmUgc2hvd24pLgorCitgLS1zcmNkaXI9RElSJworICAgICBMb29rIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGluIGRpcmVjdG9yeSBESVIuICBVc3VhbGx5CisgICAgIGBjb25maWd1cmUnIGNhbiBkZXRlcm1pbmUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KKworYC0tcHJlZml4PURJUicKKyAgICAgVXNlIERJUiBhcyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeC4gICpub3RlIEluc3RhbGxhdGlvbiBOYW1lczo6CisgICAgIGZvciBtb3JlIGRldGFpbHMsIGluY2x1ZGluZyBvdGhlciBvcHRpb25zIGF2YWlsYWJsZSBmb3IgZmluZS10dW5pbmcKKyAgICAgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMuCisKK2AtLW5vLWNyZWF0ZScKK2AtbicKKyAgICAgUnVuIHRoZSBjb25maWd1cmUgY2hlY2tzLCBidXQgc3RvcCBiZWZvcmUgY3JlYXRpbmcgYW55IG91dHB1dAorICAgICBmaWxlcy4KKworYGNvbmZpZ3VyZScgYWxzbyBhY2NlcHRzIHNvbWUgb3RoZXIsIG5vdCB3aWRlbHkgdXNlZnVsLCBvcHRpb25zLiAgUnVuCitgY29uZmlndXJlIC0taGVscCcgZm9yIG1vcmUgZGV0YWlscy4KZGlmZiAtLWdpdCBhL0lOU1RBTEwuRklQUyBiL0lOU1RBTEwuRklQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdlMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTC5GSVBTCkBAIC0wLDAgKzEsMjUgQEAKK3N0dW5uZWwgRklQUyBpbnN0YWxsIG5vdGVzCisKKworVW5peCBIT1dUTzoKKyogT25seSBkeW5hbWljIGxpbmtpbmcgb2YgdGhlIEZJUFMtZW5hYmxlZCBPcGVuU1NMIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQsCisgIGkuZS4gRklQUy1lbmFibGVkIE9wZW5TU0wgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCAic2hhcmVkIiBwYXJhbWV0ZXIuCisqIEZJUFMgbW9kZSBpcyBhdXRvZGV0ZWN0ZWQgaWYgcG9zc2libGUuICBJdCBjYW4gYmUgZm9yY2VkIHdpdGg6CisgICAgLi9jb25maWd1cmUgLS1lbmFibGUtZmlwcworICBvciBkaXNhYmxlIHdpdGg6CisgICAgLi9jb25maWd1cmUgLS1kaXNhYmxlLWZpcHMKKworV0lOMzIgSE9XVE86CisqIE9uIDMyLWJpdCBXaW5kb3dzIGluc3RhbGwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICAtIE1TVkMgOC4wIChWUyAyMDA1KSBTdGFuZGFyZCBvciBQcm9mZXNzaW9uYWwgRWRpdGlvbgorICAtIE1TVkMgOS4wIChWUyAyMDA4KSBhbnkgZWRpdGlvbiBpbmNsdWRpbmcgRXhwcmVzcyBFZGl0aW9uCisqIE9uIDY0LWJpdCBXaW5kb3dzIGluc3RhbGwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcGlsZXJzOgorICAtIE1TVkMgOC4wIChWUyAyMDA1KSBTdGFuZGFyZCBvciBQcm9mZXNzaW9uYWwgRWRpdGlvbgorICAtIE1TVkMgOS4wIChWUyAyMDA4KSBTdGFuZGFyZCBvciBQcm9mZXNzaW9uYWwgRWRpdGlvbgorKiBCdWlsZCBGSVBTLWNvbXBsaWFudCBPcGVuU1NMIERMTFMgYWNjb3JkaW5nIHRvOgorICBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2ZpcHMvVXNlckd1aWRlLTIuMC5wZGYKKyogQnVpbGQgc3R1bm5lbCBub3JtYWxseSB3aXRoIE1TVkMgb3IgTWluZ3cuCisgIE1pbmd3IGJ1aWxkIHJlcXVpcmVzIERMTCBzdHVicy4gIFN0dWJzIGNhbiBiZSBidWlsdCB3aXRoOgorICBkbGx0b29sIC0tZGVmIG1zL2xpYmVheTMyLmRlZiAtLW91dHB1dC1saWIgbGliY3J5cHRvLmEKKyAgZGxsdG9vbCAtLWRlZiBtcy9zc2xlYXkzMi5kZWYgLS1vdXRwdXQtbGliIGxpYnNzbC5hCisKZGlmZiAtLWdpdCBhL0lOU1RBTEwuVzMyIGIvSU5TVEFMTC5XMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ODkyMAotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwuVzMyCkBAIC0wLDAgKzEsNTEgQEAKK3N0dW5uZWwgV2luZG93cyBpbnN0YWxsIG5vdGVzDQorDQorDQorQnVpbGRpbmcgc3R1bm5lbCBmcm9tIHNvdXJjZSAob3B0aW9uYWwpOg0KKw0KKyAxKSBJbnN0YWxsIG1pbmd3MzIgY3Jvc3MtY29tcGlsZXIgbyBhIFVuaXgvTGludXggbWFjaGluZS4NCisgICAgSW4gRGViaWFuIGFsbCB5b3UgbmVlZCBpczoNCisgICAgICBhcHQtZ2V0IGluc3RhbGwgZ2NjLW1pbmd3LXc2NC1pNjg2DQorICAgIE5hdGl2ZSBjb21waWxhdGlvbiBvbiBhIFdpbmRvd3MgbWFjaGluZSBpcyBwb3NzaWJsZSwgYnV0IG5vdCBzdXBwb3J0ZWQuDQorDQorIDIpIERvd25sb2FkIHRoZSByZWNlbnQgemxpYiBmcm9tIGh0dHA6Ly93d3cuemxpYi5uZXQvDQorICAgIFVwZGF0ZSB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGluIHdpbjMyL01ha2VmaWxlLmdjYyBmaWxlOg0KKyAgICAgIFNIQVJFRF9NT0RFPTENCisgICAgICBQUkVGSVggPSBpNjg2LXc2NC1taW5ndzMyLQ0KKyAgICB0aGVuIGJ1aWxkIHpsaWIgd2l0aDoNCisgICAgICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmdjYw0KKyAgICBhbmQgaW5zdGFsbCBpdCBpbiBtaW5ndzMyIHRyZWU6DQorICAgICAgc3VkbyBCSU5BUllfUEFUSD1+LyBcDQorICAgICAgICBJTkNMVURFX1BBVEg9L3Vzci9pNjg2LXc2NC1taW5ndzMyL2luY2x1ZGUvIFwNCisgICAgICAgIExJQlJBUllfUEFUSD0vdXNyL2k2ODYtdzY0LW1pbmd3MzIvbGliLyBcDQorICAgICAgICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmdjYyBpbnN0YWxsDQorDQorIDMpIERvd25sb2FkIHRoZSByZWNlbnQgT3BlblNTTCBpbiB1bnBhY2sgaXQgdG8gL3Vzci9zcmMvIGRpcmVjdG9yeS4NCisgICAgICBjZCAvdXNyL3NyYw0KKyAgICAgIHRhciB6dnhmIH4vb3BlbnNzbC0odmVyc2lvbikudGFyLmd6DQorICAgICAgbXYgb3BlbnNzbC0odmVyc2lvbikgb3BlbnNzbC0odmVyc2lvbiktaTY4Ng0KKw0KKyA0KSBCdWlsZCBPcGVuU1NMLg0KKyAgICAgIC4vQ29uZmlndXJlIC0tY3Jvc3MtY29tcGlsZS1wcmVmaXg9aTY4Ni13NjQtbWluZ3czMi0gbWluZ3cgc2hhcmVkIHpsaWItZHluYW1pYw0KKyAgICAgIG1ha2UNCisNCisgNSkgRG93bmxvYWQgYW5kIHVucGFjayBzdHVubmVsLSh2ZXJzaW9uKS50YXIuZ3ouDQorDQorIDYpIENvbmZpZ3VyZSBzdHVubmVsLg0KKyAgICAgIGNkIHN0dW5uZWwtKHZlcnNpb24pDQorICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vcGF0aC90by9vcGVuc3NsLSh2ZXJzaW9uKQ0KKw0KKyA3KSBCdWlsZCB3aW5kb3dzIGV4ZWN1dGFibGUuDQorICAgICAgY2Qgc3JjDQorICAgICAgbWFrZSBzdHVubmVsLmV4ZQ0KKw0KKw0KK0luc3RhbGxpbmcgc3R1bm5lbDoNCisNCisgMSkgcnVuIGluc3RhbGxlciB0byBpbnN0YWxsIHByZWNvbXBpbGVkIGJpbmFyaWVzIG9yIGNvcHkgc3R1bm5lbC5leGUgYW5kDQorICAgIE9wZW5TU0wgRExMcyBpbnRvIGEgZGlyZWN0b3J5DQorDQorIDIpIHJlYWQgdGhlIG1hbnVhbCAoc3R1bm5lbC5odG1sKQ0KKw0KKyAzKSBjcmVhdGUvZWRpdCBzdHVubmVsLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlDQorDQpkaWZmIC0tZ2l0IGEvSU5TVEFMTC5XQ0UgYi9JTlNUQUxMLldDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjdhYTYzCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTC5XQ0UKQEAgLTAsMCArMSw0NSBAQAorc3R1bm5lbCBXaW5kb3dzIENFIGluc3RhbGwgbm90ZXMNCisNCisNCitUd28gc3R1bm5lbCBleGVjdXRhYmxlcyBhcmUgYXZhaWxhYmxlIGZvciBXaW5kb3dzIENFIHBsYXRmb3JtOg0KKw0KKyAgMSkgc3R1bm5lbC5leGUgLSB2ZXJzaW9uIHdpdGggaW50ZXJhY3RpdmUgR1VJDQorDQorICAyKSB0c3R1bm5lbC5leGUgLSBub24taXRlcmFjdGl2ZSB2ZXJzaW9uIGZvciBoZWFkbGVzcyBkZXZpY2VzDQorDQorDQorQnVpbGRpbmcgc3R1bm5lbCBmcm9tIHNvdXJjZSAob3B0aW9uYWwpOg0KKw0KKyAgMSkgaW5zdGFsbCB0aGUgZm9sbG93aW5nIHRvb2xzOg0KKyAgICAgZXZ0MjAwMndlYl9taW4uZXhlIGZyb20gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tLw0KKyAgICAgQWN0aXZlUGVybCBmcm9tIGh0dHA6Ly93d3cuYWN0aXZlc3RhdGUuY29tL1Byb2R1Y3RzL0FjdGl2ZVBlcmwvDQorICAgICB1bnppcC5leGUgKGZpbGUgbmVlZHMgdG8gYmUgcmVuYW1lZCkgZnJvbQ0KKyAgICAgICBodHRwOi8vd3d3Lm1pcnJvcnNlcnZpY2Uub3JnL3NpdGVzL2Z0cC5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvV0lOMzIvDQorDQorICAyKSBkb3dubG9hZCB0aGUgT3BlblNTTCBzb3VyY2UgZmlsZXMgKHRoZSB3aG9sZSBkaXJlY3RvcnkpOg0KKyAgICAgZnRwOi8vZnRwLnN0dW5uZWwub3JnL3N0dW5uZWwvb3BlbnNzbC9jZS8NCisgIA0KKyAgMykgeW91ciBkaXJlY3Rvcnkgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOg0KKyAgICAgYnVpbGQuYmF0DQorICAgICBidWlsZC5wbA0KKyAgICAgdW56aXAuZXhlDQorICAgICBzcmNcb3BlbnNzbC0wLjkuOGEuemlwDQorICAgICBzcmNcd2NlY29tcGF0LTEuMi56aXANCisNCisgIDQpIHR5cGUgImJ1aWxkIiB0byBidWlsZCBPcGVuU1NMDQorDQorICA1KSBkb3dubG9hZCBhbmQgdW5wYWNrIHN0dW5uZWwtKHZlcnNpb24pLnRhci5neg0KKw0KKyAgNCkgZW50ZXIgInN0dW5uZWwtKHZlcnNpb24pXHNyYyIgc3ViZGlyZWN0b3J5DQorDQorICA1KSB0eXBlICJtYWtlY2UiIHRvIGJ1aWxkIHN0dW5uZWwNCisNCisNCitJbnN0YWxsaW5nIHN0dW5uZWw6DQorDQorICAxKSBjb3B5IE9wZW5TU0wgRExMcyBhbmQgc3R1bm5lbC5leGUgb3IgdHN0dW5uZWwuZXhlIGludG8gXHN0dW5uZWwgZGlyZWN0b3J5DQorDQorICAyKSByZWFkIHRoZSBtYW51YWwgKHN0dW5uZWwuaHRtbCkNCisNCisgIDMpIGNyZWF0ZS9lZGl0IHN0dW5uZWwuY29uZiBjb25maWd1cmF0aW9uIGZpbGUNCisNCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmY0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU2IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKKworU1VCRElSUyA9IHNyYyBkb2MgdG9vbHMKKworTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK2xpYnRvb2w6ICQoTElCVE9PTF9ERVBTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBsaWJ0b29sCisKK0VYVFJBX0RJU1QgPSBQT1JUUyBCVUdTIENPUFlSSUdIVC5HUEwgQ1JFRElUUworRVhUUkFfRElTVCArPSBJTlNUQUxMLlczMiBJTlNUQUxMLldDRSBJTlNUQUxMLkZJUFMKK0VYVFJBX0RJU1QgKz0gYnVpbGQtYW5kcm9pZC5zaAorCitkb2NkaXIgPSAkKGRhdGFkaXIpL2RvYy9zdHVubmVsCitkb2NfREFUQSA9IElOU1RBTEwgUkVBRE1FIFRPRE8gQ09QWUlORyBBVVRIT1JTIENoYW5nZUxvZworZG9jX0RBVEEgKz0gUE9SVFMgQlVHUyBDT1BZUklHSFQuR1BMIENSRURJVFMKK2RvY19EQVRBICs9IElOU1RBTEwuVzMyIElOU1RBTEwuV0NFIElOU1RBTEwuRklQUworCitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC10eXBlIGYgLWV4ZWMgc2ggLWMgJ3Rlc3QgLWYgJChzcmNkaXIpL3t9IHx8IGVjaG8ge30nICc7JworCitkaXN0Y2xlYW4tbG9jYWw6CisJcm0gLXJmIGF1dG9tNHRlLmNhY2hlCisjCXJtIC1mICQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZQorCisjZGlzdC1ob29rOgorIwltYWtlbnNpcyAtTk9DRCAtRFZFUlNJT049JHtWRVJTSU9OfSAtRFNSQ0RJUj0kKHNyY2RpcikgXAorIwkJLURPUEVOU1NMPS91c3Ivc3JjL29wZW5zc2wtMC45Ljh1LWZpcHMvb3V0MzJkbGwgXAorIwkJLURaTElCPS91c3Ivc3JjL3psaWItMS4yLjgtaTU4NiBcCisjCQkkKHNyY2RpcikvdG9vbHMvc3R1bm5lbC5uc2kKKworCitzaWduOiBkaXN0CisJY3AgLWYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKS1pbnN0YWxsZXIuZXhlICQoZGlzdGRpciktYW5kcm9pZC56aXAgLi4vZGlzdAorCWdwZy1hZ2VudCAtLWRhZW1vbiAvYmluL3NoIC1jICJjZCAuLi9kaXN0OyBncGcgLS15ZXMgLS1hcm1vciAtLWRldGFjaC1zaWduIC0tZm9yY2UtdjMtc2lncyAkKGRpc3RkaXIpLnRhci5nejsgZ3BnIC0teWVzIC0tYXJtb3IgLS1kZXRhY2gtc2lnbiAtLWZvcmNlLXYzLXNpZ3MgJChkaXN0ZGlyKS1pbnN0YWxsZXIuZXhlOyBncGcgLS15ZXMgLS1hcm1vciAtLWRldGFjaC1zaWduIC0tZm9yY2UtdjMtc2lncyAkKGRpc3RkaXIpLWFuZHJvaWQuemlwIgorCXNoYTI1NnN1bSAkKGRpc3RkaXIpLnRhci5neiA+Li4vZGlzdC8kKGRpc3RkaXIpLnRhci5nei5zaGEyNTYKKwlzaGEyNTZzdW0gJChkaXN0ZGlyKS1pbnN0YWxsZXIuZXhlID4uLi9kaXN0LyQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZS5zaGEyNTYKKwlzaGEyNTZzdW0gJChkaXN0ZGlyKS1hbmRyb2lkLnppcCA+Li4vZGlzdC8kKGRpc3RkaXIpLWFuZHJvaWQuemlwLnNoYTI1NgorCWNhdCAuLi9kaXN0LyQoZGlzdGRpcikqLnNoYTI1NiB8IHRhYworCitjZXJ0OgorCSQoTUFLRSkgLUMgdG9vbHMgY2VydAorCitpbnN0YWxsLWRhdGEtaG9vazoKKwlAZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCUBlY2hvICIqIFR5cGUgJ21ha2UgY2VydCcgdG8gYWxzbyBpbnN0YWxsIGEgc2FtcGxlIGNlcnRpZmljYXRlICoiCisJQGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZWRpdCA9IHNlZCBcCisJLWUgJ3N8QGJpbmRpcltAXXwkKGJpbmRpcil8ZycgXAorCS1lICdzfEBzeXNjb25mZGlyW0BdfCQoc3lzY29uZmRpcil8ZycKKworc3R1bm5lbC5wb2Q6IE1ha2VmaWxlCisJJChlZGl0KSAnJChzcmNkaXIpLyRALmluJyA+JEAKKworc3R1bm5lbC5wb2Q6ICQoc3JjZGlyKS9zdHVubmVsLnBvZApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU4ODBhCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw4OTUgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTQuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK2FtX19pc19nbnVfbWFrZSA9IHRlc3QgLW4gJyQoTUFLRUZJTEVfTElTVCknICYmIHRlc3QgLW4gJyQoTUFLRUxFVkVMKScKK2FtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24gPSBcCisgIGNhc2UgJCR7dGFyZ2V0X29wdGlvbi19IGluIFwKKyAgICAgID8pIDs7IFwKKyAgICAgICopIGVjaG8gImFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb246IGludGVybmFsIGVycm9yOiBpbnZhbGlkIiBcCisgICAgICAgICAgICAgICJ0YXJnZXQgb3B0aW9uICckJHt0YXJnZXRfb3B0aW9uLX0nIHNwZWNpZmllZCIgPiYyOyBcCisgICAgICAgICBleGl0IDE7OyBcCisgIGVzYWM7IFwKKyAgaGFzX29wdD1ubzsgXAorICBzYW5lX21ha2VmbGFncz0kJE1BS0VGTEFHUzsgXAorICBpZiAkKGFtX19pc19nbnVfbWFrZSk7IHRoZW4gXAorICAgIHNhbmVfbWFrZWZsYWdzPSQkTUZMQUdTOyBcCisgIGVsc2UgXAorICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAorICAgICAgKlxcW1wgXAldKikgXAorICAgICAgICBicz1cXDsgXAorICAgICAgICBzYW5lX21ha2VmbGFncz1gcHJpbnRmICclc1xuJyAiJCRNQUtFRkxBR1MiIFwKKyAgICAgICAgICB8IHNlZCAicy8kJGJzJCRic1skJGJzICQkYnMJXSovL2ciYDs7IFwKKyAgICBlc2FjOyBcCisgIGZpOyBcCisgIHNraXBfbmV4dD1ubzsgXAorICBzdHJpcF90cmFpbG9wdCAoKSBcCisgIHsgXAorICAgIGZsZz1gcHJpbnRmICclc1xuJyAiJCRmbGciIHwgc2VkICJzLyQkMS4qJCQvLyJgOyBcCisgIH07IFwKKyAgZm9yIGZsZyBpbiAkJHNhbmVfbWFrZWZsYWdzOyBkbyBcCisgICAgdGVzdCAkJHNraXBfbmV4dCA9IHllcyAmJiB7IHNraXBfbmV4dD1ubzsgY29udGludWU7IH07IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICo9KnwtLSopIGNvbnRpbnVlOzsgXAorICAgICAgICAtKkkpIHN0cmlwX3RyYWlsb3B0ICdJJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qST8qKSBzdHJpcF90cmFpbG9wdCAnSSc7OyBcCisgICAgICAgIC0qTykgc3RyaXBfdHJhaWxvcHQgJ08nOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpPPyopIHN0cmlwX3RyYWlsb3B0ICdPJzs7IFwKKyAgICAgICAgLSpsKSBzdHJpcF90cmFpbG9wdCAnbCc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKmw/Kikgc3RyaXBfdHJhaWxvcHQgJ2wnOzsgXAorICAgICAgLVtkRURtXSkgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC1bSlRdKSBza2lwX25leHQ9eWVzOzsgXAorICAgIGVzYWM7IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICokJHRhcmdldF9vcHRpb24qKSBoYXNfb3B0PXllczsgYnJlYWs7OyBcCisgICAgZXNhYzsgXAorICBkb25lOyBcCisgIHRlc3QgJCRoYXNfb3B0ID0geWVzCithbV9fbWFrZV9kcnlydW4gPSAodGFyZ2V0X29wdGlvbj1uOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorYW1fX21ha2Vfa2VlcGdvaW5nID0gKHRhcmdldF9vcHRpb249azsgJChhbV9fbWFrZV9ydW5uaW5nX3dpdGhfb3B0aW9uKSkKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IC4KK0RJU1RfQ09NTU9OID0gSU5TVEFMTCBORVdTIFJFQURNRSBBVVRIT1JTIENoYW5nZUxvZyBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChhbV9fY29uZmlndXJlX2RlcHMpIENPUFlJTkcgVE9ETyBcCisJYXV0by9jb21waWxlIGF1dG8vY29uZmlnLmd1ZXNzIGF1dG8vY29uZmlnLnN1YiBhdXRvL2RlcGNvbXAgXAorCWF1dG8vaW5zdGFsbC1zaCBhdXRvL21pc3NpbmcgYXV0by9sdG1haW4uc2ggXAorCSQodG9wX3NyY2RpcikvYXV0by9jb21waWxlICQodG9wX3NyY2RpcikvYXV0by9jb25maWcuZ3Vlc3MgXAorCSQodG9wX3NyY2RpcikvYXV0by9jb25maWcuc3ViICQodG9wX3NyY2RpcikvYXV0by9pbnN0YWxsLXNoIFwKKwkkKHRvcF9zcmNkaXIpL2F1dG8vbHRtYWluLnNoICQodG9wX3NyY2RpcikvYXV0by9taXNzaW5nCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfY29tcGlsZV9mbGFncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfbGlua19mbGFncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jaGVja19jb21waWxlX2ZsYWcubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2hlY2tfbGlua19mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X3B0aHJlYWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcmVxdWlyZV9kZWZpbmVkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCAkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCithbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAorIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitBTV9WX1AgPSAkKGFtX192X1BfQEFNX1ZAKQorYW1fX3ZfUF8gPSAkKGFtX192X1BfQEFNX0RFRkFVTFRfVkApCithbV9fdl9QXzAgPSBmYWxzZQorYW1fX3ZfUF8xID0gOgorQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCithbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCithbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICAgIiAkQDsKK2FtX192X0dFTl8xID0gCitBTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCithbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfYXRfMCA9IEAKK2FtX192X2F0XzEgPSAKK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgY3Njb3BlbGlzdC1yZWN1cnNpdmUgXAorCWN0YWdzLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIGh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWluZm8tcmVjdXJzaXZlIGluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgcHMtcmVjdXJzaXZlIFwKKwl0YWdzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYworYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoZG9jZGlyKSIKK0RBVEEgPSAkKGRvY19EQVRBKQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorYW1fX3JlY3Vyc2l2ZV90YXJnZXRzID0gXAorICAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBcCisgICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpIFwKKyAgJChhbV9fZXh0cmFfcmVjdXJzaXZlX3RhcmdldHMpCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoYW1fX3JlY3Vyc2l2ZV90YXJnZXRzOi1yZWN1cnNpdmU9KSBUQUdTIENUQUdTIFwKKwljc2NvcGUgZGlzdGRpciBkaXN0IGRpc3QtYWxsIGRpc3RjaGVjaworYW1fX3RhZ2dlZF9maWxlcyA9ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKFRBR1NfRklMRVMpICQoTElTUCkKKyMgUmVhZCBhIGxpc3Qgb2YgbmV3bGluZS1zZXBhcmF0ZWQgc3RyaW5ncyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKKyMgYW5kIHByaW50IGVhY2ggb2YgdGhlbSBvbmNlLCB3aXRob3V0IGR1cGxpY2F0ZXMuICBJbnB1dCBvcmRlciBpcworIyAqbm90KiBwcmVzZXJ2ZWQuCithbV9fdW5pcXVpZnlfaW5wdXQgPSAkKEFXSykgJ1wKKyAgQkVHSU4geyBub25lbXB0eSA9IDA7IH0gXAorICB7IGl0ZW1zWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGl0ZW1zKSBwcmludCBpOyB9OyB9IFwKKycKKyMgTWFrZSBzdXJlIHRoZSBsaXN0IG9mIHNvdXJjZXMgaXMgdW5pcXVlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwKKyMgZS5nLiwgdGhlIHNhbWUgc291cmNlIGZpbGUgbWlnaHQgYmUgc2hhcmVkIGFtb25nIF9TT1VSQ0VTIHZhcmlhYmxlcworIyBmb3IgZGlmZmVyZW50IHByb2dyYW1zL2xpYnJhcmllcy4KK2FtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMgPSBcCisgIGxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCisgIHVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisgIGRvbmUgfCAkKGFtX191bmlxdWlmeV9pbnB1dClgCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitDU0NPUEUgPSBjc2NvcGUKK0RJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKK2FtX19yZW1vdmVfZGlzdGRpciA9IFwKKyAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKSI7IHRoZW4gXAorICAgIGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAorICAgICAgJiYgcm0gLXJmICIkKGRpc3RkaXIpIiBcCisgICAgICB8fCB7IHNsZWVwIDUgJiYgcm0gLXJmICIkKGRpc3RkaXIpIjsgfTsgXAorICBlbHNlIDo7IGZpCithbV9fcG9zdF9yZW1vdmVfZGlzdGRpciA9ICQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKK0daSVBfRU5WID0gLS1iZXN0CitESVNUX1RBUkdFVFMgPSBkaXN0LWd6aXAKK2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK2FtX19kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSBcCisgIHwgc2VkICdzfF5cLi98JChwcmVmaXgpL3wnIHwgZ3JlcCAtdiAnJChpbmZvZGlyKS9kaXIkJCcKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZBVUxUX0dST1VQID0gQERFRkFVTFRfR1JPVVBACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOSUZFU1RfVE9PTCA9IEBNQU5JRkVTVF9UT09MQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQVEhSRUFEX0NDID0gQFBUSFJFQURfQ0NACitQVEhSRUFEX0NGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AKK1BUSFJFQURfTElCUyA9IEBQVEhSRUFEX0xJQlNACitSQU5ET01fRklMRSA9IEBSQU5ET01fRklMRUAKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NTTERJUiA9IEBTU0xESVJACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2F4X3B0aHJlYWRfY29uZmlnID0gQGF4X3B0aHJlYWRfY29uZmlnQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9ICQoZGF0YWRpcikvZG9jL3N0dW5uZWwKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorU1VCRElSUyA9IHNyYyBkb2MgdG9vbHMKK0VYVFJBX0RJU1QgPSBQT1JUUyBCVUdTIENPUFlSSUdIVC5HUEwgQ1JFRElUUyBJTlNUQUxMLlczMiBJTlNUQUxMLldDRSBcCisJSU5TVEFMTC5GSVBTIGJ1aWxkLWFuZHJvaWQuc2gKK2RvY19EQVRBID0gSU5TVEFMTCBSRUFETUUgVE9ETyBDT1BZSU5HIEFVVEhPUlMgQ2hhbmdlTG9nIFBPUlRTIEJVR1MgXAorCUNPUFlSSUdIVC5HUEwgQ1JFRElUUyBJTlNUQUxMLlczMiBJTlNUQUxMLldDRSBJTlNUQUxMLkZJUFMKK2Rpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLXR5cGUgZiAtZXhlYyBzaCAtYyAndGVzdCAtZiAkKHNyY2Rpcikve30gfHwgZWNobyB7fScgJzsnCitlZGl0ID0gc2VkIFwKKwktZSAnc3xAYmluZGlyW0BdfCQoYmluZGlyKXxnJyBcCisJLWUgJ3N8QHN5c2NvbmZkaXJbQF18JChzeXNjb25mZGlyKXxnJworCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorYW0tLXJlZnJlc2g6IE1ha2VmaWxlCisJQDoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSc7IFwKKwkgICAgICAkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBNYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBNYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCisJICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgbGlidG9vbCBjb25maWcubHQKK2luc3RhbGwtZG9jREFUQTogJChkb2NfREFUQSkKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwlAbGlzdD0nJChkb2NfREFUQSknOyB0ZXN0IC1uICIkKGRvY2RpcikiIHx8IGxpc3Q9OyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoZG9jZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChkb2NkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKGRvY2RpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKGRvY2RpcikiIHx8IGV4aXQgJCQ/OyBcCisJZG9uZQorCit1bmluc3RhbGwtZG9jREFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGRvY19EQVRBKSc7IHRlc3QgLW4gIiQoZG9jZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAorCWRpcj0nJChERVNURElSKSQoZG9jZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gJ21ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiAnbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiAnY29uZmlnLnN0YXR1cycsIGVkaXQgJ2NvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biAnbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgJ21ha2UnIGNvbW1hbmQgbGluZS4KKyQoYW1fX3JlY3Vyc2l2ZV90YXJnZXRzKToKKwlAZmFpbD07IFwKKwlpZiAkKGFtX19tYWtlX2tlZXBnb2luZyk7IHRoZW4gXAorCSAgZmFpbGNvbT0nZmFpbD15ZXMnOyBcCisJZWxzZSBcCisJICBmYWlsY29tPSdleGl0IDEnOyBcCisJZmk7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCitJRDogJChhbV9fdGFnZ2VkX2ZpbGVzKQorCSQoYW1fX2RlZmluZV91bmlxX3RhZ2dlZF9maWxlcyk7IG1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogdGFncy1yZWN1cnNpdmUKK1RBR1M6IHRhZ3MKKwordGFncy1hbTogJChUQUdTX0RFUEVOREVOQ0lFUykgJChhbV9fdGFnZ2VkX2ZpbGVzKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBjdGFncy1yZWN1cnNpdmUKKworQ1RBR1M6IGN0YWdzCitjdGFncy1hbTogJChUQUdTX0RFUEVOREVOQ0lFUykgJChhbV9fdGFnZ2VkX2ZpbGVzKQorCSQoYW1fX2RlZmluZV91bmlxX3RhZ2dlZF9maWxlcyk7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCitjc2NvcGU6IGNzY29wZS5maWxlcworCXRlc3QgISAtcyBjc2NvcGUuZmlsZXMgXAorCSAgfHwgJChDU0NPUEUpIC1iIC1xICQoQU1fQ1NDT1BFRkxBR1MpICQoQ1NDT1BFRkxBR1MpIC1pIGNzY29wZS5maWxlcyAkKENTQ09QRV9BUkdTKQorY2xlYW4tY3Njb3BlOgorCS1ybSAtZiBjc2NvcGUuZmlsZXMKK2NzY29wZS5maWxlczogY2xlYW4tY3Njb3BlIGNzY29wZWxpc3QKK2NzY29wZWxpc3Q6IGNzY29wZWxpc3QtcmVjdXJzaXZlCisKK2NzY29wZWxpc3QtYW06ICQoYW1fX3RhZ2dlZF9maWxlcykKKwlsaXN0PSckKGFtX190YWdnZWRfZmlsZXMpJzsgXAorCWNhc2UgIiQoc3JjZGlyKSIgaW4gXAorCSAgW1xcL10qIHwgPzpbXFwvXSopIHNkaXI9IiQoc3JjZGlyKSIgOzsgXAorCSAgKikgc2Rpcj0kKHN1YmRpcikvJChzcmNkaXIpIDs7IFwKKwllc2FjOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIFwKKwkgICAgZWNobyAiJChzdWJkaXIpLyQkaSI7IFwKKwkgIGVsc2UgXAorCSAgICBlY2hvICIkJHNkaXIvJCRpIjsgXAorCSAgZmk7IFwKKwlkb25lID4+ICQodG9wX2J1aWxkZGlyKS9jc2NvcGUuZmlsZXMKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKwktcm0gLWYgY3Njb3BlLm91dCBjc2NvcGUuaW4ub3V0IGNzY29wZS5wby5vdXQgY3Njb3BlLmZpbGVzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCXRlc3QgLWQgIiQoZGlzdGRpcikiIHx8IG1rZGlyICIkKGRpc3RkaXIpIgorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgJChhbV9fbWFrZV9kcnlydW4pIFwKKwkgICAgICB8fCB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKKwkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAorCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJCWFtX19za2lwX21vZGVfZml4PTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCisJfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAorCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3Bvc3RfcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtYnppcDI6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgQlpJUDI9JCR7QlpJUDItLTl9IGJ6aXAyIC1jID4kKGRpc3RkaXIpLnRhci5iejIKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHppcCAtYyAkJHtMWklQX09QVC0tOX0gPiQoZGlzdGRpcikudGFyLmx6CisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKKworZGlzdC14ejogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBYWl9PUFQ9JCR7WFpfT1BULS1lfSB4eiAtYyA+JChkaXN0ZGlyKS50YXIueHoKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXRhclo6IGRpc3RkaXIKKwlAZWNobyBXQVJOSU5HOiAiU3VwcG9ydCBmb3Igc2hhciBkaXN0cmlidXRpb24gYXJjaGl2ZXMgaXMiIFwKKwkgICAgICAgICAgICAgICAiZGVwcmVjYXRlZC4iID4mMgorCUBlY2hvIFdBUk5JTkc6ICJJdCB3aWxsIGJlIHJlbW92ZWQgYWx0b2dldGhlciBpbiBBdXRvbWFrZSAyLjAiID4mMgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBjb21wcmVzcyAtYyA+JChkaXN0ZGlyKS50YXIuWgorCSQoYW1fX3Bvc3RfcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3Qtc2hhcjogZGlzdGRpcgorCUBlY2hvIFdBUk5JTkc6ICJTdXBwb3J0IGZvciBkaXN0cmlidXRpb24gYXJjaGl2ZXMgY29tcHJlc3NlZCB3aXRoIiBcCisJCSAgICAgICAibGVnYWN5IHByb2dyYW0gJ2NvbXByZXNzJyBpcyBkZXByZWNhdGVkLiIgPiYyCisJQGVjaG8gV0FSTklORzogIkl0IHdpbGwgYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGluIEF1dG9tYWtlIDIuMCIgPiYyCisJc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXppcDogZGlzdGRpcgorCS1ybSAtZiAkKGRpc3RkaXIpLnppcAorCXppcCAtcnEgJChkaXN0ZGlyKS56aXAgJChkaXN0ZGlyKQorCSQoYW1fX3Bvc3RfcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QgZGlzdC1hbGw6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChESVNUX1RBUkdFVFMpIGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyPSdAOicKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCisJKi50YXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLmJ6MiopIFwKKwkgIGJ6aXAyIC1kYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHoqKSBcCisJICBsemlwIC1kYyAkKGRpc3RkaXIpLnRhci5seiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci54eiopIFwKKwkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpCisJY2htb2QgdSt3ICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpL19idWlsZCAkKGRpc3RkaXIpL19pbnN0CisJY2htb2QgYS13ICQoZGlzdGRpcikKKwl0ZXN0IC1kICQoZGlzdGRpcikvX2J1aWxkIHx8IGV4aXQgMDsgXAorCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAorCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCisJICAmJiBhbV9fY3dkPWBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKGRpc3RkaXIpL19idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgXAorCSAgICAkKEFNX0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCisJICAgIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrIFwKKwkgICYmIGNobW9kIC1SIGEtdyAiJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICYmICh7IFwKKwkgICAgICAgKGNkIC4uLy4uICYmIHVtYXNrIDA3NyAmJiBta2RpciAiJCRkY19kZXN0ZGlyIikgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIGluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIHVuaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgXAorCSAgICAgICAgICAgIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfZGVzdGRpciIgZGlzdHVuaW5zdGFsbGNoZWNrOyBcCisJICAgICAgfSB8fCB7IHJtIC1yZiAiJCRkY19kZXN0ZGlyIjsgZXhpdCAxOyB9KSBcCisJICAmJiBybSAtcmYgIiQkZGNfZGVzdGRpciIgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCisJICAmJiBybSAtcmYgJChESVNUX0FSQ0hJVkVTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW5jaGVjayBcCisJICAmJiBjZCAiJCRhbV9fY3dkIiBcCisJICB8fCBleGl0IDEKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQorCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCisJICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCisJICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKK2Rpc3R1bmluc3RhbGxjaGVjazoKKwlAdGVzdCAtbiAnJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgfHwgeyBcCisJICBlY2hvICdFUlJPUjogdHJ5aW5nIHRvIHJ1biAkQCB3aXRoIGFuIGVtcHR5JyBcCisJICAgICAgICckJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgPiYyOyBcCisJICBleGl0IDE7IFwKKwl9OyBcCisJJChhbV9fY2QpICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKKwkgIGVjaG8gJ0VSUk9SOiBjYW5ub3QgY2hkaXIgaW50byAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCX07IFwKKwl0ZXN0IGAkKGFtX19kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKKwkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKKwkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKKwkgICAgICAgIGZpIDsgXAorCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgIGV4aXQgMTsgfSA+JjIKK2Rpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KKwlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKKwkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKKwkgIGV4aXQgMSA7IFwKKwlmaQorCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAorCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCisJICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgZXhpdCAxOyB9ID4mMgorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKERBVEEpCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChkb2NkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi1sb2NhbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZG9jREFUQQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZGF0YS1ob29rCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtcmVjdXJzaXZlCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1kb2NEQVRBCisKKy5NQUtFOiAkKGFtX19yZWN1cnNpdmVfdGFyZ2V0cykgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtc3RyaXAKKworLlBIT05ZOiAkKGFtX19yZWN1cnNpdmVfdGFyZ2V0cykgQ1RBR1MgR1RBR1MgVEFHUyBhbGwgYWxsLWFtIFwKKwlhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1jc2NvcGUgY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjc2NvcGUgY3Njb3BlbGlzdC1hbSBjdGFncyBjdGFncy1hbSBkaXN0IFwKKwlkaXN0LWFsbCBkaXN0LWJ6aXAyIGRpc3QtZ3ppcCBkaXN0LWx6aXAgZGlzdC1zaGFyIGRpc3QtdGFyWiBcCisJZGlzdC14eiBkaXN0LXppcCBkaXN0Y2hlY2sgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbG9jYWwgZGlzdGNsZWFuLXRhZ3MgXAorCWRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YS1ob29rIGluc3RhbGwtZG9jREFUQSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIFwKKwlwcyBwcy1hbSB0YWdzIHRhZ3MtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtZG9jREFUQQorCitsaWJ0b29sOiAkKExJQlRPT0xfREVQUykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgbGlidG9vbAorCitkaXN0Y2xlYW4tbG9jYWw6CisJcm0gLXJmIGF1dG9tNHRlLmNhY2hlCisjCXJtIC1mICQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZQorCisjZGlzdC1ob29rOgorIwltYWtlbnNpcyAtTk9DRCAtRFZFUlNJT049JHtWRVJTSU9OfSAtRFNSQ0RJUj0kKHNyY2RpcikgXAorIwkJLURPUEVOU1NMPS91c3Ivc3JjL29wZW5zc2wtMC45Ljh1LWZpcHMvb3V0MzJkbGwgXAorIwkJLURaTElCPS91c3Ivc3JjL3psaWItMS4yLjgtaTU4NiBcCisjCQkkKHNyY2RpcikvdG9vbHMvc3R1bm5lbC5uc2kKKworc2lnbjogZGlzdAorCWNwIC1mICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZSAkKGRpc3RkaXIpLWFuZHJvaWQuemlwIC4uL2Rpc3QKKwlncGctYWdlbnQgLS1kYWVtb24gL2Jpbi9zaCAtYyAiY2QgLi4vZGlzdDsgZ3BnIC0teWVzIC0tYXJtb3IgLS1kZXRhY2gtc2lnbiAtLWZvcmNlLXYzLXNpZ3MgJChkaXN0ZGlyKS50YXIuZ3o7IGdwZyAtLXllcyAtLWFybW9yIC0tZGV0YWNoLXNpZ24gLS1mb3JjZS12My1zaWdzICQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZTsgZ3BnIC0teWVzIC0tYXJtb3IgLS1kZXRhY2gtc2lnbiAtLWZvcmNlLXYzLXNpZ3MgJChkaXN0ZGlyKS1hbmRyb2lkLnppcCIKKwlzaGEyNTZzdW0gJChkaXN0ZGlyKS50YXIuZ3ogPi4uL2Rpc3QvJChkaXN0ZGlyKS50YXIuZ3ouc2hhMjU2CisJc2hhMjU2c3VtICQoZGlzdGRpciktaW5zdGFsbGVyLmV4ZSA+Li4vZGlzdC8kKGRpc3RkaXIpLWluc3RhbGxlci5leGUuc2hhMjU2CisJc2hhMjU2c3VtICQoZGlzdGRpciktYW5kcm9pZC56aXAgPi4uL2Rpc3QvJChkaXN0ZGlyKS1hbmRyb2lkLnppcC5zaGEyNTYKKwljYXQgLi4vZGlzdC8kKGRpc3RkaXIpKi5zaGEyNTYgfCB0YWMKKworY2VydDoKKwkkKE1BS0UpIC1DIHRvb2xzIGNlcnQKKworaW5zdGFsbC1kYXRhLWhvb2s6CisJQGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKwlAZWNobyAiKiBUeXBlICdtYWtlIGNlcnQnIHRvIGFsc28gaW5zdGFsbCBhIHNhbXBsZSBjZXJ0aWZpY2F0ZSAqIgorCUBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK3N0dW5uZWwucG9kOiBNYWtlZmlsZQorCSQoZWRpdCkgJyQoc3JjZGlyKS8kQC5pbicgPiRACisKK3N0dW5uZWwucG9kOiAkKHNyY2Rpcikvc3R1bm5lbC5wb2QKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NGQzYwotLS0gL2Rldi9udWxsCisrKyBiL05FV1MKQEAgLTAsMCArMSBAQAorU2VlIHRoZSBDaGFuZ2VMb2cgZmlsZSBmb3IgdGhlIGxhdGVzdCBuZXdzLgpkaWZmIC0tZ2l0IGEvUE9SVFMgYi9QT1JUUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcxMTczCi0tLSAvZGV2L251bGwKKysrIGIvUE9SVFMKQEAgLTAsMCArMSwyNCBAQAorc3R1bm5lbCBrbm93biBwb3J0IG1haW50YWluZXJzCisKKworKiBBbWlnYU9TCisgIC0gRGllZ28gQ2Fzb3JyYW4gPGRjcjg1MjBAYW1pZ2Eub3JnPgorKiBDeWd3aW4KKyAgLSBBbmRyZXcgU2NodWxtYW4gPGFuZHJleEBhbHVtbmkudXRleGFzLm5ldD4KKyogRGViaWFuIEdOVS9MaW51eAorICAtIFBldGVyIFBlbnRjaGV2IDxyb2FtQHJpbmdsZXQubmV0PgorKiBGcmVlQlNECisgIC0gUnlhbiBTdGVpbm1ldHogPHppQEZyZWVCU0Qub3JnPgorKiBOZXRCU0QKKyAgLSBNYXJ0dGkgS3VwYXJpbmVuIDxtYXJ0dGkua3VwYXJpbmVuQGlraS5maT4KKyogT3BlbkJTRAorICAtIEdsZXlkc29uIFNvYXJlcyA8Z3NvYXJlc0BvcGVuYnNkLm9yZz4KKyogT3BlbkNTVyBTb2xhcmlzCisgIC0gRGFnb2JlcnQgTWljaGVsc2VuIDxkYW1Ab3BlbmNzdy5vcmc+CisqIE9wZW5Tb2xhcmlzCisgIC0gTWFyayBGZW53aWNrIDxNYXJrLkZlbndpY2tAc3VuLmNvbT4KKyogT1MvMgorICAtIFBhdWwgU21lZGxleSA8cGF1bEBzbWVkbGV5LmluZm8+CisqIFJlZEhhdCBMaW51eAorICAtIERhbWllbiBNaWxsZXIgPGRtaWxsZXJAaWxvZ2ljLmNvbS5hdT4KKwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmEzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorc3R1bm5lbCBvdmVydmlldworCitTaG9ydCBkZXNjcmlwdGlvbgorCisgICAgIFRoZSBzdHVubmVsIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gd29yayBhcyBhbiBTU0wgZW5jcnlwdGlvbgorICAgICB3cmFwcGVyIGJldHdlZW4gcmVtb3RlIGNsaWVudCBhbmQgbG9jYWwgKGluZXRkLXN0YXJ0YWJsZSkgb3IKKyAgICAgcmVtb3RlIHNlcnZlcnMuIFRoZSBnb2FsIGlzIHRvIGZhY2lsaXRhdGUgU1NMIGVuY3J5cHRpb24gYW5kCisgICAgIGF1dGhlbnRpY2F0aW9uIGZvciBub24tU1NMLWF3YXJlIHByb2dyYW1zLgorCisgICAgIHN0dW5uZWwgY2FuIGJlIHVzZWQgdG8gYWRkICBTU0wgIGZ1bmN0aW9uYWxpdHkgIHRvICBjb21tb25seQorICAgICB1c2VkICBpbmV0ZCAgZGFlbW9ucyAgbGlrZSAgUE9QLTIsICBQT1AtMyAgYW5kICBJTUFQIHNlcnZlcnMKKyAgICAgd2l0aG91dCBhbnkgY2hhbmdlcyBpbiB0aGUgcHJvZ3JhbXMnIGNvZGUuCisKK0NvbXBpbGUgaW5zdHJ1Y3Rpb25zCisKKyAgICAgU2VlIElOU1RBTEwgZmlsZS4KKworTGljZW5zZQorCisgICAgIFNlZSBDT1BZSU5HIGZpbGUuCisKK090aGVyIGZpbGVzIHlvdSBzaG91bGQgcmVhZAorCisgICAgIENoYW5nZWxvZyAgICAgIFdoYXQgSSBkaWQKKyAgICAgVE9ETyAgICAgICAgICAgV2hhdCBJJ20gZ29pbmcgdG8gZG8KKworUmVwb3J0aW5nIHByb2JsZW1zIGFuZCBvdGhlciBjb250YWN0cworCisgICAgIFNlZSBGQVEgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvVE9ETyBiL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhNGJiOAotLS0gL2Rldi9udWxsCisrKyBiL1RPRE8KQEAgLTAsMCArMSw0OSBAQAorc3R1bm5lbCBUT0RPCisKKworSGlnaCBwcmlvcml0eSBmZWF0dXJlcy4gIFRoZXkgd2lsbCBsaWtlbHkgYmUgc3VwcG9ydGVkIHNvbWUgZGF5LgorQSBzcG9uc29yIGNvdWxkIGFsbG9jYXRlIG15IHRpbWUgdG8gZ2V0IHRoZW0gZmFzdGVyLgorKiBBZGQgYW4gQXBwYXJtb3IgcHJvZmlsZS4KKyogT3B0aW9uYWwgbGluZS1idWZmZXJpbmcgb2YgdGhlIGxvZyBmaWxlLgorKiBMb2cgcm90YXRpb24gb24gV2luZG93cy4KKyogQ29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMuCisqIEltcGxlbWVudCByZWZlcmVuY2UgY291bnRpbmcgb2YgdGhlIFNFUlZJQ0VfT1BUSU9OUyBzdHJ1Y3R1cmUKKyAgLSBBZGQgJ2xlYXN0Y29ubicgZmFpbG92ZXIgc3RyYXRlZ3kgdG8gb3JkZXIgZGVmaW5lZCAnY29ubmVjdCcgdGFyZ2V0cworICAgIGJ5IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zLgorICAtIEFkZCAnLXN0YXR1cycgY29tbWFuZCBsaW5lIG9wdGlvbiByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBjbGllbnRzCisgICAgY29ubmVjdGVkIHRvIGVhY2ggc2VydmljZS4KKyAgLSBEZWFsbG9jYXRlIFNFUlZJQ0VfT1BUSU9OUyBzdHJ1Y3R1cmUgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaXMgcmVsb2FkZWQgKmFuZCogb2xkIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuCisqIENvbW1hbmQtbGluZSBzZXJ2ZXIgY29udHJvbCBpbnRlcmZhY2Ugb24gYm90aCBVbml4IGFuZCBXaW5kb3dzLgorKiBTZXBhcmF0ZSBHVUkgcHJvY2VzcyBydW5uaW5nIGFzIGN1cnJlbnQgdXNlciBvbiBXaW5kb3dzLgorKiBBbiBBbmRyb2lkIEdVSS4KKyogSW5kaXJlY3QgQ1JMIHN1cHBvcnQgKFJGQyAzMjgwLCBzZWN0aW9uIDUpLgorKiBQcm92aWRlIDY0LWJpdCBXaW5kb3dzIGJ1aWxkcyAoYmVzaWRlcyAzMi1iaXQgYnVpbGRzKS4KKyAgVGhpcyByZXF1aXJlcyBlaXRoZXIgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU3RhbmRhcmQgRWRpdGlvbiBvciBNaWNyb3NvZnQKKyAgVmlzdWFsIFN0dWRpbyBQcm9mZXNzaW9uYWwgRWRpdGlvbiBpbiBvcmRlciB0byByZXRhaW4gRklQUyBjb21wbGlhbmNlLgorKiBNU0kgaW5zdGFsbGVyIGZvciBXaW5kb3dzLgorKiBEYXRhYmFzZSBhbmQvb3IgZGlyZWN0b3J5IGludGVyZmFjZSBmb3IgcmV0cmlldmluZyBQU0sgc2VjcmV0cy4KKyogRXh0ZW5kIHNlc3Npb24gdGlja2V0cyBhbmQvb3Igc2Vzc2lvbmQgdG8gYWxzbyBzZXJpYWxpemUKKyAgYXBwbGljYXRpb24gZGF0YSAoInJlZGlyZWN0IiBzdGF0ZSBhbmQgc2Vzc2lvbiBwZXJzaXN0ZW5jZSkuCisqIEFkZCB1c2VyLWRlZmluZWQgaGVhZGVycyB0byBwcm94eSByZXF1ZXN0cyBpbiBvcmRlciB0byBpbXBlcnNvbmF0ZQorICBvdGhlciBzb2Z0d2FyZSAoZS5nLiB3ZWIgYnJvd3NlcnMpLgorCitMb3cgcHJpb3JpdHkgZmVhdHVyZXMuICBUaGV5IHdpbGwgdW5saWtlbHkgZXZlciBiZSBzdXBwb3J0ZWQuCisqIFN1cHBvcnQgc3RhdGljIEZJUFMtZW5hYmxlZCBidWlsZC4KKyogU2VydmljZS1sZXZlbCBsb2dnaW5nIGRlc3RpbmF0aW9uLgorKiBFbmZvcmNlIGtleSByZW5lZ290aWF0aW9uIChyZS1oYW5kc2hha2UpIGZvciBsb25nIGNvbm5lY3Rpb25zLgorKiBMb2dnaW5nIHRvIE5UIEV2ZW50TG9nIG9uIFdpbmRvd3MuCisqIEludGVybmF0aW9uYWxpemF0aW9uIG9mIGxvZ2dlZCBtZXNzYWdlcyAoaTE4bikuCisqIEdlbmVyaWMgc2NyaXB0aW5nIGVuZ2luZSBpbnN0ZWFkIG9yIHN0YXRpYyBwcm90b2NvbC5jLgorCitGZWF0dXJlcyBJIHdvbid0IHN1cHBvcnQsIHVubGVzcyBjb252aW5jZWQgb3RoZXJ3aXNlIGJ5IGEgd2VhbHRoeSBzcG9uc29yLgorKiBTdXBwb3J0IGZvciBhZGRpbmcgWC1Gb3J3YXJkZWQtRm9yIHRvIEhUVFAgcmVxdWVzdCBoZWFkZXJzLgorICBUaGlzIGZlYXR1cmUgaXMgbGVzcyB1c2VmdWwgc2luY2UgUFJPWFkgcHJvdG9jb2wgc3VwcG9ydCBpcyBhdmFpbGFibGUuCisqIFN1cHBvcnQgZm9yIGFkZGluZyBYLUZvcndhcmRlZC1Gb3IgdG8gU01UUCBlbWFpbCBoZWFkZXJzLgorICBUaGlzIGZlYXR1cmUgaXMgbW9zdCBsaWtlbHkgdG8gYmUgaW1wbGVtZW50ZWQgYXMgYSBzZXBhcmF0ZSBwcm94eS4KKyogQWRkaXRpb25hbCBjZXJ0aWZpY2F0ZSBjaGVja3MgKGluY2x1ZGluZyB3aWxkY2FyZCBjb21wYXJpc29uKSBiYXNlZCBvbjoKKyAgLSBPIChPcmdhbml6YXRpb24pLCBhbmQKKyAgLSBPVSAoT3JnYW5pemF0aW9uYWwgVW5pdCkuCisqIFNldCBwcm9jZXNzZXMgdGl0bGUgdGhhdCBhcHBlYXIgb24gdGhlIHBzKDEpIGFuZCB0b3AoMSkgY29tbWFuZHMuCisgIEkgY291bGQgbm90IGZpbmQgYSBwb3J0YWJsZSAqYW5kKiBub24tY29weWxlZnQgbGlicmFyeSBmb3IgaXQuCisKZGlmZiAtLWdpdCBhL2FjbG9jYWwubTQgYi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTgwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsLm00CkBAIC0wLDAgKzEsMTE2MSBAQAorIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTQuMSAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19DT05GSUdfTUFDUk9fRElSU10sIFttNF9kZWZ1bihbX0FNX0NPTkZJR19NQUNST19ESVJTXSwgW10pbTRfZGVmdW4oW0FDX0NPTkZJR19NQUNST19ESVJTXSwgW19BTV9DT05GSUdfTUFDUk9fRElSUygkQCldKV0pCittNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAorICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCittNF9pZihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSksIFsyLjY5XSwsCitbbTRfd2FybmluZyhbdGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZm9yIGF1dG9jb25mIDIuNjkuCitZb3UgaGF2ZSBhbm90aGVyIHZlcnNpb24gb2YgYXV0b2NvbmYuICBJdCBtYXkgd29yaywgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvLgorSWYgeW91IGhhdmUgcHJvYmxlbXMsIHlvdSBtYXkgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0gZW50aXJlbHkuCitUbyBkbyBzbywgdXNlIHRoZSBwcm9jZWR1cmUgZG9jdW1lbnRlZCBieSB0aGUgcGFja2FnZSwgdHlwaWNhbGx5ICdhdXRvcmVjb25mJy5dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKK0FDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKK1thbV9fYXBpX3ZlcnNpb249JzEuMTQnCitkbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCitkbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgorbTRfaWYoWyQxXSwgWzEuMTQuMV0sIFtdLAorICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAorXSkKKworIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCisjIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCisjIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCittNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCisKKyMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQU1fSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKK1tBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjE0LjFdKWRubAorbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pKV0pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKKyMgJGFjX2F1eF9kaXIgdG8gJyRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KKyMgJyRzcmNkaXInLCAnJHNyY2Rpci8uLicsIG9yICckc3JjZGlyLy4uLy4uJy4KKyMKKyMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQorIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAorIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKKyMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCisjIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCisjIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQorIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgorIworIyAkYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKKyMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKKyMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgorIworIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgorIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQorIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgJy4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKKyMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KKyMKKyMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCisjIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgorIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAorIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKKyMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKKyMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KKyMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgorIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCisjCisjIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgorIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCisjIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KKworQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKK1tBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKKyMgRXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGguCithbV9hdXhfZGlyPWBjZCAiJGFjX2F1eF9kaXIiICYmIHB3ZGAKK10pCisKKyMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KK0FDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCitbQUNfUFJFUkVRKFsyLjUyXSlkbmwKKyBtNF9pZihbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCisgICAgICAgWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAorQUNfU1VCU1QoWyQxX1RSVUVdKWRubAorQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCittNF9kZWZpbmUoW19BTV9DT05EX1ZBTFVFXyQxXSwgWyQyXSlkbmwKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKAorW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgorICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCitmaV0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgJ0FDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiT0JKQyIsICJPQkpDWFgiLCAiVVBDIiwgb3IgIkdKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK200X2lmKFskMV0sIFtDQ10sICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgWyQxXSwgW0NYWF0sICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICBbJDFdLCBbT0JKQ10sIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICBbJDFdLCBbT0JKQ1hYXSwgW2RlcGNjPSIkT0JKQ1hYIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgWyQxXSwgW1VQQ10sICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICBbJDFdLCBbR0NKXSwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCAnRCcgLS0gYmVjYXVzZSAnLU1EJyBtZWFucyAicHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEIi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBtNF9jYXNlKFskMV0sIFtDQ10sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSwKKyAgICBbQ1hYXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdKQorCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgIjogPiBzdWIvY29uZnRzdCRpLmgiIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgMTAgL2Jpbi9zaC4KKyAgICAgIGVjaG8gJy8qIGR1bW15ICovJyA+IHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICAjIFdlIGNoZWNrIHdpdGggJy1jJyBhbmQgJy1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlICctTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAorICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycy4KKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBBZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLgorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgJy1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorXSkKK0FDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQorQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKK10pCisKKworIyBBTV9TRVRfREVQRElSCisjIC0tLS0tLS0tLS0tLS0KKyMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUy4KK0FDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAorXSkKKworCisjIEFNX0RFUF9UUkFDSworIyAtLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAorW0FDX0FSR19FTkFCTEUoW2RlcGVuZGVuY3ktdHJhY2tpbmddLCBbZG5sCitBU19IRUxQX1NUUklORygKKyAgWy0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmddLAorICBbZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCitBU19IRUxQX1NUUklORygKKyAgWy0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nXSwKKyAgW3NwZWVkcyB1cCBvbmUtdGltZSBidWlsZF0pXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKKyAgYW1fX25vZGVwPSdfbm8nCitmaQorQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCitBQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKK0FDX1NVQlNUKFthbV9fbm9kZXBdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pZG5sCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworCisjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW3sKKyAgIyBPbGRlciBBdXRvY29uZiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisgICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKKyAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCisgIGNhc2UgJENPTkZJR19GSUxFUyBpbgorICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OworICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKKyAgZXNhYworICBzaGlmdAorICBmb3IgbWYKKyAgZG8KKyAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgJ01ha2VmaWxlLmluJywgYnV0CisgICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgJ21ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICIkYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJ2A7IGRvCisgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAorICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQorICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICAgIGRvbmUKKyAgZG9uZQorfQorXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworCisKKyMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgorIworIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCisjIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoICcuUCcgZmlsZSB0aGF0IHdlIHdpbGwKKyMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KK0FDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCitbQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCisgICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCitdKQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2guICBTb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKKyMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKworZG5sIFJlZGVmaW5lIEFDX1BST0dfQ0MgdG8gYXV0b21hdGljYWxseSBpbnZva2UgX0FNX1BST0dfQ0NfQ19PLgorbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKK200X2RlZm4oW0FDX1BST0dfQ0NdKQorW19BTV9QUk9HX0NDX0NfTworXSkKKworIyBBTV9JTklUX0FVVE9NQUtFKFBBQ0tBR0UsIFZFUlNJT04sIFtOTy1ERUZJTkVdKQorIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGNhbGwgd2l0aCBQQUNLQUdFIGFuZCBWRVJTSU9OIGFyZ3VtZW50cyBpcyB0aGUgb2xkIHN0eWxlCisjIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKKyMgYW5kIFZFUlNJT04gc2hvdWxkIG5vdyBiZSBwYXNzZWQgdG8gQUNfSU5JVCBhbmQgcmVtb3ZlZCBmcm9tCisjIHRoZSBjYWxsIHRvIEFNX0lOSVRfQVVUT01BS0UuCisjIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgorIyB0aGUgbmV4dCBBdXRvbWFrZSByZWxlYXNlLCBBdXRvY29uZiBjYW4gbWFrZSB0aGUgQUNfSU5JVAorIyBhcmd1bWVudHMgbWFuZGF0b3J5LCBhbmQgdGhlbiB3ZSBjYW4gZGVwZW5kIG9uIGEgbmV3IEF1dG9jb25mCisjIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCitBQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCitbQUNfUFJFUkVRKFsyLjY1XSlkbmwKK2RubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93CitkbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KK200X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAorQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgorICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAorICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCisgIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pX0FNX1NVQlNUX05PVE1BS0UoW2FtX19pc3JjXSlkbmwKKyAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCisgIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorICBmaQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKK0FDX1NVQlNUKFtDWUdQQVRIX1ddKQorCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCitkbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KK200X2lmdmFsKFskMl0sCitbQUNfRElBR05PU0UoW29ic29sZXRlXSwKKyAgICAgICAgICAgICBbJDA6IHR3by0gYW5kIHRocmVlLWFyZ3VtZW50cyBmb3JtcyBhcmUgZGVwcmVjYXRlZC5dKQorbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAorW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAorZG5sIERpYWdub3NlIG9sZC1zdHlsZSBBQ19JTklUIHdpdGggbmV3LXN0eWxlIEFNX0FVVE9NQUtFX0lOSVQuCittNF9pZigKKyAgbTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIFtva10pOm00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbb2tdKSwKKyAgW29rOm9rXSwsCisgIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAorCitfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKK1tBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VdLCBbIiRQQUNLQUdFIl0sIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChbVkVSU0lPTl0sIFsiJFZFUlNJT04iXSwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCitBTV9NSVNTSU5HX1BST0coW0FDTE9DQUxdLCBbYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn1dKQorQU1fTUlTU0lOR19QUk9HKFtBVVRPQ09ORl0sIFthdXRvY29uZl0pCitBTV9NSVNTSU5HX1BST0coW0FVVE9NQUtFXSwgW2F1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufV0pCitBTV9NSVNTSU5HX1BST0coW0FVVE9IRUFERVJdLCBbYXV0b2hlYWRlcl0pCitBTV9NSVNTSU5HX1BST0coW01BS0VJTkZPXSwgW21ha2VpbmZvXSkKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKKyMgRm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgVG8gYmUgcmVtb3ZlZCBvbmNlIEF1dG9tYWtlIDEuOS54CisjIGRpZXMgb3V0IGZvciBnb29kLiAgRm9yIG1vcmUgYmFja2dyb3VuZCwgc2VlOgorIyA8aHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2F1dG9tYWtlLzIwMTItMDcvbXNnMDAwMDEuaHRtbD4KKyMgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9hdXRvbWFrZS8yMDEyLTA3L21zZzAwMDE0Lmh0bWw+CitBQ19TVUJTVChbbWtkaXJfcF0sIFsnJChNS0RJUl9QKSddKQorIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitfQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKKwkgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKKwkJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhbQ0NdKV0sCisJCSAgW200X2RlZmluZShbQUNfUFJPR19DQ10sCisJCQkgICAgIG00X2RlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKFtDQ10pXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhbQ1hYXSldLAorCQkgIFttNF9kZWZpbmUoW0FDX1BST0dfQ1hYXSwKKwkJCSAgICAgbTRfZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKFtDWFhdKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKFtPQkpDXSldLAorCQkgIFttNF9kZWZpbmUoW0FDX1BST0dfT0JKQ10sCisJCQkgICAgIG00X2RlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoW09CSkNdKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNYWF0sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoW09CSkNYWF0pXSwKKwkJICBbbTRfZGVmaW5lKFtBQ19QUk9HX09CSkNYWF0sCisJCQkgICAgIG00X2RlZm4oW0FDX1BST0dfT0JKQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhbT0JKQ1hYXSldKV0pZG5sCitdKQorQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSlkbmwKK2RubCBUaGUgdGVzdHN1aXRlIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQorZG5sICdhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcworZG5sIG1hY3JvIGlzIGhvb2tlZCBvbnRvIF9BQ19DT01QSUxFUl9FWEVFWFQgZWFybHksIHNlZSBiZWxvdy4KK0FDX0NPTkZJR19DT01NQU5EU19QUkUoZG5sCitbbTRfcHJvdmlkZV9pZihbX0FNX0NPTVBJTEVSX0VYRUVYVF0sCisgIFtBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pXSldKWRubAorCisjIFBPU0lYIHdpbGwgc2F5IGluIGEgZnV0dXJlIHZlcnNpb24gdGhhdCBydW5uaW5nICJybSAtZiIgd2l0aCBubyBhcmd1bWVudAorIyBpcyBPSzsgYW5kIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBtYWtlIHRoYXQgYXNzdW1wdGlvbiBpbiBvdXIgTWFrZWZpbGUKKyMgcmVjaXBlcy4gIFNvIHVzZSBhbiBhZ2dyZXNzaXZlIHByb2JlIHRvIGNoZWNrIHRoYXQgdGhlIHVzYWdlIHdlIHdhbnQgaXMKKyMgYWN0dWFsbHkgc3VwcG9ydGVkICJpbiB0aGUgd2lsZCIgdG8gYW4gYWNjZXB0YWJsZSBkZWdyZWUuCisjIFNlZSBhdXRvbWFrZSBidWcjMTA4MjguCisjIFRvIG1ha2UgYW55IGlzc3VlIG1vcmUgdmlzaWJsZSwgY2F1c2UgdGhlIHJ1bm5pbmcgY29uZmlndXJlIHRvIGJlIGFib3J0ZWQKKyMgYnkgZGVmYXVsdCBpZiB0aGUgJ3JtJyBwcm9ncmFtIGluIHVzZSBkb2Vzbid0IG1hdGNoIG91ciBleHBlY3RhdGlvbnM7IHRoZQorIyB1c2VyIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHRob3VnaC4KK2lmIHJtIC1mICYmIHJtIC1mciAmJiBybSAtcmY7IHRoZW4gOiBPSzsgZWxzZQorICBjYXQgPiYyIDw8J0VORCcKK09vcHMhCisKK1lvdXIgJ3JtJyBwcm9ncmFtIHNlZW1zIHVuYWJsZSB0byBydW4gd2l0aG91dCBmaWxlIG9wZXJhbmRzIHNwZWNpZmllZAorb24gdGhlIGNvbW1hbmQgbGluZSwgZXZlbiB3aGVuIHRoZSAnLWYnIG9wdGlvbiBpcyBwcmVzZW50LiAgVGhpcyBpcyBjb250cmFyeQordG8gdGhlIGJlaGF2aW91ciBvZiBtb3N0IHJtIHByb2dyYW1zIG91dCB0aGVyZSwgYW5kIG5vdCBjb25mb3JtaW5nIHdpdGgKK3RoZSB1cGNvbWluZyBQT1NJWCBzdGFuZGFyZDogPGh0dHA6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTU0Mj4KKworUGxlYXNlIHRlbGwgYnVnLWF1dG9tYWtlQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sIGluY2x1ZGluZyB0aGUgdmFsdWUKK29mIHlvdXIgJFBBVEggYW5kIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4gIFRoaXMKK2NhbiBoZWxwIHVzIGltcHJvdmUgZnV0dXJlIGF1dG9tYWtlIHZlcnNpb25zLgorCitFTkQKKyAgaWYgdGVzdCB4IiRBQ0NFUFRfSU5GRVJJT1JfUk1fUFJPR1JBTSIgPSB4InllcyI7IHRoZW4KKyAgICBlY2hvICdDb25maWd1cmF0aW9uIHdpbGwgcHJvY2VlZCBhbnl3YXksIHNpbmNlIHlvdSBoYXZlIHNldCB0aGUnID4mMgorICAgIGVjaG8gJ0FDQ0VQVF9JTkZFUklPUl9STV9QUk9HUkFNIHZhcmlhYmxlIHRvICJ5ZXMiJyA+JjIKKyAgICBlY2hvID4mMgorICBlbHNlCisgICAgY2F0ID4mMiA8PCdFTkQnCitBYm9ydGluZyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLCB0byBlbnN1cmUgeW91IHRha2Ugbm90aWNlIG9mIHRoZSBpc3N1ZS4KKworWW91IGNhbiBkb3dubG9hZCBhbmQgaW5zdGFsbCBHTlUgY29yZXV0aWxzIHRvIGdldCBhbiAncm0nIGltcGxlbWVudGF0aW9uCit0aGF0IGJlaGF2ZXMgcHJvcGVybHk6IDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY29yZXV0aWxzLz4uCisKK0lmIHlvdSB3YW50IHRvIGNvbXBsZXRlIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MgdXNpbmcgeW91ciBwcm9ibGVtYXRpYworJ3JtJyBhbnl3YXksIGV4cG9ydCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUNDRVBUX0lORkVSSU9SX1JNX1BST0dSQU0KK3RvICJ5ZXMiLCBhbmQgcmUtcnVuIGNvbmZpZ3VyZS4KKworRU5ECisgICAgQUNfTVNHX0VSUk9SKFtZb3VyICdybScgcHJvZ3JhbSBpcyBiYWQsIHNvcnJ5Ll0pCisgIGZpCitmaQorXSkKKworZG5sIEhvb2sgaW50byAnX0FDX0NPTVBJTEVSX0VYRUVYVCcgZWFybHkgdG8gbGVhcm4gaXRzIGV4cGFuc2lvbi4gIERvIG5vdAorZG5sIGFkZCB0aGUgY29uZGl0aW9uYWwgcmlnaHQgaGVyZSwgYXMgX0FDX0NPTVBJTEVSX0VYRUVYVCBtYXkgYmUgZnVydGhlcgorZG5sIG1hbmdsZWQgYnkgQXV0b2NvbmYgYW5kIHJ1biBpbiBhIHNoZWxsIGNvbmRpdGlvbmFsIHN0YXRlbWVudC4KK200X2RlZmluZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0sCittNF9kZWZuKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbbTRfcHJvdmlkZShbX0FNX0NPTVBJTEVSX0VYRUVYVF0pXSkKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9JDEKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKK0FDX1NVQlNUKFtpbnN0YWxsX3NoXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKKyMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgorQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCitbcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKK0FDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCisKKyMgQ2hlY2sgdG8gc2VlIGhvdyAnbWFrZScgdHJlYXRzIGluY2x1ZGVzLgkgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSAnbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKyMgQU1fTUlTU0lOR19IQVNfUlVOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgaXMgbW9kZXJuIGVub3VnaC4KKyMgSWYgaXQgaXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK0FDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAoraWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OworICAqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OworICBlc2FjCitmaQorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLWlzLWxpZ2h0d2VpZ2h0IjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgQUNfTVNHX1dBUk4oWydtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKK2ZpCitdKQorCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKK1tbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisjIF9BTV9TRVRfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCitbbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbMV0pXSkKKworIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgX0FNX1BST0dfQ0NfQ19PCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMaWtlIEFDX1BST0dfQ0NfQ19PLCBidXQgY2hhbmdlZCBmb3IgYXV0b21ha2UuICBXZSByZXdyaXRlIEFDX1BST0dfQ0MKKyMgdG8gYXV0b21hdGljYWxseSBjYWxsIHRoaXMuCitBQ19ERUZVTihbX0FNX1BST0dfQ0NfQ19PXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitBQ19SRVFVSVJFX0FVWF9GSUxFKFtjb21waWxlXSlkbmwKK0FDX0xBTkdfUFVTSChbQ10pZG5sCitBQ19DQUNIRV9DSEVDSygKKyAgW3doZXRoZXIgJENDIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlcl0sCisgIFthbV9jdl9wcm9nX2NjX2Nfb10sCisgIFtBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW10pXSkKKyAgIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCisgICMgRm9sbG93aW5nIEFDX1BST0dfQ0NfQ19PLCB3ZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUKKyAgIyBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyAubyBmaWxlIHdpdGggLW8sCisgICMgdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgorICBhbV9jdl9wcm9nX2NjX2Nfbz15ZXMKKyAgZm9yIGFtX2kgaW4gMSAyOyBkbworICAgIGlmIEFNX1JVTl9MT0coWyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0XSkgXAorICAgICAgICAgJiYgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dDsgdGhlbgorICAgICAgOiBPSworICAgIGVsc2UKKyAgICAgIGFtX2N2X3Byb2dfY2NfY19vPW5vCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgcm0gLWYgY29yZSBjb25mdGVzdCoKKyAgdW5zZXQgYW1faV0pCitpZiB0ZXN0ICIkYW1fY3ZfcHJvZ19jY19jX28iICE9IHllczsgdGhlbgorICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KKyAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCisgICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KKyAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKKyAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCisgICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCitmaQorQUNfTEFOR19QT1AoW0NdKV0pCisKKyMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitBQ19ERUZVTl9PTkNFKFtBTV9QUk9HX0NDX0NfT10sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUlVOX0xPRyhDT01NQU5EKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJ1biBDT01NQU5ELCBzYXZlIHRoZSBleGl0IHN0YXR1cyBpbiBhY19zdGF0dXMsIGFuZCBsb2cgaXQuCisjIChUaGlzIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSBBdXRvY29uZidzIF9BQ19SVU5fTE9HIG1hY3JvLikKK0FDX0RFRlVOKFtBTV9SVU5fTE9HXSwKK1t7IGVjaG8gIiRhc19tZTokTElORU5POiAkMSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgKCQxKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICBhY19zdGF0dXM9JD8KKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfV0pCisKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1NBTklUWV9DSEVDSworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CisjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCithbV9sZj0nCisnCitjYXNlIGBwd2RgIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVdKTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogJyRzcmNkaXInXSk7OworZXNhYworCisjIERvICdzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBhbV9oYXNfc2xlcHQ9bm8KKyAgIGZvciBhbV90cnkgaW4gMSAyOyBkbworICAgICBlY2hvICJ0aW1lc3RhbXAsIHNsZXB0OiAkYW1faGFzX3NsZXB0IiA+IGNvbmZ0ZXN0LmZpbGUKKyAgICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgorCSMgLUwgZGlkbid0IHdvcmsuCisJc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKKyAgICAgZmkKKyAgICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorCSYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKwkjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisJIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorCSMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKwkjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisJQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCisgIGFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgICBmaQorICAgICBpZiB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUgfHwgdGVzdCAkYW1fdHJ5IC1lcSAyOyB0aGVuCisgICAgICAgYnJlYWsKKyAgICAgZmkKKyAgICAgIyBKdXN0IGluIGNhc2UuCisgICAgIHNsZWVwIDEKKyAgICAgYW1faGFzX3NsZXB0PXllcworICAgZG9uZQorICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitBQ19NU0dfUkVTVUxUKFt5ZXNdKQorIyBJZiB3ZSBkaWRuJ3Qgc2xlZXAsIHdlIHN0aWxsIG5lZWQgdG8gZW5zdXJlIHRpbWUgc3RhbXBzIG9mIGNvbmZpZy5zdGF0dXMgYW5kCisjIGdlbmVyYXRlZCBmaWxlcyBhcmUgc3RyaWN0bHkgbmV3ZXIuCithbV9zbGVlcF9waWQ9CitpZiBncmVwICdzbGVwdDogbm8nIGNvbmZ0ZXN0LmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICggc2xlZXAgMSApICYKKyAgYW1fc2xlZXBfcGlkPSQhCitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKKyAgW0FDX01TR19DSEVDS0lORyhbdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIG5ld2VyIHRoYW4gY29uZmlndXJlXSkKKyAgIGlmIHRlc3QgLW4gIiRhbV9zbGVlcF9waWQiOyB0aGVuCisgICAgICMgSGlkZSB3YXJuaW5ncyBhYm91dCByZXVzZWQgUElEcy4KKyAgICAgd2FpdCAkYW1fc2xlZXBfcGlkIDI+L2Rldi9udWxsCisgICBmaQorICAgQUNfTVNHX1JFU1VMVChbZG9uZV0pXSkKK3JtIC1mIGNvbmZ0ZXN0LmZpbGUKK10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9TSUxFTlRfUlVMRVMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbmFibGUgbGVzcyB2ZXJib3NlIGJ1aWxkIHJ1bGVzOyB3aXRoIHRoZSBkZWZhdWx0IHNldCB0byBERUZBVUxUCisjICgieWVzIiBiZWluZyBsZXNzIHZlcmJvc2UsICJubyIgb3IgZW1wdHkgYmVpbmcgdmVyYm9zZSkuCitBQ19ERUZVTihbQU1fU0lMRU5UX1JVTEVTXSwKK1tBQ19BUkdfRU5BQkxFKFtzaWxlbnQtcnVsZXNdLCBbZG5sCitBU19IRUxQX1NUUklORygKKyAgWy0tZW5hYmxlLXNpbGVudC1ydWxlc10sCisgIFtsZXNzIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiAibWFrZSBWPTEiKV0pCitBU19IRUxQX1NUUklORygKKyAgWy0tZGlzYWJsZS1zaWxlbnQtcnVsZXNdLAorICBbdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86ICJtYWtlIFY9MCIpXSlkbmwKK10pCitjYXNlICRlbmFibGVfc2lsZW50X3J1bGVzIGluIEAlOkAgKCgoCisgIHllcykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7CisgICBubykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MTs7CisgICAgKikgQU1fREVGQVVMVF9WRVJCT1NJVFk9bTRfaWYoWyQxXSwgW3llc10sIFswXSwgWzFdKTs7Citlc2FjCitkbmwKK2RubCBBIGZldyAnbWFrZScgaW1wbGVtZW50YXRpb25zIChlLmcuLCBOb25TdG9wIE9TIGFuZCBOZXh0U3RlcCkKK2RubCBkbyBub3Qgc3VwcG9ydCBuZXN0ZWQgdmFyaWFibGUgZXhwYW5zaW9ucy4KK2RubCBTZWUgYXV0b21ha2UgYnVnIzk5MjggYW5kIGJ1ZyMxMDIzNy4KK2FtX21ha2U9JHtNQUtFLW1ha2V9CitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkYW1fbWFrZSBzdXBwb3J0cyBuZXN0ZWQgdmFyaWFibGVzXSwKKyAgIFthbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlc10sCisgICBbaWYgQVNfRUNITyhbWydUUlVFPSQoQkFSJChWKSkKK0JBUjA9ZmFsc2UKK0JBUjE9dHJ1ZQorVj0xCithbV9fZG9pdDoKKwlAJChUUlVFKQorLlBIT05ZOiBhbV9fZG9pdCddXSkgfCAkYW1fbWFrZSAtZiAtID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz15ZXMKK2Vsc2UKKyAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9bm8KK2ZpXSkKK2lmIHRlc3QgJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzID0geWVzOyB0aGVuCisgIGRubCBVc2luZyAnJFYnIGluc3RlYWQgb2YgJyQoViknIGJyZWFrcyBJUklYIG1ha2UuCisgIEFNX1Y9JyQoViknCisgIEFNX0RFRkFVTFRfVj0nJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSknCitlbHNlCisgIEFNX1Y9JEFNX0RFRkFVTFRfVkVSQk9TSVRZCisgIEFNX0RFRkFVTFRfVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKK2ZpCitBQ19TVUJTVChbQU1fVl0pZG5sCitBTV9TVUJTVF9OT1RNQUtFKFtBTV9WXSlkbmwKK0FDX1NVQlNUKFtBTV9ERUZBVUxUX1ZdKWRubAorQU1fU1VCU1RfTk9UTUFLRShbQU1fREVGQVVMVF9WXSlkbmwKK0FDX1NVQlNUKFtBTV9ERUZBVUxUX1ZFUkJPU0lUWV0pZG5sCitBTV9CQUNLU0xBU0g9J1wnCitBQ19TVUJTVChbQU1fQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTV9CQUNLU0xBU0hdKWRubAorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1BST0dfSU5TVEFMTF9TVFJJUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT25lIGlzc3VlIHdpdGggdmVuZG9yICdpbnN0YWxsJyAoZXZlbiBHTlUpIGlzIHRoYXQgeW91IGNhbid0CisjIHNwZWNpZnkgdGhlIHByb2dyYW0gdXNlZCB0byBzdHJpcCBiaW5hcmllcy4gIFRoaXMgaXMgZXNwZWNpYWxseQorIyBhbm5veWluZyBpbiBjcm9zcy1jb21waWxpbmcgZW52aXJvbm1lbnRzLCB3aGVyZSB0aGUgYnVpbGQncyBzdHJpcAorIyBpcyB1bmxpa2VseSB0byBoYW5kbGUgdGhlIGhvc3QncyBiaW5hcmllcy4KKyMgRm9ydHVuYXRlbHkgaW5zdGFsbC1zaCB3aWxsIGhvbm9yIGEgU1RSSVBQUk9HIHZhcmlhYmxlLCBzbyB3ZQorIyBhbHdheXMgdXNlIGluc3RhbGwtc2ggaW4gIm1ha2UgaW5zdGFsbC1zdHJpcCIsIGFuZCBpbml0aWFsaXplCisjIFNUUklQUFJPRyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgU1RSSVAgdmFyaWFibGUgKHNldCBieSB0aGUgdXNlcikuCitBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NUUklQXSwKK1tBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU0hdKWRubAorIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgJ3N0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biAibWFrZSBpbnN0YWxsLXN0cmlwIi4gIEhvd2V2ZXIgJ3N0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlICdTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgorZG5sIERvbid0IHRlc3QgZm9yICRjcm9zc19jb21waWxpbmcgPSB5ZXMsIGJlY2F1c2UgaXQgbWlnaHQgYmUgJ21heWJlJy4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCisgIEFDX0NIRUNLX1RPT0woW1NUUklQXSwgW3N0cmlwXSwgOikKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgorQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVibGljIHNpc3RlciBvZiBfQU1fU1VCU1RfTk9UTUFLRS4KK0FDX0RFRlVOKFtBTV9TVUJTVF9OT1RNQUtFXSwgW19BTV9TVUJTVF9OT1RNQUtFKCRAKV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIF9BTV9QUk9HX1RBUihGT1JNQVQpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCisjIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mICd2NycsICd1c3RhcicsIG9yICdwYXgnLgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAorIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQorIyAkdGFyZGlyLgorIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCisjIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCisjICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCisjCitBQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKK1sjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAorIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCitBQ19TVUJTVChbQU1UQVJdLCBbJyQke1RBUi10YXJ9J10pCisKKyMgV2UnbGwgbG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KK19hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCisKK200X2lmKFskMV0sIFt2N10sCisgIFthbV9fdGFyPSckJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIicgYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJ10sCisKKyAgW200X2Nhc2UoWyQxXSwKKyAgICBbdXN0YXJdLAorICAgICBbIyBUaGUgUE9TSVggMTk4OCAndXN0YXInIGZvcm1hdCBpcyBkZWZpbmVkIHdpdGggZml4ZWQtc2l6ZSBmaWVsZHMuCisgICAgICAjIFRoZXJlIGlzIG5vdGFibHkgYSAyMSBiaXRzIGxpbWl0IGZvciB0aGUgVUlEIGFuZCB0aGUgR0lELiAgSW4gZmFjdCwKKyAgICAgICMgdGhlICdwYXgnIHV0aWxpdHkgY2FuIGhhbmcgb24gYmlnZ2VyIFVJRC9HSUQgKHNlZSBhdXRvbWFrZSBidWcjODM0MworICAgICAgIyBhbmQgYnVnIzEzNTg4KS4KKyAgICAgIGFtX21heF91aWQ9MjA5NzE1MSAjIDJeMjEgLSAxCisgICAgICBhbV9tYXhfZ2lkPSRhbV9tYXhfdWlkCisgICAgICAjIFRoZSAkVUlEIGFuZCAkR0lEIHZhcmlhYmxlcyBhcmUgbm90IHBvcnRhYmxlLCBzbyB3ZSBuZWVkIHRvIHJlc29ydAorICAgICAgIyB0byB0aGUgUE9TSVgtbWFuZGF0ZWQgaWQoMSkgdXRpbGl0eS4gIEVycm9ycyBpbiB0aGUgJ2lkJyBjYWxscworICAgICAgIyBiZWxvdyBhcmUgZGVmaW5pdGVseSB1bmV4cGVjdGVkLCBzbyBhbGxvdyB0aGUgdXNlcnMgdG8gc2VlIHRoZW0KKyAgICAgICMgKHRoYXQgaXMsIGF2b2lkIHN0ZGVyciByZWRpcmVjdGlvbikuCisgICAgICBhbV91aWQ9YGlkIC11IHx8IGVjaG8gdW5rbm93bmAKKyAgICAgIGFtX2dpZD1gaWQgLWcgfHwgZWNobyB1bmtub3duYAorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIFVJRCAnJGFtX3VpZCcgaXMgc3VwcG9ydGVkIGJ5IHVzdGFyIGZvcm1hdF0pCisgICAgICBpZiB0ZXN0ICRhbV91aWQgLWxlICRhbV9tYXhfdWlkOyB0aGVuCisgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgZWxzZQorICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgX2FtX3Rvb2xzPW5vbmUKKyAgICAgIGZpCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgR0lEICckYW1fZ2lkJyBpcyBzdXBwb3J0ZWQgYnkgdXN0YXIgZm9ybWF0XSkKKyAgICAgIGlmIHRlc3QgJGFtX2dpZCAtbGUgJGFtX21heF9naWQ7IHRoZW4KKyAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICBlbHNlCisgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgX2FtX3Rvb2xzPW5vbmUKKyAgICAgIGZpXSwKKworICBbcGF4XSwKKyAgICBbXSwKKworICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCisKKyAgIyBHbyBhaGVhZCBldmVuIGlmIHdlIGhhdmUgdGhlIHZhbHVlIGFscmVhZHkgY2FjaGVkLiAgV2UgZG8gc28gYmVjYXVzZSB3ZQorICAjIG5lZWQgdG8gc2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSAnYW1fX3RhcicgYW5kICdhbV9fdW50YXInIHZhcmlhYmxlcy4KKyAgX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KKworICBmb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29sczsgZG8KKyAgICBjYXNlICRfYW1fdG9vbCBpbgorICAgIGdudXRhcikKKyAgICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsgZG8KKyAgICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKKyAgICAgIGRvbmUKKyAgICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJworICAgICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCisgICAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgorICAgICAgOzsKKyAgICBwbGFpbnRhcikKKyAgICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCisgICAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgorICAgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCisgICAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKKyAgICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgICA7OworICAgIHBheCkKKyAgICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJworICAgICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCisgICAgICBhbV9fdW50YXI9J3BheCAtcicKKyAgICAgIDs7CisgICAgY3BpbykKKyAgICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCisgICAgICA7OworICAgIG5vbmUpCisgICAgICBhbV9fdGFyPWZhbHNlCisgICAgICBhbV9fdGFyXz1mYWxzZQorICAgICAgYW1fX3VudGFyPWZhbHNlCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICAgIyBhbmQgYW1fX3VudGFyIHNldC4KKyAgICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKKworICAgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3Jrcy4KKyAgICBybSAtcmYgY29uZnRlc3QuZGlyCisgICAgbWtkaXIgY29uZnRlc3QuZGlyCisgICAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQorICAgIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCisgICAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICAgIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCisgICAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQorICAgICAgQU1fUlVOX0xPRyhbY2F0IGNvbmZ0ZXN0LmRpci9maWxlXSkKKyAgICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhaworICAgIGZpCisgIGRvbmUKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorCisgIEFDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKKyAgQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQorCitBQ19TVUJTVChbYW1fX3Rhcl0pCitBQ19TVUJTVChbYW1fX3VudGFyXSkKK10pICMgX0FNX1BST0dfVEFSCisKK200X2luY2x1ZGUoW200L2F4X2FwcGVuZF9jb21waWxlX2ZsYWdzLm00XSkKK200X2luY2x1ZGUoW200L2F4X2FwcGVuZF9mbGFnLm00XSkKK200X2luY2x1ZGUoW200L2F4X2FwcGVuZF9saW5rX2ZsYWdzLm00XSkKK200X2luY2x1ZGUoW200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9jaGVja19saW5rX2ZsYWcubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfcHRocmVhZC5tNF0pCittNF9pbmNsdWRlKFttNC9heF9yZXF1aXJlX2RlZmluZWQubTRdKQorbTRfaW5jbHVkZShbbTQvbGlidG9vbC5tNF0pCittNF9pbmNsdWRlKFttNC9sdG9wdGlvbnMubTRdKQorbTRfaW5jbHVkZShbbTQvbHRzdWdhci5tNF0pCittNF9pbmNsdWRlKFttNC9sdHZlcnNpb24ubTRdKQorbTRfaW5jbHVkZShbbTQvbHR+b2Jzb2xldGUubTRdKQpkaWZmIC0tZ2l0IGEvYXV0by9jb21waWxlIGIvYXV0by9jb21waWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzMTEzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvL2NvbXBpbGUKQEAgLTAsMCArMSwzNDcgQEAKKyMhIC9iaW4vc2gKKyMgV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kICctYyAtbycuCisKK3NjcmlwdHZlcnNpb249MjAxMi0xMC0xNC4xMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAorIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCisjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorCitubD0nCisnCisKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgdG9vbHMgZnJvbSBjb21wbGFpbmluZyBhYm91dCB3aGl0ZXNwYWNlIHVzYWdlLgorSUZTPSIgIiIJJG5sIgorCitmaWxlX2NvbnY9CisKKyMgZnVuY19maWxlX2NvbnYgYnVpbGRfZmlsZSBsYXp5CisjIENvbnZlcnQgYSAkYnVpbGQgZmlsZSB0byAkaG9zdCBmb3JtIGFuZCBzdG9yZSBpdCBpbiAkZmlsZQorIyBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBXaW5kb3dzIGhvc3RzLiBJZiB0aGUgZGV0ZXJtaW5lZCBjb252ZXJzaW9uCisjIHR5cGUgaXMgbGlzdGVkIGluICh0aGUgY29tbWEgc2VwYXJhdGVkKSBMQVpZLCBubyBjb252ZXJzaW9uIHdpbGwKKyMgdGFrZSBwbGFjZS4KK2Z1bmNfZmlsZV9jb252ICgpCit7CisgIGZpbGU9JDEKKyAgY2FzZSAkZmlsZSBpbgorICAgIC8gfCAvWyEvXSopICMgYWJzb2x1dGUgZmlsZSwgYW5kIG5vdCBhIFVOQyBmaWxlCisgICAgICBpZiB0ZXN0IC16ICIkZmlsZV9jb252IjsgdGhlbgorCSMgbGF6aWx5IGRldGVybWluZSBob3cgdG8gY29udmVydCBhYnMgZmlsZXMKKwljYXNlIGB1bmFtZSAtc2AgaW4KKwkgIE1JTkdXKikKKwkgICAgZmlsZV9jb252PW1pbmd3CisJICAgIDs7CisJICBDWUdXSU4qKQorCSAgICBmaWxlX2NvbnY9Y3lnd2luCisJICAgIDs7CisJICAqKQorCSAgICBmaWxlX2NvbnY9d2luZQorCSAgICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBjYXNlICRmaWxlX2NvbnYvLCQyLCBpbgorCSosJGZpbGVfY29udiwqKQorCSAgOzsKKwltaW5ndy8qKQorCSAgZmlsZT1gY21kIC8vQyBlY2hvICIkZmlsZSAiIHwgc2VkIC1lICdzLyJcKC4qXCkgIiAqJC9cMS8nYAorCSAgOzsKKwljeWd3aW4vKikKKwkgIGZpbGU9YGN5Z3BhdGggLW0gIiRmaWxlIiB8fCBlY2hvICIkZmlsZSJgCisJICA7OworCXdpbmUvKikKKwkgIGZpbGU9YHdpbmVwYXRoIC13ICIkZmlsZSIgfHwgZWNobyAiJGZpbGUiYAorCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2NsX2Rhc2hMIGxpbmtkaXIKKyMgTWFrZSBjbCBsb29rIGZvciBsaWJyYXJpZXMgaW4gTElOS0RJUgorZnVuY19jbF9kYXNoTCAoKQoreworICBmdW5jX2ZpbGVfY29udiAiJDEiCisgIGlmIHRlc3QgLXogIiRsaWJfcGF0aCI7IHRoZW4KKyAgICBsaWJfcGF0aD0kZmlsZQorICBlbHNlCisgICAgbGliX3BhdGg9IiRsaWJfcGF0aDskZmlsZSIKKyAgZmkKKyAgbGlua2VyX29wdHM9IiRsaW5rZXJfb3B0cyAtTElCUEFUSDokZmlsZSIKK30KKworIyBmdW5jX2NsX2Rhc2hsIGxpYnJhcnkKKyMgRG8gYSBsaWJyYXJ5IHNlYXJjaC1wYXRoIGxvb2t1cCBmb3IgY2wKK2Z1bmNfY2xfZGFzaGwgKCkKK3sKKyAgbGliPSQxCisgIGZvdW5kPW5vCisgIHNhdmVfSUZTPSRJRlMKKyAgSUZTPSc7JworICBmb3IgZGlyIGluICRsaWJfcGF0aCAkTElCCisgIGRvCisgICAgSUZTPSRzYXZlX0lGUworICAgIGlmICRzaGFyZWQgJiYgdGVzdCAtZiAiJGRpci8kbGliLmRsbC5saWIiOyB0aGVuCisgICAgICBmb3VuZD15ZXMKKyAgICAgIGxpYj0kZGlyLyRsaWIuZGxsLmxpYgorICAgICAgYnJlYWsKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgIiRkaXIvJGxpYi5saWIiOyB0aGVuCisgICAgICBmb3VuZD15ZXMKKyAgICAgIGxpYj0kZGlyLyRsaWIubGliCisgICAgICBicmVhaworICAgIGZpCisgICAgaWYgdGVzdCAtZiAiJGRpci9saWIkbGliLmEiOyB0aGVuCisgICAgICBmb3VuZD15ZXMKKyAgICAgIGxpYj0kZGlyL2xpYiRsaWIuYQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0kc2F2ZV9JRlMKKworICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgorICAgIGxpYj0kbGliLmxpYgorICBmaQorfQorCisjIGZ1bmNfY2xfd3JhcHBlciBjbCBhcmcuLi4KKyMgQWRqdXN0IGNvbXBpbGUgY29tbWFuZCB0byBzdWl0IGNsCitmdW5jX2NsX3dyYXBwZXIgKCkKK3sKKyAgIyBBc3N1bWUgYSBjYXBhYmxlIHNoZWxsCisgIGxpYl9wYXRoPQorICBzaGFyZWQ9OgorICBsaW5rZXJfb3B0cz0KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRlYXQiOyB0aGVuCisgICAgICBlYXQ9CisgICAgZWxzZQorICAgICAgY2FzZSAkMSBpbgorCS1vKQorCSAgIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzICdjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCisJICBlYXQ9MQorCSAgY2FzZSAkMiBpbgorCSAgICAqLm8gfCAqLltvT11bYkJdW2pKXSkKKwkgICAgICBmdW5jX2ZpbGVfY29udiAiJDIiCisJICAgICAgc2V0IHggIiRAIiAtRm8iJGZpbGUiCisJICAgICAgc2hpZnQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIGZ1bmNfZmlsZV9jb252ICIkMiIKKwkgICAgICBzZXQgeCAiJEAiIC1GZSIkZmlsZSIKKwkgICAgICBzaGlmdAorCSAgICAgIDs7CisJICBlc2FjCisJICA7OworCS1JKQorCSAgZWF0PTEKKwkgIGZ1bmNfZmlsZV9jb252ICIkMiIgbWluZ3cKKwkgIHNldCB4ICIkQCIgLUkiJGZpbGUiCisJICBzaGlmdAorCSAgOzsKKwktSSopCisJICBmdW5jX2ZpbGVfY29udiAiJHsxIy1JfSIgbWluZ3cKKwkgIHNldCB4ICIkQCIgLUkiJGZpbGUiCisJICBzaGlmdAorCSAgOzsKKwktbCkKKwkgIGVhdD0xCisJICBmdW5jX2NsX2Rhc2hsICIkMiIKKwkgIHNldCB4ICIkQCIgIiRsaWIiCisJICBzaGlmdAorCSAgOzsKKwktbCopCisJICBmdW5jX2NsX2Rhc2hsICIkezEjLWx9IgorCSAgc2V0IHggIiRAIiAiJGxpYiIKKwkgIHNoaWZ0CisJICA7OworCS1MKQorCSAgZWF0PTEKKwkgIGZ1bmNfY2xfZGFzaEwgIiQyIgorCSAgOzsKKwktTCopCisJICBmdW5jX2NsX2Rhc2hMICIkezEjLUx9IgorCSAgOzsKKwktc3RhdGljKQorCSAgc2hhcmVkPWZhbHNlCisJICA7OworCS1XbCwqKQorCSAgYXJnPSR7MSMtV2wsfQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgZmxhZyBpbiAkYXJnOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgbGlua2VyX29wdHM9IiRsaW5rZXJfb3B0cyAkZmxhZyIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgOzsKKwktWGxpbmtlcikKKwkgIGVhdD0xCisJICBsaW5rZXJfb3B0cz0iJGxpbmtlcl9vcHRzICQyIgorCSAgOzsKKwktKikKKwkgIHNldCB4ICIkQCIgIiQxIgorCSAgc2hpZnQKKwkgIDs7CisJKi5jYyB8ICouQ0MgfCAqLmN4eCB8ICouQ1hYIHwgKi5bY0NdKyspCisJICBmdW5jX2ZpbGVfY29udiAiJDEiCisJICBzZXQgeCAiJEAiIC1UcCIkZmlsZSIKKwkgIHNoaWZ0CisJICA7OworCSouYyB8ICouY3BwIHwgKi5DUFAgfCAqLmxpYiB8ICouTElCIHwgKi5MaWIgfCAqLk9CSiB8ICoub2JqIHwgKi5bb09dKQorCSAgZnVuY19maWxlX2NvbnYgIiQxIiBtaW5ndworCSAgc2V0IHggIiRAIiAiJGZpbGUiCisJICBzaGlmdAorCSAgOzsKKwkqKQorCSAgc2V0IHggIiRAIiAiJDEiCisJICBzaGlmdAorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIHNoaWZ0CisgIGRvbmUKKyAgaWYgdGVzdCAtbiAiJGxpbmtlcl9vcHRzIjsgdGhlbgorICAgIGxpbmtlcl9vcHRzPSItbGluayRsaW5rZXJfb3B0cyIKKyAgZmkKKyAgZXhlYyAiJEAiICRsaW5rZXJfb3B0cworICBleGl0IDEKK30KKworZWF0PQorCitjYXNlICQxIGluCisgICcnKQorICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSAnJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kICctYyAtbycuCitSZW1vdmUgJy1vIGRlc3QubycgZnJvbSBBUkdTLCBydW4gUFJPR1JBTSB3aXRoIHRoZSByZW1haW5pbmcKK2FyZ3VtZW50cywgYW5kIHJlbmFtZSB0aGUgb3V0cHV0IGFzIGV4cGVjdGVkLgorCitJZiB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIHdob2xlIHBhY2thZ2UgdGhpcyBpcyBub3QgdGhlCityaWdodCBzY3JpcHQgdG8gcnVuOiBwbGVhc2Ugc3RhcnQgYnkgcmVhZGluZyB0aGUgZmlsZSAnSU5TVEFMTCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7CisgIGNsIHwgKlsvXFxdY2wgfCBjbC5leGUgfCAqWy9cXF1jbC5leGUgKQorICAgIGZ1bmNfY2xfd3JhcHBlciAiJEAiICAgICAgIyBEb2Vzbid0IHJldHVybi4uLgorICAgIDs7Citlc2FjCisKK29maWxlPQorY2ZpbGU9CisKK2ZvciBhcmcKK2RvCisgIGlmIHRlc3QgLW4gIiRlYXQiOyB0aGVuCisgICAgZWF0PQorICBlbHNlCisgICAgY2FzZSAkMSBpbgorICAgICAgLW8pCisJIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzICdjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCisJIyBTbyB3ZSBzdHJpcCAnLW8gYXJnJyBvbmx5IGlmIGFyZyBpcyBhbiBvYmplY3QuCisJZWF0PTEKKwljYXNlICQyIGluCisJICAqLm8gfCAqLm9iaikKKwkgICAgb2ZpbGU9JDIKKwkgICAgOzsKKwkgICopCisJICAgIHNldCB4ICIkQCIgLW8gIiQyIgorCSAgICBzaGlmdAorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKi5jKQorCWNmaWxlPSQxCisJc2V0IHggIiRAIiAiJDEiCisJc2hpZnQKKwk7OworICAgICAgKikKKwlzZXQgeCAiJEAiICIkMSIKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBmaQorICBzaGlmdAorZG9uZQorCitpZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KKyAgIyBJZiBubyAnLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQorICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCisgICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KKyAgIyAnLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbworICAjIG9rLgorICBleGVjICIkQCIKK2ZpCisKKyMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCitjb2ZpbGU9YGVjaG8gIiRjZmlsZSIgfCBzZWQgJ3N8Xi4qW1xcL118fDsgc3xeW2EtekEtWl06fHw7IHMvXC5jJC8uby8nYAorCisjIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCisjIE5vdGU6IHVzZSAnWy9cXDouLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKKyMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKKyMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgorbG9ja2Rpcj1gZWNobyAiJGNvZmlsZSIgfCBzZWQgLWUgJ3N8Wy9cXDouLV18X3xnJ2AuZAord2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiRsb2NrZGlyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBicmVhaworICBmaQorICBzbGVlcCAxCitkb25lCisjIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KK3RyYXAgInJtZGlyICckbG9ja2Rpcic7IGV4aXQgMSIgMSAyIDE1CisKKyMgUnVuIHRoZSBjb21waWxlLgorIiRAIgorcmV0PSQ/CisKK2lmIHRlc3QgLWYgIiRjb2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRjb2ZpbGUiID0gIiRvZmlsZSIgfHwgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCitlbGlmIHRlc3QgLWYgIiR7Y29maWxlfWJqIjsgdGhlbgorICB0ZXN0ICIke2NvZmlsZX1iaiIgPSAiJG9maWxlIiB8fCBtdiAiJHtjb2ZpbGV9YmoiICIkb2ZpbGUiCitmaQorCitybWRpciAiJGxvY2tkaXIiCitleGl0ICRyZXQKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2F1dG8vY29uZmlnLmd1ZXNzIGIvYXV0by9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY1YzUwYwotLS0gL2Rldi9udWxsCisrKyBiL2F1dG8vY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTQyMCBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAxOTkyLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxNC0wMy0yMycKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0CisjIHByb2dyYW0uICBUaGlzIEV4Y2VwdGlvbiBpcyBhbiBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3CisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKS4KKyMKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorIworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECisjCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgd2l0aCBhIENoYW5nZUxvZyBlbnRyeSB0byBjb25maWctcGF0Y2hlc0BnbnUub3JnLgorCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgMTk5Mi0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKK2Nhc2UgIiR7VU5BTUVfU1lTVEVNfSIgaW4KK0xpbnV4fEdOVXxHTlUvKikKKwkjIElmIHRoZSBzeXN0ZW0gbGFja3MgYSBjb21waWxlciwgdGhlbiBqdXN0IHBpY2sgZ2xpYmMuCisJIyBXZSBjb3VsZCBwcm9iYWJseSB0cnkgaGFyZGVyLgorCUxJQkM9Z251CisKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJY2F0IDw8LUVPRiA+ICRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmIGRlZmluZWQoX19VQ0xJQkNfXykKKwlMSUJDPXVjbGliYworCSNlbGlmIGRlZmluZWQoX19kaWV0bGliY19fKQorCUxJQkM9ZGlldGxpYmMKKwkjZWxzZQorCUxJQkM9Z251CisJI2VuZGlmCisJRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15MSUJDJyB8IHNlZCAncywgLCxnJ2AKKwk7OworZXNhYworCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIC1xIF9fRUxGX18KKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJCW9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpCaXRyaWc6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9CaXRyaWcuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tYml0cmlnJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpTb2xpZEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCSMgUmVzZXQgRVhJVCB0cmFwIGJlZm9yZSBleGl0aW5nIHRvIGF2b2lkIHNwdXJpb3VzIG5vbi16ZXJvIGV4aXQgY29kZS4KKwlleGl0Y29kZT0kPworCXRyYXAgJycgMAorCWV4aXQgJGV4aXRjb2RlIDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCA7OworICAgICo6ei9WTToqOiopCisJZWNobyBzMzkwLWlibS16dm1vZQorCWV4aXQgOzsKKyAgICAqOk9TNDAwOio6KikKKwllY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybSo6cmlzY29zOio6Knxhcm0qOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKwllY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorCWVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorCSMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1NjddKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKwkJICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorCQkgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisJCSAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorCQkgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKwkJICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisJCQljYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKwkJCSAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworCQkJICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKwkJCWVzYWMgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKworCQkjZGVmaW5lIF9IUFVYX1NPVVJDRQorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCQlpbnQgbWFpbiAoKQorCQl7CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKwkJI2VuZGlmCisJCSAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisJCSAgICBzd2l0Y2ggKGNwdSkKKwkJCXsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMl8wOgorCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCQkgICAgc3dpdGNoIChiaXRzKQorCQkJCXsKKwkJCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisJCQkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkJCX0gYnJlYWs7CisJCSNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisJCQkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCSNlbmRpZgorCQkJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQl9CisJCSAgICBleGl0ICgwKTsKKwkJfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwljYXNlICR7VU5BTUVfUFJPQ0VTU09SfSBpbgorCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXNjQqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3NjQKKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICAqOk1TWVMqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zeXMKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgODY2NDpXaW5kb3dzX05UOiopCisJZWNobyB4ODZfNjQtcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLSR7TElCQ31gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAorCWV4aXQgOzsKKyAgICAqOkdOVS8qOio6KikKKwkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLSR7TElCQ30KKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFhcmNoNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgYWFyY2g2NF9iZTpMaW51eDoqOiopCisJVU5BTUVfTUFDSElORT1hYXJjaDY0X2JlCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworCWVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJnbnVsaWJjMSIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJjOkxpbnV4Oio6KiB8IGFyY2ViOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlpZiBlY2hvIF9fQVJNX0VBQklfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJICAgIHwgZ3JlcCAtcSBfX0FSTV9FQUJJX18KKwl0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwllbHNlCisJICAgIGlmIGVjaG8gX19BUk1fUENTX1ZGUCB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCXwgZ3JlcCAtcSBfX0FSTV9QQ1NfVkZQCisJICAgIHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfWVhYmkKKwkgICAgZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9ZWFiaWhmCisJICAgIGZpCisJZmkKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWF4aXMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgaGV4YWdvbjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtJHtMSUJDfSI7IGV4aXQ7IH0KKwk7OworICAgIG9wZW5yaXNjKjpMaW51eDoqOiopCisJZWNobyBvcjFrLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBvcjMyOkxpbnV4Oio6KiB8IG9yMWsqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCWVzYWMKKwlleGl0IDs7CisgICAgcHBjNjQ6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcHBjNjRsZTpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcHBjbGU6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgdGlsZSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHh0ZW5zYSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIHg4Nl82NDpIYWlrdToqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1oYWlrdQorCWV4aXQgOzsKKyAgICBTWC00OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC03OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtODpTVVBFUi1VWDoqOiopCisJZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLThSOlNVUEVSLVVYOio6KikKKwllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9IHVua25vd24gOyB0aGVuCisJICAgIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjCisJZmkKKwlpZiB0ZXN0IGBlY2hvICIkVU5BTUVfUkVMRUFTRSIgfCBzZWQgLWUgJ3MvXC4uKi8vJ2AgLWxlIDEwIDsgdGhlbgorCSAgICBpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkJaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQkgICAgZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJCQlpMzg2KSBVTkFNRV9QUk9DRVNTT1I9eDg2XzY0IDs7CisJCQlwb3dlcnBjKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYzY0IDs7CisJCSAgICBlc2FjCisJCWZpCisJICAgIGZpCisJZWxpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9IGkzODYgOyB0aGVuCisJICAgICMgQXZvaWQgZXhlY3V0aW5nIGNjIG9uIE9TIFggMTAuOSwgYXMgaXQgc2hpcHMgd2l0aCBhIHN0dWIKKwkgICAgIyB0aGF0IHB1dHMgdXAgYSBncmFwaGljYWwgYWxlcnQgcHJvbXB0aW5nIHRvIGluc3RhbGwKKwkgICAgIyBkZXZlbG9wZXIgdG9vbHMuICBBbnkgc3lzdGVtIHJ1bm5pbmcgTWFjIE9TIFggMTAuNyBvcgorCSAgICAjIGxhdGVyIChEYXJ3aW4gMTEgYW5kIGxhdGVyKSBpcyByZXF1aXJlZCB0byBoYXZlIGEgNjQtYml0CisJICAgICMgcHJvY2Vzc29yLiBUaGlzIGlzIG5vdCB0cnVlIG9mIHRoZSBBUk0gdmVyc2lvbiBvZiBEYXJ3aW4KKwkgICAgIyB0aGF0IEFwcGxlIHVzZXMgaW4gcG9ydGFibGUgZGV2aWNlcy4KKwkgICAgVU5BTUVfUFJPQ0VTU09SPXg4Nl82NAorCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTkVPLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbmVvLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TRS0qOk5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorCWVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7CisgICAgeDg2XzY0OlZNa2VybmVsOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1lc3gKKwlleGl0IDs7Citlc2FjCisKK2NhdCA+JjIgPDxFT0YKKyQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKKworVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKK2Rvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQorCisgIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorYW5kCisgIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKKworSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCitzZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQorcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKK2luZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KKworY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKKwordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCisKK2hvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKKworVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KK1VOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9CitVTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19CitVTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQorRU9GCisKK2V4aXQgMQorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9hdXRvL2NvbmZpZy5zdWIgYi9hdXRvL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmJhNGVmYgotLS0gL2Rldi9udWxsCisrKyBiL2F1dG8vY29uZmlnLnN1YgpAQCAtMCwwICsxLDE3OTkgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAxOTkyLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxNC0wOS0xMScKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0CisjIHByb2dyYW0uICBUaGlzIEV4Y2VwdGlvbiBpcyBhbiBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3CisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgd2l0aCBhIENoYW5nZUxvZyBlbnRyeSB0byBjb25maWctcGF0Y2hlc0BnbnUub3JnLgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgMTk5Mi0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWFuZHJvaWQqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgXAorICBsaW51eC1tdXNsKiB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IFwKKyAga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAorICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgYW5kcm9pZC1saW51eCkKKyAgICBvcz0tbGludXgtYW5kcm9pZAorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgLXVua25vd24KKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkgfCAtbWljcm9ibGF6ZSopCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWJsdWVnZW5lKikKKwkJb3M9LWNuaworCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzcmRiKQorCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzYpCisJCW9zPS1zY281djYKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY281djYqKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCoxNzgpCisJCW9zPS1seW54b3MxNzgKKwkJOzsKKwktbHlueCo1KQorCQlvcz0tbHlueG9zNQorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWFyY2g2NCB8IGFhcmNoNjRfYmUgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJjZWIgXAorCXwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMi04XSB8IGFybXZbMy04XVtsYl0gfCBhcm12N1thcm1dIFwKKwl8IGF2ciB8IGF2cjMyIFwKKwl8IGJlMzIgfCBiZTY0IFwKKwl8IGJmaW4gXAorCXwgYzR4IHwgYzgwNTEgfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBlcGlwaGFueSBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaGV4YWdvbiBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgazFvbSBcCisJfCBsZTMyIHwgbGU2NCBcCisJfCBsbTMyIFwKKwl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAorCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1pY3JvYmxhemVlbCB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0b2N0ZW9uIHwgbWlwczY0b2N0ZW9uZWwgXAorCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHI1OTAwIHwgbWlwczY0cjU5MDBlbCBcCisJfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwczY0dnI1OTAwIHwgbWlwczY0dnI1OTAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2EzMnI2IHwgbWlwc2lzYTMycjZlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0cjYgfCBtaXBzaXNhNjRyNmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzcjU5MDAgfCBtaXBzcjU5MDBlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5kczMyIHwgbmRzMzJsZSB8IG5kczMyYmUgXAorCXwgbmlvcyB8IG5pb3MyIHwgbmlvczJlYiB8IG5pb3MyZWwgXAorCXwgbnMxNmsgfCBuczMyayBcCisJfCBvcGVuOCB8IG9yMWsgfCBvcjFrbmQgfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgXAorCXwgcHlyYW1pZCBcCisJfCByaXNjdjMyIHwgcmlzY3Y2NCBcCisJfCBybDc4IHwgcnggXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSBcCisJfCB0YWhvZSB8IHRpYzR4IHwgdGljNTR4IHwgdGljNTV4IHwgdGljNnggfCB0aWM4MCB8IHRyb24gXAorCXwgdWJpY29tMzIgXAorCXwgdjg1MCB8IHY4NTBlIHwgdjg1MGUxIHwgdjg1MGUyIHwgdjg1MGVzIHwgdjg1MGUydjMgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwljNTR4KQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCTs7CisJYzU1eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQk7OworCWM2eCkKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCTs7CisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgbTY4aGNzMTJ4IHwgbnZwdHggfCBwaWNvY2hpcCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCXN0cm9uZ2FybSB8IHRodW1iIHwgeHNjYWxlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCTs7CisJeGdhdGUpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCXhzY2FsZWViKQorCQliYXNpY19tYWNoaW5lPWFybWViLXVua25vd24KKwkJOzsKKworCXhzY2FsZWVsKQorCQliYXNpY19tYWNoaW5lPWFybWVsLXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhYXJjaDY0LSogfCBhYXJjaDY0X2JlLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiB8IGFyY2ViLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmUzMi0qIHwgYmU2NC0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGM4MDUxLSogfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaGV4YWdvbi0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBrMW9tLSogXAorCXwgbGUzMi0qIHwgbGU2NC0qIFwKKwl8IGxtMzItKiBcCisJfCBtMzJjLSogfCBtMzJyLSogfCBtMzJybGUtKiBcCisJfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiBcCisJfCBtaWNyb2JsYXplLSogfCBtaWNyb2JsYXplZWwtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0b2N0ZW9uLSogfCBtaXBzNjRvY3Rlb25lbC0qIFwKKwl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAorCXwgbWlwczY0cjU5MDAtKiB8IG1pcHM2NHI1OTAwZWwtKiBcCisJfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhMzJyNi0qIHwgbWlwc2lzYTMycjZlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHI2LSogfCBtaXBzaXNhNjRyNmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3I1OTAwLSogfCBtaXBzcjU5MDBlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIHwgbmlvczJlYi0qIHwgbmlvczJlbC0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3BlbjgtKiBcCisJfCBvcjFrKi0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcmw3OC0qIHwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdGlsZSotKiBcCisJfCB0cm9uLSogXAorCXwgdWJpY29tMzItKiBcCisJfCB2ODUwLSogfCB2ODUwZS0qIHwgdjg1MGUxLSogfCB2ODUwZXMtKiB8IHY4NTBlMi0qIHwgdjg1MGUydjMtKiBcCisJfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzU0eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM1NXgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNngtKikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYgfCBjcjE2LSopCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaWNyb2JsYXplKikKKwkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAorCQk7OworCW1pbmd3NjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCW9zPS1taW5ndzY0CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbW94aWVib3gpCisJCWJhc2ljX21hY2hpbmU9bW94aWUtdW5rbm93bgorCQlvcz0tbW94aWVib3gKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXN5cykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1tc3lzCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluYWNsKQorCQliYXNpY19tYWNoaW5lPWxlMzItdW5rbm93bgorCQlvcz0tbmFjbAorCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbmVvLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uZW8tdGFuZGVtCisJCTs7CisJbnNlLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc2UtdGFuZGVtCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjIHwgcHBjYmUpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSogfCBwcGNiZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zIHwgcmRvczY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tcmRvcworCQk7OworCXJkb3MzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eeHNjYWxlL2FybS8nYAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisJIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKwkjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1hdXJvcmF1eCkKKwkJb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiB8IC1wbGFuOSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLWJpdHJpZyogfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLW1pbmd3NjQqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtbXVzbCogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogfCAtbW94aWVib3gqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAorCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAorCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAorCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKKwkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKKwkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAorCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyogfCAtZHJvcHMqIHwgLWVzKiB8IC10aXJ0b3MqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisJLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbmFjbCopCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwlzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisJc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworCWM0eC0qIHwgdGljNHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwljODA1MS0qKQorCQlvcz0tZWxmCisJCTs7CisJaGV4YWdvbi0qKQorCQlvcz0tZWxmCisJCTs7CisJdGljNTR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNngtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9hdXRvL2RlcGNvbXAgYi9hdXRvL2RlcGNvbXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGViZDViMwotLS0gL2Rldi9udWxsCisrKyBiL2F1dG8vZGVwY29tcApAQCAtMCwwICsxLDc5MSBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAxMy0wNS0zMC4wNzsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSAnJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICBleGl0IDE7CisgICAgOzsKKyAgLWggfCAtLWgqKQorICAgIGNhdCA8PFxFT0YKK1VzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCisKK1J1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcworYXMgc2lkZS1lZmZlY3RzLgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KKyAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSAnUFJPR1JBTVMgQVJHUycuCisgIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSAnUFJPR1JBTVMgQVJHUycuCisgIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCisgIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCisgIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dHRpbmcgZGVwZW5kZW5jaWVzLgorICBsaWJ0b29sICAgICBXaGV0aGVyIGxpYnRvb2wgaXMgdXNlZCAoeWVzL25vKS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworIyBHZXQgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHBhdGgsIGFuZCBzYXZlIGl0IGluIHRoZQorIyBnbG9iYWwgdmFyaWFibGVzICckZGlyJy4gIE5vdGUgdGhhdCB0aGlzIGRpcmVjdG9yeSBjb21wb25lbnQgd2lsbAorIyBiZSBlaXRoZXIgZW1wdHkgb3IgZW5kaW5nIHdpdGggYSAnLycgY2hhcmFjdGVyLiAgVGhpcyBpcyBkZWxpYmVyYXRlLgorc2V0X2Rpcl9mcm9tICgpCit7CisgIGNhc2UgJDEgaW4KKyAgICAqLyopIGRpcj1gZWNobyAiJDEiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYDs7CisgICAgICAqKSBkaXI9OzsKKyAgZXNhYworfQorCisjIEdldCB0aGUgc3VmZml4LXN0cmlwcGVkIGJhc2VuYW1lIG9mIHRoZSBnaXZlbiBwYXRoLCBhbmQgc2F2ZSBpdCB0aGUKKyMgZ2xvYmFsIHZhcmlhYmxlICckYmFzZScuCitzZXRfYmFzZV9mcm9tICgpCit7CisgIGJhc2U9YGVjaG8gIiQxIiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wuW14uXSokLy8nYAorfQorCisjIElmIG5vIGRlcGVuZGVuY3kgZmlsZSB3YXMgYWN0dWFsbHkgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaW52b2NhdGlvbiwKKyMgd2Ugc3RpbGwgaGF2ZSB0byBjcmVhdGUgYSBkdW1teSBkZXBmaWxlLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUKKyMgTWFrZWZpbGUgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCittYWtlX2R1bW15X2RlcGZpbGUgKCkKK3sKKyAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKK30KKworIyBGYWN0b3Igb3V0IHNvbWUgY29tbW9uIHBvc3QtcHJvY2Vzc2luZyBvZiB0aGUgZ2VuZXJhdGVkIGRlcGZpbGUuCisjIFJlcXVpcmVzIHRoZSBhdXhpbGlhcnkgZ2xvYmFsIHZhcmlhYmxlICckdG1wZGVwZmlsZScgdG8gYmUgc2V0LgorYWl4X3Bvc3RfcHJvY2Vzc19kZXBmaWxlICgpCit7CisgICMgSWYgdGhlIGNvbXBpbGVyIGFjdHVhbGx5IG1hbmFnZWQgdG8gcHJvZHVjZSBhIGRlcGVuZGVuY3kgZmlsZSwKKyAgIyBwb3N0LXByb2Nlc3MgaXQuCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtICdmb28ubzogZGVwZW5kZW5jeS5oJy4KKyAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAgICMgICAkb2JqZWN0OiBkZXBlbmRlbmN5LmgKKyAgICAjIGFuZCBvbmUgdG8gc2ltcGx5IG91dHB1dAorICAgICMgICBkZXBlbmRlbmN5Lmg6CisgICAgIyB3aGljaCBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGRlbGV0ZWQtaGVhZGVyIHByb2JsZW0uCisgICAgeyBzZWQgLWUgInMsXi4qXC5bJGxvd2VyXSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiCisgICAgICBzZWQgLWUgInMsXi4qXC5bJGxvd2VyXSo6WyR0YWIgXSosLCIgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiCisgICAgfSA+ICIkZGVwZmlsZSIKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIGVsc2UKKyAgICBtYWtlX2R1bW15X2RlcGZpbGUKKyAgZmkKK30KKworIyBBIHRhYnVsYXRpb24gY2hhcmFjdGVyLgordGFiPScJJworIyBBIG5ld2xpbmUgY2hhcmFjdGVyLgorbmw9JworJworIyBDaGFyYWN0ZXIgcmFuZ2VzIG1pZ2h0IGJlIHByb2JsZW1hdGljIG91dHNpZGUgdGhlIEMgbG9jYWxlLgorIyBUaGVzZSBkZWZpbml0aW9ucyBoZWxwLgordXBwZXI9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoKK2xvd2VyPWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitkaWdpdHM9MDEyMzQ1Njc4OQorYWxwaGE9JHt1cHBlcn0ke2xvd2VyfQorCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBBdm9pZCBpbnRlcmZlcmVuY2VzIGZyb20gdGhlIGVudmlyb25tZW50LgorZ2NjZmxhZz0gZGFzaG1mbGFnPQorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgIGRhc2htZmxhZz0teE0KKyAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgorICAjIFRoaXMgaXMganVzdCBsaWtlIG1zdmlzdWFsY3BwIGJ1dCB3L28gY3lncGF0aCB0cmFuc2xhdGlvbi4KKyAgIyBKdXN0IGNvbnZlcnQgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGJhY2tzbGFzaGVzIHRvIHNpbmdsZSBmb3J3YXJkCisgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICBjeWdwYXRoX3U9J3NlZCBzLFxcXFwsLyxnJworICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjN21zeXM7IHRoZW4KKyAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3ZjNyBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICMgSnVzdCBjb252ZXJ0IHRoZSBiYWNrc2xhc2gtZXNjYXBlZCBiYWNrc2xhc2hlcyB0byBzaW5nbGUgZm9yd2FyZAorICAjIHNsYXNoZXMgdG8gc2F0aXNmeSBkZXBlbmQubTQKKyAgY3lncGF0aF91PSdzZWQgcyxcXFxcLC8sZycKKyAgZGVwbW9kZT1tc3ZjNworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0geGxjOyB0aGVuCisgICMgSUJNIEMvQysrIENvbXBpbGVycyB4bGMveGxDIGNhbiBvdXRwdXQgZ2NjLWxpa2UgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KKyAgZ2NjZmxhZz0tcW1ha2VkZXA9Z2NjLC1NRgorICBkZXBtb2RlPWdjYworZmkKKworY2FzZSAiJGRlcG1vZGUiIGluCitnY2MzKQorIyMgZ2NjIDMgaW1wbGVtZW50cyBkZXBlbmRlbmN5IHRyYWNraW5nIHRoYXQgZG9lcyBleGFjdGx5IHdoYXQKKyMjIHdlIHdhbnQuICBZYXkhICBOb3RlOiBmb3Igc29tZSByZWFzb24gbGlidG9vbCAxLjQgZG9lc24ndCBsaWtlCisjIyBpdCBpZiAtTUQgLU1QIGNvbWVzIGFmdGVyIHRoZSAtTUYgc3R1ZmYuICBIbW0uCisjIyBVbmZvcnR1bmF0ZWx5LCBGcmVlQlNEIGM4OSBhY2NlcHRhbmNlIG9mIGZsYWdzIGRlcGVuZHMgdXBvbgorIyMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBvcmRlcjsgc28gYWRkIHRoZSBmbGFncyB3aGVyZSB0aGV5CisjIyBhcHBlYXIgaW4gZGVwZW5kMi5hbS4gIE5vdGUgdGhhdCB0aGUgc2xvd2Rvd24gaW5jdXJyZWQgaGVyZQorIyMgYWZmZWN0cyBvbmx5IGNvbmZpZ3VyZTogaW4gbWFrZWZpbGVzLCAlRkFTVERFUCUgc2hvcnRjdXRzIHRoaXMuCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtYykgc2V0IGZub3JkICIkQCIgLU1UICIkb2JqZWN0IiAtTUQgLU1QIC1NRiAiJHRtcGRlcGZpbGUiICIkYXJnIiA7OworICAgICopICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIgOzsKKyAgICBlc2FjCisgICAgc2hpZnQgIyBmbm9yZAorICAgIHNoaWZ0ICMgJGFyZworICBkb25lCisgICIkQCIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1uZSAwOyB0aGVuCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QganVzdCBjYXRlciB0byBvYnNvc2V0ZSBwcmUtMy54IEdDQyBjb21waWxlcnMuCisjIyBidXQgYWxzbyB0byBpbi11c2UgY29tcGlsZXJzIGxpa2UgSU1CIHhsYy94bEMgYW5kIHRoZSBIUCBDIGNvbXBpbGVyLgorIyMgKHNlZSB0aGUgY29uZGl0aW9uYWwgYXNzaWdubWVudCB0byAkZ2NjZmxhZyBhYm92ZSkuCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4gIEFsc28sIGl0IG1pZ2h0IG5vdCBiZQorIyMgICBzdXBwb3J0ZWQgYnkgdGhlIG90aGVyIGNvbXBpbGVycyB3aGljaCB1c2UgdGhlICdnY2MnIGRlcG1vZGUuCisjIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCisjIyAgIHRoYW4gcmVuYW1pbmcpLgorICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KKyAgICBnY2NmbGFnPS1NRCwKKyAgZmkKKyAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtbmUgMDsgdGhlbgorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlCisgICMgbGV0dGVycy4KKyAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCisgICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisjIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSAiZGVsZXRlZCBoZWFkZXIgZmlsZSIgcHJvYmxlbS4KKyMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCisjIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKKyMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCisjIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCisjIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgJzonLiAgT24gdGhlIHRoZW9yeQorIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCisjIyB3ZWxsLiAgaHAgZGVwbW9kZSBhbHNvIGFkZHMgdGhhdCBzcGFjZSwgYnV0IGFsc28gcHJlZml4ZXMgdGhlIFZQQVRICisjIyB0byB0aGUgb2JqZWN0LiAgVGFrZSBjYXJlIHRvIG5vdCByZXBlYXQgaXQgaW4gdGhlIG91dHB1dC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICB0ciAnICcgIiRubCIgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgInN8Liokb2JqZWN0JHx8IiAtZSAnLzokL2QnIFwKKyAgICB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLW5lIDA7IHRoZW4KKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCisgICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlICcjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgIiRubCIgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyBcCisgICAgICB8IHRyICIkbmwiICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCisgICAgIyBUaGUgc2Vjb25kIHBhc3MgZ2VuZXJhdGVzIGEgZHVtbXkgZW50cnkgZm9yIGVhY2ggaGVhZGVyIGZpbGUuCisgICAgdHIgJyAnICIkbmwiIDwgIiR0bXBkZXBmaWxlIiBcCisgICAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgICAgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgbWFrZV9kdW1teV9kZXBmaWxlCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworeGxjKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworYWl4KQorICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCisgICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCisgICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgJyRvYmplY3Q6JyBhdCB0aGUKKyAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCisgIHNldF9kaXJfZnJvbSAiJG9iamVjdCIKKyAgc2V0X2Jhc2VfZnJvbSAiJG9iamVjdCIKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMj0kYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLnUKKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS51CisgICAgIiRAIiAtTQorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLW5lIDA7IHRoZW4KKyAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKworICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgorICBkbworICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICBkb25lCisgIGFpeF9wb3N0X3Byb2Nlc3NfZGVwZmlsZQorICA7OworCit0Y2MpCisgICMgdGNjIChUaW55IEMgQ29tcGlsZXIpIHVuZGVyc3RhbmQgJy1NRCAtTUYgZmlsZScgc2luY2UgdmVyc2lvbiAwLjkuMjYKKyAgIyBGSVhNRTogVGhhdCB2ZXJzaW9uIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGF0IHRoZSBtb21lbnQgb2Ygd3JpdGluZy4KKyAgIyAgICAgICAgTWFrZSB0aGF0IHRoaXMgc3RhdGVtZW50IHJlbWFpbnMgdHJ1ZSBhbHNvIGZvciBzdGFibGUsIHJlbGVhc2VkCisgICMgICAgICAgIHZlcnNpb25zLgorICAjIEl0IHdpbGwgd3JhcCBsaW5lcyAoZG9lc24ndCBtYXR0ZXIgd2hldGhlciBsb25nIG9yIHNob3J0KSB3aXRoIGEKKyAgIyB0cmFpbGluZyAnXCcsIGFzIGluOgorICAjCisgICMgICBmb28ubyA6IFwKKyAgIyAgICBmb28uYyBcCisgICMgICAgZm9vLmggXAorICAjCisgICMgSXQgd2lsbCBwdXQgYSB0cmFpbGluZyAnXCcgZXZlbiBvbiB0aGUgbGFzdCBsaW5lLCBhbmQgd2lsbCB1c2UgbGVhZGluZworICAjIHNwYWNlcyByYXRoZXIgdGhhbiBsZWFkaW5nIHRhYnMgKGF0IGxlYXN0IHNpbmNlIGl0cyBjb21taXQgMDM5NGNhZjcKKyAgIyAiRW1pdCBzcGFjZXMgZm9yIC1NRCIpLgorICAiJEAiIC1NRCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLW5lIDA7IHRoZW4KKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBub24tZW1wdHkgbGluZSBpcyBvZiB0aGUgZm9ybSAnZm9vLm8gOiBcJyBvciAnIGRlcC5oIFwnLgorICAjIFdlIGhhdmUgdG8gY2hhbmdlIGxpbmVzIG9mIHRoZSBmaXJzdCBraW5kIHRvICckb2JqZWN0OiBcJy4KKyAgc2VkIC1lICJzfC4qOnwkb2JqZWN0IDp8IiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICMgQW5kIGZvciBlYWNoIGxpbmUgb2YgdGhlIHNlY29uZCBraW5kLCB3ZSBoYXZlIHRvIGVtaXQgYSAnZGVwLmg6JworICAjIGR1bW15IGRlcGVuZGVuY3ksIHRvIGF2b2lkIHRoZSBkZWxldGVkLWhlYWRlciBwcm9ibGVtLgorICBzZWQgLW4gLWUgJ3N8XiAgKlwoLipcKSAqXFwkfFwxOnxwJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKKyMjIFRoZSBvcmRlciBvZiB0aGlzIG9wdGlvbiBpbiB0aGUgY2FzZSBzdGF0ZW1lbnQgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGUKKyMjIHNoZWxsIGNvZGUgaW4gY29uZmlndXJlIHdpbGwgdHJ5IGVhY2ggb2YgdGhlc2UgZm9ybWF0cyBpbiB0aGUgb3JkZXIKKyMjIGxpc3RlZCBpbiB0aGlzIGZpbGUuICBBIHBsYWluICctTUQnIG9wdGlvbiB3b3VsZCBiZSB1bmRlcnN0b29kIGJ5IG1hbnkKKyMjIGNvbXBpbGVycywgc28gd2UgbXVzdCBlbnN1cmUgdGhpcyBjb21lcyBhZnRlciB0aGUgZ2NjIGFuZCBpY2Mgb3B0aW9ucy4KK3BnY2MpCisgICMgUG9ydGxhbmQncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzICctTUQnLgorICAjIFdpbGwgYWx3YXlzIG91dHB1dCBkZXBzIHRvICdmaWxlLmQnIHdoZXJlIGZpbGUgaXMgdGhlIHJvb3QgbmFtZSBvZiB0aGUKKyAgIyBzb3VyY2UgZmlsZSB1bmRlciBjb21waWxhdGlvbiwgZXZlbiBpZiBmaWxlIHJlc2lkZXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICMgVGhlIG9iamVjdCBmaWxlIG5hbWUgZG9lcyBub3QgYWZmZWN0IHRoZSBuYW1lIG9mIHRoZSAnLmQnIGZpbGUuCisgICMgcGdjYyAxMC4yIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgJ1wnIDoKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jIC4uLiBcCisgICMgICAgIHN1Yi9mb28uaCAuLi4gXAorICAjICAgICAuLi4KKyAgc2V0X2Rpcl9mcm9tICIkb2JqZWN0IgorICAjIFVzZSB0aGUgc291cmNlLCBub3QgdGhlIG9iamVjdCwgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIG5hbWUsIHNpbmNlCisgICMgdGhhdCdzIHNhZGx5IHdoYXQgcGdjYyB3aWxsIGRvIHRvby4KKyAgc2V0X2Jhc2VfZnJvbSAiJHNvdXJjZSIKKyAgdG1wZGVwZmlsZT0kYmFzZS5kCisKKyAgIyBGb3IgcHJvamVjdHMgdGhhdCBidWlsZCB0aGUgc2FtZSBzb3VyY2UgZmlsZSB0d2ljZSBpbnRvIGRpZmZlcmVudCBvYmplY3QKKyAgIyBmaWxlcywgdGhlIHBnY2MgYXBwcm9hY2ggb2YgdXNpbmcgdGhlICpzb3VyY2UqIGZpbGUgcm9vdCBuYW1lIGNhbiBjYXVzZQorICAjIHByb2JsZW1zIGluIHBhcmFsbGVsIGJ1aWxkcy4gIFVzZSBhIGxvY2tpbmcgc3RyYXRlZ3kgdG8gYXZvaWQgc3RvbXBpbmcgb24KKyAgIyB0aGUgc2FtZSAkdG1wZGVwZmlsZS4KKyAgbG9ja2Rpcj0kYmFzZS5kLWxvY2sKKyAgdHJhcCAiCisgICAgZWNobyAnJDA6IGNhdWdodCBzaWduYWwsIGNsZWFuaW5nIHVwLi4uJyA+JjIKKyAgICBybWRpciAnJGxvY2tkaXInCisgICAgZXhpdCAxCisgICIgMSAyIDEzIDE1CisgIG51bXRyaWVzPTEwMAorICBpPSRudW10cmllcworICB3aGlsZSB0ZXN0ICRpIC1ndCAwOyBkbworICAgICMgbWtkaXIgaXMgYSBwb3J0YWJsZSB0ZXN0LWFuZC1zZXQuCisgICAgaWYgbWtkaXIgIiRsb2NrZGlyIiAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIyBUaGlzIHByb2Nlc3MgYWNxdWlyZWQgdGhlIGxvY2suCisgICAgICAiJEAiIC1NRAorICAgICAgc3RhdD0kPworICAgICAgIyBSZWxlYXNlIHRoZSBsb2NrLgorICAgICAgcm1kaXIgIiRsb2NrZGlyIgorICAgICAgYnJlYWsKKyAgICBlbHNlCisgICAgICAjIElmIHRoZSBsb2NrIGlzIGJlaW5nIGhlbGQgYnkgYSBkaWZmZXJlbnQgcHJvY2Vzcywgd2FpdAorICAgICAgIyB1bnRpbCB0aGUgd2lubmluZyBwcm9jZXNzIGlzIGRvbmUgb3Igd2UgdGltZW91dC4KKyAgICAgIHdoaWxlIHRlc3QgLWQgIiRsb2NrZGlyIiAmJiB0ZXN0ICRpIC1ndCAwOyBkbworICAgICAgICBzbGVlcCAxCisgICAgICAgIGk9YGV4cHIgJGkgLSAxYAorICAgICAgZG9uZQorICAgIGZpCisgICAgaT1gZXhwciAkaSAtIDFgCisgIGRvbmUKKyAgdHJhcCAtIDEgMiAxMyAxNQorICBpZiB0ZXN0ICRpIC1sZSAwOyB0aGVuCisgICAgZWNobyAiJDA6IGZhaWxlZCB0byBhY3F1aXJlIGxvY2sgYWZ0ZXIgJG51bXRyaWVzIGF0dGVtcHRzIiA+JjIKKyAgICBlY2hvICIkMDogY2hlY2sgbG9ja2RpciAnJGxvY2tkaXInIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKworICBpZiB0ZXN0ICRzdGF0IC1uZSAwOyB0aGVuCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJywKKyAgIyBvciBgZm9vLm86IGRlcDEuaCBkZXAyLmggXCcsIG9yIGAgZGVwMy5oIGRlcDQuaCBcJy4KKyAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICBzZWQgInMsXlteOl0qOiwkb2JqZWN0IDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyAgIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICBzZWQgJ3MsXlteOl0qOiBcKC4qXCkkLFwxLDtzL15cXCQvLzsvXiQvZDsvOiQvZCcgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgc2V0X2Rpcl9mcm9tICAiJG9iamVjdCIKKyAgc2V0X2Jhc2VfZnJvbSAiJG9iamVjdCIKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtbmUgMDsgdGhlbgorICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgorICAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICBzZWQgLWUgInMsXi4qXC5bJGxvd2VyXSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIEFkZCAnZGVwZW5kZW50Lmg6JyBsaW5lcy4KKyAgICBzZWQgLW5lICcyLCR7CisgICAgICAgICAgICAgICBzL14gKi8vCisgICAgICAgICAgICAgICBzLyBcXCokLy8KKyAgICAgICAgICAgICAgIHMvJC86LworICAgICAgICAgICAgICAgcAorICAgICAgICAgICAgIH0nICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgbWFrZV9kdW1teV9kZXBmaWxlCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKKyAgOzsKKwordHJ1NjQpCisgICMgVGhlIFRydTY0IGNvbXBpbGVyIHVzZXMgLU1EIHRvIGdlbmVyYXRlIGRlcGVuZGVuY2llcyBhcyBhIHNpZGUKKyAgIyBlZmZlY3QuICAnY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gJ2Zvby5vLmQnLgorICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICMgZGVwZW5kZW5jaWVzIGluICdmb28uZCcgaW5zdGVhZCwgc28gd2UgY2hlY2sgZm9yIHRoYXQgdG9vLgorICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgIHNldF9kaXJfZnJvbSAgIiRvYmplY3QiCisgIHNldF9iYXNlX2Zyb20gIiRvYmplY3QiCisKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIyBMaWJ0b29sIGdlbmVyYXRlcyAyIHNlcGFyYXRlIG9iamVjdHMgZm9yIHRoZSAyIGxpYnJhcmllcy4gIFRoZXNlCisgICAgIyB0d28gY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKKyAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgIyBvbmUgb2YgdGhlIHR3byBjb21waWxhdGlvbnMgY2FuIGJlIGRpc2FibGVkLiAgV2Ugc2hvdWxkIHByZWZlcgorICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCisgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAjIHRoZSBmb3JtZXIgd291bGQgY2F1c2UgYSBkaXN0Y2xlYW5jaGVjayBwYW5pYy4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2Uuby5kICAgICMgTGlrZXdpc2UuCisgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAiJEAiIC1XYywtTUQKKyAgZWxzZQorICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5kCisgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UuZAorICAgICIkQCIgLU1ECisgIGZpCisKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1uZSAwOyB0aGVuCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICAjIFNhbWUgcG9zdC1wcm9jZXNzaW5nIHRoYXQgaXMgcmVxdWlyZWQgZm9yIEFJWCBtb2RlLgorICBhaXhfcG9zdF9wcm9jZXNzX2RlcGZpbGUKKyAgOzsKKworbXN2YzcpCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHNob3dJbmNsdWRlcz0tV2MsLXNob3dJbmNsdWRlcworICBlbHNlCisgICAgc2hvd0luY2x1ZGVzPS1zaG93SW5jbHVkZXMKKyAgZmkKKyAgIiRAIiAkc2hvd0luY2x1ZGVzID4gIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGdyZXAgLXYgJ15Ob3RlOiBpbmNsdWRpbmcgZmlsZTogJyAiJHRtcGRlcGZpbGUiCisgIGlmIHRlc3QgJHN0YXQgLW5lIDA7IHRoZW4KKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgICMgVGhlIGZpcnN0IHNlZCBwcm9ncmFtIGJlbG93IGV4dHJhY3RzIHRoZSBmaWxlIG5hbWVzIGFuZCBlc2NhcGVzCisgICMgYmFja3NsYXNoZXMgZm9yIGN5Z3BhdGguICBUaGUgc2Vjb25kIHNlZCBwcm9ncmFtIG91dHB1dHMgdGhlIGZpbGUKKyAgIyBuYW1lIHdoZW4gcmVhZGluZywgYnV0IGFsc28gYWNjdW11bGF0ZXMgYWxsIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisgICMgaG9sZCBidWZmZXIgaW4gb3JkZXIgdG8gb3V0cHV0IHRoZW0gYWdhaW4gYXQgdGhlIGVuZC4gIFRoaXMgb25seQorICAjIHdvcmtzIHdpdGggc2VkIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBoYW5kbGUgbGFyZ2UgYnVmZmVycy4KKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAnCisvXk5vdGU6IGluY2x1ZGluZyBmaWxlOiAgKlwoLipcKS8geworICBzLy9cMS8KKyAgcy9cXC9cXFxcL2cKKyAgcAorfScgfCAkY3lncGF0aF91IHwgc29ydCAtdSB8IHNlZCAtbiAnCitzLyAvXFwgL2cKK3MvXCguKlwpLyciJHRhYiInXDEgXFwvcAorcy8uXCguKlwpIFxcL1wxOi8KK0gKKyQgeworICBzLy4qLyciJHRhYiInLworICBHCisgIHAKK30nID4+ICIkZGVwZmlsZSIKKyAgZWNobyA+PiAiJGRlcGZpbGUiICMgbWFrZSBzdXJlIHRoZSBmcmFnbWVudCBkb2Vzbid0IGVuZCB3aXRoIGEgYmFja3NsYXNoCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2Yzdtc3lzKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworI25vc2lkZWVmZmVjdCkKKyAgIyBUaGlzIGNvbW1lbnQgYWJvdmUgaXMgdXNlZCBieSBhdXRvbWFrZSB0byB0ZWxsIHNpZGUtZWZmZWN0CisgICMgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc21zIGZyb20gc2xvd2VyIG9uZXMuCisKK2Rhc2htc3Rkb3V0KQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtby4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgJy1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciAnOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzICdjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCAnYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAic3xeWyR0YWIgXSpbXjokdGFiIF1bXjpdW146XSo6WyR0YWIgXSp8JG9iamVjdDogfCIgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgc2VkIGludm9jYXRpb24KKyAgIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICB0ciAnICcgIiRubCIgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyBcCisgICAgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitkYXNoWG1zdGRvdXQpCisgICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCisgIGV4aXQgMQorICA7OworCittYWtlZGVwZW5kKQorICAiJEAiIHx8IGV4aXQgJD8KKyAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgc2hpZnQKKyAgY2xlYXJlZD1ubyBlYXQ9bm8KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGNsZWFyZWQgaW4KKyAgICBubykKKyAgICAgIHNldCAiIjsgc2hpZnQKKyAgICAgIGNsZWFyZWQ9eWVzIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgJGVhdCA9IHllczsgdGhlbgorICAgICAgZWF0PW5vCisgICAgICBjb250aW51ZQorICAgIGZpCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtRCp8LUkqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgICMgU3RyaXAgYW55IG9wdGlvbiB0aGF0IG1ha2VkZXBlbmQgbWF5IG5vdCB1bmRlcnN0YW5kLiAgUmVtb3ZlCisgICAgIyB0aGUgb2JqZWN0IHRvbywgb3RoZXJ3aXNlIG1ha2VkZXBlbmQgd2lsbCBwYXJzZSBpdCBhcyBhIHNvdXJjZSBmaWxlLgorICAgIC1hcmNoKQorICAgICAgZWF0PXllcyA7OworICAgIC0qfCRvYmplY3QpCisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgZXNhYworICBkb25lCisgIG9ial9zdWZmaXg9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL14uKlwuLy4vJ2AKKyAgdG91Y2ggIiR0bXBkZXBmaWxlIgorICAke01BS0VERVBFTkQtbWFrZWRlcGVuZH0gLW8iJG9ial9zdWZmaXgiIC1mIiR0bXBkZXBmaWxlIiAiJEAiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBtYWtlZGVwZW5kIG1heSBwcmVwZW5kIHRoZSBWUEFUSCBmcm9tIHRoZSBzb3VyY2UgZmlsZSBuYW1lIHRvIHRoZSBvYmplY3QuCisgICMgTm8gbmVlZCB0byByZWdleC1lc2NhcGUgJG9iamVjdCwgZXhjZXNzIG1hdGNoaW5nIG9mICcuJyBpcyBoYXJtbGVzcy4KKyAgc2VkICJzfF4uKlwoJG9iamVjdCAqOlwpfFwxfCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoZSBsYXN0IGludm9jYXRpb24KKyAgIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgXAorICAgIHwgdHIgJyAnICIkbmwiIFwKKyAgICB8IHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyBcCisgICAgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSAnLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAiJEAiIC1FIFwKKyAgICB8IHNlZCAtbiAtZSAnL14jIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyBcCisgICAgICAgICAgICAgLWUgJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICB8IHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorICAgICAgICBzZXQgZm5vcmQgIiRAIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgICopCisgICAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICAiJEAiIC1FIDI+L2Rldi9udWxsIHwKKyAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjpcMTpwJyB8ICRjeWdwYXRoX3UgfCBzb3J0IC11ID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgLW4gLWUgJ3MlICVcXCAlZycgLWUgJy9eXCguKlwpJC8gczo6JyIkdGFiIidcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIiR0YWIiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3ZjbXN5cykKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvYXV0by9pbnN0YWxsLXNoIGIvYXV0by9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3N2JiODYKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvL2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MjcgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDExLTExLTIwLjA3OyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgJ21ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9JHtET0lUUFJPRy19CitpZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KKyAgZG9pdF9leGVjPWV4ZWMKK2Vsc2UKKyAgZG9pdF9leGVjPSRkb2l0CitmaQorCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KKworY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQorCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQorJworCitwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2hncnBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKK3JtY21kPSIkcm1wcm9nIC1mIgorc3RyaXBjbWQ9CisKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQorCitjb3B5X29uX2NoYW5nZT1mYWxzZQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCisgIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSA7OworCisgICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7CisKKyAgICAtdCkgZHN0X2FyZz0kMgorCSMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgJ3Rlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCisJY2FzZSAkZHN0X2FyZyBpbgorCSAgLSogfCBbPVwoXCkhXSkgZHN0X2FyZz0uLyRkc3RfYXJnOzsKKwllc2FjCisJc2hpZnQ7OworCisgICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7CisKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7CisKKyAgICAtLSkJc2hpZnQKKwlicmVhazs7CisKKyAgICAtKikJZWNobyAiJDA6IGludmFsaWQgb3B0aW9uOiAkMSIgPiYyCisJZXhpdCAxOzsKKworICAgICopICBicmVhazs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgorICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKyAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKyAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorICBmb3IgYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCisgICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKyAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBmaQorICAgIHNoaWZ0ICMgYXJnCisgICAgZHN0X2FyZz0kYXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciAndGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KKyAgICBjYXNlICRkc3RfYXJnIGluCisgICAgICAtKiB8IFs9XChcKSFdKSBkc3RfYXJnPS4vJGRzdF9hcmc7OworICAgIGVzYWMKKyAgZG9uZQorZmkKKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgIyBJdCdzIE9LIHRvIGNhbGwgJ2luc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCisgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCisgIGV4aXQgMAorZmkKKworaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgIGRvX2V4aXQ9JyhleGl0ICRyZXQpOyBleGl0ICRyZXQnCisgIHRyYXAgInJldD0xMjk7ICRkb19leGl0IiAxCisgIHRyYXAgInJldD0xMzA7ICRkb19leGl0IiAyCisgIHRyYXAgInJldD0xNDE7ICRkb19leGl0IiAxMworICB0cmFwICJyZXQ9MTQzOyAkZG9fZXhpdCIgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciAndGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KKyAgY2FzZSAkc3JjIGluCisgICAgLSogfCBbPVwoXCkhXSkgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZHN0PSRkc3RfYXJnCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3RfYXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgICAgZHN0ZGlyPSRkc3QKKyAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCisgICAgICBkc3RkaXJfc3RhdHVzPTAKKyAgICBlbHNlCisgICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgorICAgICAgZHN0ZGlyPWAKKwkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8CisJZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorCWVjaG8gWCIkZHN0IiB8CisJICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKVteL10uKi97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKSQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wpLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgcy8uKi8uLzsgcScKKyAgICAgIGAKKworICAgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICAgIGRzdGRpcl9zdGF0dXM9JD8KKyAgICBmaQorICBmaQorCisgIG9ic29sZXRlX21rZGlyX3VzZWQ9ZmFsc2UKKworICBpZiB0ZXN0ICRkc3RkaXJfc3RhdHVzICE9IDA7IHRoZW4KKyAgICBjYXNlICRwb3NpeF9ta2RpciBpbgorICAgICAgJycpCisJIyBDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcnMgdXNpbmcgbW9kZSA3NTUgYXMgbW9kaWZpZWQgYnkgdGhlIHVtYXNrLgorCSMgVGhpcyBpcyBsaWtlIEZyZWVCU0QgJ2luc3RhbGwnIGFzIG9mIDE5OTctMTAtMjguCisJdW1hc2s9YHVtYXNrYAorCWNhc2UgJHN0cmlwY21kLiR1bWFzayBpbgorCSAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisJICAqWzIzNjddWzIzNjddKSBta2Rpcl91bWFzaz0kdW1hc2s7OworCSAgLiowWzAyXVswMl0gfCAuWzAyXVswMl0gfCAuWzAyXSkgbWtkaXJfdW1hc2s9MjI7OworCisJICAqWzAtN10pCisJICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKKwkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAorCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgorCSAgICBgOzsKKwkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKKwllc2FjCisKKwkjIFdpdGggLWQsIGNyZWF0ZSB0aGUgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBtb2RlLgorCSMgT3RoZXJ3aXNlLCByZWx5IG9uICRta2Rpcl91bWFzay4KKwlpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKwkgIG1rZGlyX21vZGU9LW0kbW9kZQorCWVsc2UKKwkgIG1rZGlyX21vZGU9CisJZmkKKworCXBvc2l4X21rZGlyPWZhbHNlCisJY2FzZSAkdW1hc2sgaW4KKwkgICpbMTIzNTY3XVswLTddWzAtN10pCisJICAgICMgUE9TSVggbWtkaXIgLXAgc2V0cyB1K3d4IGJpdHMgcmVnYXJkbGVzcyBvZiB1bWFzaywgd2hpY2gKKwkgICAgIyBpcyBpbmNvbXBhdGlibGUgd2l0aCBGcmVlQlNEICdpbnN0YWxsJyB3aGVuICh1bWFzayAmIDMwMCkgIT0gMC4KKwkgICAgOzsKKwkgICopCisJICAgIHRtcGRpcj0ke1RNUERJUi0vdG1wfS9pbnMkUkFORE9NLSQkCisJICAgIHRyYXAgJ3JldD0kPzsgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiIDI+L2Rldi9udWxsOyBleGl0ICRyZXQnIDAKKworCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCisJICAgIHRoZW4KKwkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgeworCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgorCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgorCQkgICAjIG90aGVyLXdyaXRhYmxlIGJpdCBvZiBwYXJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgc2hvdWxkbid0LgorCQkgICAjIEZyZWVCU0QgNi4xIG1rZGlyIC1tIC1wIHNldHMgbW9kZSBvZiBleGlzdGluZyBkaXJlY3RvcnkuCisJCSAgIGxzX2xkX3RtcGRpcj1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgY2FzZSAkbHNfbGRfdG1wZGlyIGluCisJCSAgICAgZD8/Pz8tP3ItKikgZGlmZmVyZW50X21vZGU9NzAwOzsKKwkJICAgICBkPz8/Py0/LS0qKSBkaWZmZXJlbnRfbW9kZT03NTU7OworCQkgICAgICopIGZhbHNlOzsKKwkJICAgZXNhYyAmJgorCQkgICAkbWtkaXJwcm9nIC1tJGRpZmZlcmVudF9tb2RlIC1wIC0tICIkdG1wZGlyIiAmJiB7CisJCSAgICAgbHNfbGRfdG1wZGlyXzE9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgICAgdGVzdCAiJGxzX2xkX3RtcGRpciIgPSAiJGxzX2xkX3RtcGRpcl8xIgorCQkgICB9CisJCSB9CisJICAgICAgdGhlbiBwb3NpeF9ta2Rpcj06CisJICAgICAgZmkKKwkgICAgICBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIKKwkgICAgZWxzZQorCSAgICAgICMgUmVtb3ZlIGFueSBkaXJzIGxlZnQgYmVoaW5kIGJ5IGFuY2llbnQgbWtkaXIgaW1wbGVtZW50YXRpb25zLgorCSAgICAgIHJtZGlyIC4vJG1rZGlyX21vZGUgLi8tcCAuLy0tIDI+L2Rldi9udWxsCisJICAgIGZpCisJICAgIHRyYXAgJycgMDs7CisJZXNhYzs7CisgICAgZXNhYworCisgICAgaWYKKyAgICAgICRwb3NpeF9ta2RpciAmJiAoCisJdW1hc2sgJG1rZGlyX3VtYXNrICYmCisJJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIgorICAgICAgKQorICAgIHRoZW4gOgorICAgIGVsc2UKKworICAgICAgIyBUaGUgdW1hc2sgaXMgcmlkaWN1bG91cywgb3IgbWtkaXIgZG9lcyBub3QgY29uZm9ybSB0byBQT1NJWCwKKyAgICAgICMgb3IgaXQgZmFpbGVkIHBvc3NpYmx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uLiAgQ3JlYXRlIHRoZQorICAgICAgIyBkaXJlY3RvcnkgdGhlIHNsb3cgd2F5LCBzdGVwIGJ5IHN0ZXAsIGNoZWNraW5nIGZvciByYWNlcyBhcyB3ZSBnby4KKworICAgICAgY2FzZSAkZHN0ZGlyIGluCisJLyopIHByZWZpeD0nLyc7OworCVstPVwoXCkhXSopIHByZWZpeD0nLi8nOzsKKwkqKSAgcHJlZml4PScnOzsKKyAgICAgIGVzYWMKKworICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKKworICAgICAgb0lGUz0kSUZTCisgICAgICBJRlM9LworICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCisgICAgICBzZXQgZm5vcmQgJGRzdGRpcgorICAgICAgc2hpZnQKKyAgICAgICRwb3NpeF9nbG9iIHNldCArZgorICAgICAgSUZTPSRvSUZTCisKKyAgICAgIHByZWZpeGVzPQorCisgICAgICBmb3IgZAorICAgICAgZG8KKwl0ZXN0IFgiJGQiID0gWCAmJiBjb250aW51ZQorCisJcHJlZml4PSRwcmVmaXgkZAorCWlmIHRlc3QgLWQgIiRwcmVmaXgiOyB0aGVuCisJICBwcmVmaXhlcz0KKwllbHNlCisJICBpZiAkcG9zaXhfbWtkaXI7IHRoZW4KKwkgICAgKHVtYXNrPSRta2Rpcl91bWFzayAmJgorCSAgICAgJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIikgJiYgYnJlYWsKKwkgICAgIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSAgICB0ZXN0IC1kICIkcHJlZml4IiB8fCBleGl0IDEKKwkgIGVsc2UKKwkgICAgY2FzZSAkcHJlZml4IGluCisJICAgICAgKlwnKikgcXByZWZpeD1gZWNobyAiJHByZWZpeCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworCSAgICAgICopIHFwcmVmaXg9JHByZWZpeDs7CisJICAgIGVzYWMKKwkgICAgcHJlZml4ZXM9IiRwcmVmaXhlcyAnJHFwcmVmaXgnIgorCSAgZmkKKwlmaQorCXByZWZpeD0kcHJlZml4LworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0IC1uICIkcHJlZml4ZXMiOyB0aGVuCisJIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSh1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkgZXZhbCAiXCRkb2l0X2V4ZWMgXCRta2RpcnByb2cgJHByZWZpeGVzIikgfHwKKwkgIHRlc3QgLWQgIiRkc3RkaXIiIHx8IGV4aXQgMQorCW9ic29sZXRlX21rZGlyX3VzZWQ9dHJ1ZQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdCI7IH0gJiYKKyAgICB7IHRlc3QgIiRvYnNvbGV0ZV9ta2Rpcl91c2VkJGNob3duY21kJGNoZ3JwY21kIiA9IGZhbHNlIHx8CisgICAgICB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdCI7IH0gfHwgZXhpdCAxCisgIGVsc2UKKworICAgICMgTWFrZSBhIGNvdXBsZSBvZiB0ZW1wIGZpbGUgbmFtZXMgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisgICAgZHN0dG1wPSRkc3RkaXIvX2luc3QuJCRfCisgICAgcm10bXA9JGRzdGRpci9fcm0uJCRfCisKKyAgICAjIFRyYXAgdG8gY2xlYW4gdXAgdGhvc2UgdGVtcCBmaWxlcyBhdCBleGl0LgorICAgIHRyYXAgJ3JldD0kPzsgcm0gLWYgIiRkc3R0bXAiICIkcm10bXAiICYmIGV4aXQgJHJldCcgMAorCisgICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KKyAgICAodW1hc2sgJGNwX3VtYXNrICYmICRkb2l0X2V4ZWMgJGNwcHJvZyAiJHNyYyIgIiRkc3R0bXAiKSAmJgorCisgICAgIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzLgorICAgICMKKyAgICAjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCisgICAgIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisgICAgIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorICAgICMKKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0dG1wIjsgfSAmJgorCisgICAgIyBJZiAtQywgZG9uJ3QgYm90aGVyIHRvIGNvcHkgaWYgaXQgd291bGRuJ3QgY2hhbmdlIHRoZSBmaWxlLgorICAgIGlmICRjb3B5X29uX2NoYW5nZSAmJgorICAgICAgIG9sZD1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdCIJMj4vZGV2L251bGxgICYmCisgICAgICAgbmV3PWBMQ19BTEw9QyBscyAtZGxMICIkZHN0dG1wIgkyPi9kZXYvbnVsbGAgJiYKKworICAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiICYmCisgICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mICYmCisgICAgICAgc2V0IFggJG9sZCAmJiBvbGQ9OiQyOiQ0OiQ1OiQ2ICYmCisgICAgICAgc2V0IFggJG5ldyAmJiBuZXc9OiQyOiQ0OiQ1OiQ2ICYmCisgICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmICYmCisKKyAgICAgICB0ZXN0ICIkb2xkIiA9ICIkbmV3IiAmJgorICAgICAgICRjbXBwcm9nICIkZHN0IiAiJGRzdHRtcCIgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorICAgICAgcm0gLWYgIiRkc3R0bXAiCisgICAgZWxzZQorICAgICAgIyBSZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgICAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0IiAyPi9kZXYvbnVsbCB8fAorCisgICAgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisgICAgICAjIHRvIGl0c2VsZiwgb3IgcGVyaGFwcyBiZWNhdXNlIG12IGlzIHNvIGFuY2llbnQgdGhhdCBpdCBkb2VzIG5vdAorICAgICAgIyBzdXBwb3J0IC1mLgorICAgICAgeworCSMgTm93IHJlbW92ZSBvciBtb3ZlIGFzaWRlIGFueSBvbGQgZmlsZSBhdCBkZXN0aW5hdGlvbiBsb2NhdGlvbi4KKwkjIFdlIHRyeSB0aGlzIHR3byB3YXlzIHNpbmNlIHJtIGNhbid0IHVubGluayBpdHNlbGYgb24gc29tZQorCSMgc3lzdGVtcyBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbWlnaHQgYmUgYnVzeSBmb3Igb3RoZXIKKwkjIHJlYXNvbnMuICBJbiB0aGlzIGNhc2UsIHRoZSBmaW5hbCBjbGVhbnVwIG1pZ2h0IGZhaWwgYnV0IHRoZSBuZXcKKwkjIGZpbGUgc2hvdWxkIHN0aWxsIGluc3RhbGwgc3VjY2Vzc2Z1bGx5LgorCXsKKwkgIHRlc3QgISAtZiAiJGRzdCIgfHwKKwkgICRkb2l0ICRybWNtZCAtZiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKwkgIHsgJGRvaXQgJG12Y21kIC1mICIkZHN0IiAiJHJtdG1wIiAyPi9kZXYvbnVsbCAmJgorCSAgICB7ICRkb2l0ICRybWNtZCAtZiAiJHJtdG1wIiAyPi9kZXYvbnVsbDsgOjsgfQorCSAgfSB8fAorCSAgeyBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdCIgPiYyCisJICAgIChleGl0IDEpOyBleGl0IDEKKwkgIH0KKwl9ICYmCisKKwkjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisJJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdCIKKyAgICAgIH0KKyAgICBmaSB8fCBleGl0IDEKKworICAgIHRyYXAgJycgMAorICBmaQorZG9uZQorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9hdXRvL2x0bWFpbi5zaCBiL2F1dG8vbHRtYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZmRhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvL2x0bWFpbi5zaApAQCAtMCwwICsxLDk2NjEgQEAKKworIyBsaWJ0b29sIChHTlUgbGlidG9vbCkgMi40LjIKKyMgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCisjIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsCisjIG9yIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisjCisjIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIworIyAgICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworIyAgICAgICAtLWRlYnVnICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCisjICAgLW4sIC0tZHJ5LXJ1biAgICAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCisjICAgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorIyAgICAgICAtLW1vZGU9TU9ERSAgICAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERQorIyAgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzICBkb24ndCByZW1vdmUgZHVwbGljYXRlIGRlcGVuZGVuY3kgbGlicmFyaWVzCisjICAgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyMgICAgICAgLS1uby1xdWlldCwgLS1uby1zaWxlbnQKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAoZGVmYXVsdCkKKyMgICAgICAgLS1uby13YXJuICAgICAgICAgICAgZG9uJ3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzCisjICAgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyMgICAtdiwgLS12ZXJib3NlICAgICAgICAgICAgcHJpbnQgbW9yZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYW4gZGVmYXVsdAorIyAgICAgICAtLW5vLXZlcmJvc2UgICAgICAgICBkb24ndCBwcmludCB0aGUgZXh0cmEgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisjICAgLWgsIC0taGVscCwgLS1oZWxwLWFsbCAgIHByaW50IHNob3J0LCBsb25nLCBvciBkZXRhaWxlZCBoZWxwIG1lc3NhZ2UKKyMKKyMgTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorIworIyAgICAgICAgIGNsZWFuICAgICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5CisjICAgICAgICAgY29tcGlsZSAgICAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyMgICAgICAgICBleGVjdXRlICAgICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyMgICAgICAgICBmaW5pc2ggICAgICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcworIyAgICAgICAgIGluc3RhbGwgICAgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworIyAgICAgICAgIGxpbmsgICAgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyMgICAgICAgICB1bmluc3RhbGwgICAgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKKyMKKyMgTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgV2hlbiBwYXNzZWQgYXMgZmlyc3Qgb3B0aW9uLAorIyBgLS1tb2RlPU1PREUnIG1heSBiZSBhYmJyZXZpYXRlZCBhcyBgTU9ERScgb3IgYSB1bmlxdWUgYWJicmV2aWF0aW9uIG9mIHRoYXQuCisjIFRyeSBgJHByb2duYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgorIworIyBXaGVuIHJlcG9ydGluZyBhIGJ1ZywgcGxlYXNlIGRlc2NyaWJlIGEgdGVzdCBjYXNlIHRvIHJlcHJvZHVjZSBpdCBhbmQKKyMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorIworIyAgICAgICAgIGhvc3QtdHJpcGxldDoJJGhvc3QKKyMgICAgICAgICBzaGVsbDoJCSRTSEVMTAorIyAgICAgICAgIGNvbXBpbGVyOgkJJExUQ0MKKyMgICAgICAgICBjb21waWxlciBmbGFnczoJCSRMVENGTEFHUworIyAgICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCisjICAgICAgICAgJHByb2duYW1lOgkoR05VIGxpYnRvb2wpIDIuNC4yIERlYmlhbi0yLjQuMi0xLjExCisjICAgICAgICAgYXV0b21ha2U6CSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgICAgYXV0b2NvbmY6CSRhdXRvY29uZl92ZXJzaW9uCisjCisjIFJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4KKyMgR05VIGxpYnRvb2wgaG9tZSBwYWdlOiA8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvPi4KKyMgR2VuZXJhbCBoZWxwIHVzaW5nIEdOVSBzb2Z0d2FyZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9nZXRoZWxwLz4uCisKK1BST0dSQU09bGlidG9vbAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPSIyLjQuMiBEZWJpYW4tMi40LjItMS4xMSIKK1RJTUVTVEFNUD0iIgorcGFja2FnZV9yZXZpc2lvbj0xLjMzMzcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCit9CisKKyMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitsdF91c2VyX2xvY2FsZT0KK2x0X3NhZmVfbG9jYWxlPQorZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCitkbworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKK2RvbmUKK0xDX0FMTD1DCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UgTENfQUxMCisKKyRsdF91bnNldCBDRFBBVEgKKworCisjIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKKyMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCisjIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAorIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCisjIGZ1bmN0aW9uLgorcHJvZ3BhdGg9IiQwIgorCisKKworOiAke0NQPSJjcCAtZiJ9Cit0ZXN0ICIke0VDSE8rc2V0fSIgPSBzZXQgfHwgRUNITz0ke2FzX2VjaG8tJ3ByaW50ZiAlc1xuJ30KKzogJHtNQUtFPSJtYWtlIn0KKzogJHtNS0RJUj0ibWtkaXIifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKzogJHtTSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0ifQorOiAke1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyJ9CisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorRVhJVF9NSVNNQVRDSD02MyAgIyAkPyA9IDYzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmVyc2lvbiBtaXNtYXRjaCB0byBtaXNzaW5nLgorRVhJVF9TS0lQPTc3CSAgIyAkPyA9IDc3IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBza2lwcGVkIHRlc3QgdG8gYXV0b21ha2UuCisKK2V4aXRfc3RhdHVzPSRFWElUX1NVQ0NFU1MKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKK2x0X25sPScKKycKK0lGUz0iIAkkbHRfbmwiCisKK2Rpcm5hbWU9InMsL1teL10qJCwsIgorYmFzZW5hbWU9InMsXi4qLywsIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorfSAjIGZ1bmNfZGlybmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfYmFzZW5hbWUgZmlsZQorZnVuY19iYXNlbmFtZSAoKQoreworICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCitmdW5jX3N0cmlwbmFtZSAoKQoreworICAgIGNhc2UgJHsyfSBpbgorICAgICAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBUaGVzZSBTRUQgc2NyaXB0cyBwcmVzdXBwb3NlIGFuIGFic29sdXRlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgorcGF0aGNhcj0ncyxeL1woW14vXSpcKS4qJCxcMSwnCitwYXRoY2RyPSdzLF4vW14vXSosLCcKK3JlbW92ZWRvdHBhcnRzPSc6ZG90c2wKKwkJc0AvXC4vQC9AZworCQl0IGRvdHNsCisJCXMsL1wuJCwvLCcKK2NvbGxhcHNlc2xhc2hlcz0nc0AvXHsxLFx9QC9AZycKK2ZpbmFsc2xhc2g9J3MsLyokLC8sJworCisjIGZ1bmNfbm9ybWFsX2Fic3BhdGggUEFUSAorIyBSZW1vdmUgZG91YmxlZC11cCBhbmQgdHJhaWxpbmcgc2xhc2hlcywgIi4iIHBhdGggY29tcG9uZW50cywKKyMgYW5kIGNhbmNlbCBvdXQgYW55ICIuLiIgcGF0aCBjb21wb25lbnRzIGluIFBBVEggYWZ0ZXIgbWFraW5nCisjIGl0IGFuIGFic29sdXRlIHBhdGguCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCitmdW5jX25vcm1hbF9hYnNwYXRoICgpCit7CisgICMgU3RhcnQgZnJvbSByb290IGRpciBhbmQgcmVhc3NlbWJsZSB0aGUgcGF0aC4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9JDEKKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9CisgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGggaW4KKyAgICAiIikKKyAgICAgICMgRW1wdHkgcGF0aCwgdGhhdCBqdXN0IG1lYW5zICRjd2QuCisgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgImBwd2RgIgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgcmV0dXJuCisgICAgOzsKKyAgICAjIFRoZSBuZXh0IHRocmVlIGVudHJpZXMgYXJlIHVzZWQgdG8gc3BvdCBhIHJ1biBvZiBwcmVjaXNlbHkKKyAgICAjIHR3byBsZWFkaW5nIHNsYXNoZXMgd2l0aG91dCB1c2luZyBuZWdhdGVkIGNoYXJhY3RlciBjbGFzc2VzOworICAgICMgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgY2FzZSdzIGZpcnN0LW1hdGNoIGJlaGF2aW91ci4KKyAgICAvLy8qKQorICAgICAgIyBVbnVzdWFsIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KKyAgICA7OworICAgIC8vKikKKyAgICAgICMgTm90IG5lY2Vzc2FyaWx5IGFuIG9yZGluYXJ5IHBhdGg7IFBPU0lYIHJlc2VydmVzIGxlYWRpbmcgJy8vJworICAgICAgIyBhbmQgZm9yIGV4YW1wbGUgQ3lnd2luIHVzZXMgaXQgdG8gYWNjZXNzIHJlbW90ZSBmaWxlIHNoYXJlcworICAgICAgIyBvdmVyIENJRlMvU01CLCBzbyB3ZSBjb25zZXJ2ZSBhIGxlYWRpbmcgZG91YmxlIHNsYXNoIGlmIGZvdW5kLgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9LworICAgIDs7CisgICAgLyopCisgICAgICAjIEFic29sdXRlIHBhdGgsIGRvIG5vdGhpbmcuCisgICAgOzsKKyAgICAqKQorICAgICAgIyBSZWxhdGl2ZSBwYXRoLCBwcmVwZW5kICRjd2QuCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWBwd2RgLyRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoCisgICAgOzsKKyAgZXNhYworICAjIENhbmNlbCBvdXQgYWxsIHRoZSBzaW1wbGUgc3R1ZmYgdG8gc2F2ZSBpdGVyYXRpb25zLiAgV2UgYWxzbyB3YW50CisgICMgdGhlIHBhdGggdG8gZW5kIHdpdGggYSBzbGFzaCBmb3IgZWFzZSBvZiBwYXJzaW5nLCBzbyBtYWtlIHN1cmUKKyAgIyB0aGVyZSBpcyBvbmUgKGFuZCBvbmx5IG9uZSkgaGVyZS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHJlbW92ZWRvdHBhcnRzIiAtZSAiJGNvbGxhcHNlc2xhc2hlcyIgLWUgIiRmaW5hbHNsYXNoImAKKyAgd2hpbGUgOjsgZG8KKyAgICAjIFByb2Nlc3NlZCBpdCBhbGwgeWV0PworICAgIGlmIHRlc3QgIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiA9IC8gOyB0aGVuCisgICAgICAjIElmIHdlIGFzY2VuZGVkIHRvIHRoZSByb290IHVzaW5nICIuLiIgdGhlIHJlc3VsdCBtYXkgYmUgZW1wdHkgbm93LgorICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9LworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQ9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRwYXRoY2FyImAKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcGF0aGNkciJgCisgICAgIyBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBpdAorICAgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudCBpbgorICAgICAgIiIpCisgICAgICAgICMgVHJhaWxpbmcgZW1wdHkgcGF0aCBjb21wb25lbnQsIGlnbm9yZSBpdC4KKyAgICAgIDs7CisgICAgICAuLikKKyAgICAgICAgIyBQYXJlbnQgZGlyOyBzdHJpcCBsYXN0IGFzc2VtYmxlZCBjb21wb25lbnQgZnJvbSByZXN1bHQuCisgICAgICAgIGZ1bmNfZGlybmFtZSAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICAgOzsKKyAgICAgICopCisgICAgICAgICMgQWN0dWFsIHBhdGggY29tcG9uZW50LCBhcHBlbmQgaXQuCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdC8kZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50CisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICAjIFJlc3RvcmUgbGVhZGluZyBkb3VibGUtc2xhc2ggaWYgb25lIHdhcyBmb3VuZCBvbiBlbnRyeS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0Cit9CisKKyMgZnVuY19yZWxhdGl2ZV9wYXRoIFNSQ0RJUiBEU1RESVIKKyMgZ2VuZXJhdGVzIGEgcmVsYXRpdmUgcGF0aCBmcm9tIFNSQ0RJUiB0byBEU1RESVIsIHdpdGggYSB0cmFpbGluZworIyBzbGFzaCBpZiBub24tZW1wdHksIHN1aXRhYmxlIGZvciBpbW1lZGlhdGVseSBhcHBlbmRpbmcgYSBmaWxlbmFtZQorIyB3aXRob3V0IG5lZWRpbmcgdG8gYXBwZW5kIGEgc2VwYXJhdG9yLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCitmdW5jX3JlbGF0aXZlX3BhdGggKCkKK3sKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0KKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDEiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorICBmdW5jX25vcm1hbF9hYnNwYXRoICIkMiIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXI9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0CisKKyAgIyBBc2NlbmQgdGhlIHRyZWUgc3RhcnRpbmcgZnJvbSBsaWJkaXIKKyAgd2hpbGUgOjsgZG8KKyAgICAjIGNoZWNrIGlmIHdlIGhhdmUgZm91bmQgYSBwcmVmaXggb2YgYmluZGlyCisgICAgY2FzZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIgaW4KKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcikKKyAgICAgICAgIyBmb3VuZCBhbiBleGFjdCBtYXRjaAorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0KKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciopCisgICAgICAgICMgZm91bmQgYSBtYXRjaGluZyBwcmVmaXgKKyAgICAgICAgZnVuY19zdHJpcG5hbWUgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciIgJycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4KKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZGlybmFtZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXI9JHtmdW5jX2Rpcm5hbWVfcmVzdWx0fQorICAgICAgICBpZiB0ZXN0ICJ4JGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiA9IHggOyB0aGVuCisgICAgICAgICAgIyBIYXZlIHRvIGRlc2NlbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QhCisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPSRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpcgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9Li4vJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQKKyAgICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIE5vdyBjYWxjdWxhdGUgcGF0aDsgdGFrZSBjYXJlIHRvIGF2b2lkIGRvdWJsaW5nLXVwIHNsYXNoZXMuCisgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmdW5jX3N0cmlwbmFtZSAnLycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQiCisgIGlmIHRlc3QgIngkZnVuY19zdHJpcG5hbWVfcmVzdWx0IiAhPSB4IDsgdGhlbgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JHtmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0fS8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0KKyAgZmkKKworICAjIE5vcm1hbGlzYXRpb24uIElmIGJpbmRpciBpcyBsaWJkaXIsIHJldHVybiBlbXB0eSBzdHJpbmcsCisgICMgZWxzZSByZWxhdGl2ZSBwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2g7IGVpdGhlciB3YXksIHRhcmdldAorICAjIGZpbGUgbmFtZSBjYW4gYmUgZGlyZWN0bHkgYXBwZW5kZWQuCisgIGlmIHRlc3QgISAteiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiOyB0aGVuCisgICAgZnVuY19zdHJpcG5hbWUgJy4vJyAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQvIgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmaQorfQorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKK3Byb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCisjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIHJlZXhlY3V0aW9uOgorY2FzZSAkcHJvZ3BhdGggaW4KKyAgW1xcL10qfFtBLVphLXpdOlxcKikgOzsKKyAgKltcXC9dKikKKyAgICAgcHJvZ2Rpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICBwcm9nZGlyPWBjZCAiJHByb2dkaXIiICYmIHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKKyAgKikKKyAgICAgc2F2ZV9JRlM9IiRJRlMiCisgICAgIElGUz0ke1BBVEhfU0VQQVJBVE9SLTp9CisgICAgIGZvciBwcm9nZGlyIGluICRQQVRIOyBkbworICAgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICAgIHRlc3QgLXggIiRwcm9nZGlyLyRwcm9nbmFtZSIgJiYgYnJlYWsKKyAgICAgZG9uZQorICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgdGVzdCAtbiAiJHByb2dkaXIiIHx8IHByb2dkaXI9YHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbYCIkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgdHVybnMgYSBzdHJpbmcgaW50byBhIHJlZ2V4IG1hdGNoaW5nIGZvciB0aGUKKyMgc3RyaW5nIGxpdGVyYWxseS4KK3NlZF9tYWtlX2xpdGVyYWxfcmVnZXg9J3MsW10uW14kXFwqXC9dLFxcJixnJworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBjb252ZXJ0cyBhIHczMiBmaWxlIG5hbWUgb3IgcGF0aAorIyB3aGljaCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMsIGludG8gb25lIHRoYXQgY29udGFpbnMKKyMgKGVzY2FwZWQpIGJhY2tzbGFzaGVzLiAgQSB2ZXJ5IG5haXZlIGltcGxlbWVudGF0aW9uLgorbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJworCisjIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQorIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJworIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCisjIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCisjIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KK2JzPSdcXCcKK2JzMj0nXFxcXCcKK2JzND0nXFxcXFxcXFwnCitkb2xsYXI9J1wkJworc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKKyAgcy8kYnM0LyZcXAorL2cKKyAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KKyAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCisgIHMvXG4vL2ciCisKKyMgU3RhbmRhcmQgb3B0aW9uczoKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfaGVscD1mYWxzZQorb3B0X3F1aWV0PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorb3B0X3dhcm5pbmc9OgorCisjIGZ1bmNfZWNobyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCisjIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KK2Z1bmNfZWNobyAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9JCoiCit9CisKKyMgZnVuY192ZXJib3NlIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIGluIHZlcmJvc2UgbW9kZSBvbmx5LgorZnVuY192ZXJib3NlICgpCit7CisgICAgJG9wdF92ZXJib3NlICYmIGZ1bmNfZWNobyAkezErIiRAIn0KKworICAgICMgQSBidWcgaW4gYmFzaCBoYWx0cyB0aGUgc2NyaXB0IGlmIHRoZSBsYXN0IGxpbmUgb2YgYSBmdW5jdGlvbgorICAgICMgZmFpbHMgd2hlbiBzZXQgLWUgaXMgaW4gZm9yY2UsIHNvIHdlIG5lZWQgYW5vdGhlciBjb21tYW5kIHRvCisgICAgIyB3b3JrIGFyb3VuZCB0aGF0OgorICAgIDoKK30KKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIKK30KKworIyBmdW5jX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY19lcnJvciAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9IiR7MSsiJEAifSAxPiYyCit9CisKKyMgZnVuY193YXJuaW5nIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX3dhcm5pbmcgKCkKK3sKKyAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH13YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKKworICAgICMgYmFzaCBidWcgYWdhaW46CisgICAgOgorfQorCisjIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgorZnVuY19mYXRhbF9lcnJvciAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCit9CisKKyMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2hlbHAgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgorfQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAorCisKKyMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKKyMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgorZnVuY19ncmVwICgpCit7CisgICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQorfQorCisKKyMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCisjIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgorZnVuY19ta2Rpcl9wICgpCit7CisgICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgorICAgIG15X2Rpcl9saXN0PQorCisgICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgorCisgICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCisgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgorICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OworICAgICAgZXNhYworCisgICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCisgICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCisgICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAorCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KKyAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCisKKyAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQorICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKKworICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKKyAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICIkbXlfZGlyZWN0b3J5X3BhdGgiIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgICAgZG9uZQorICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICIkbXlfZGlyX2xpc3QiIHwgJFNFRCAncyw6KiQsLCdgCisKKyAgICAgIHNhdmVfbWtkaXJfcF9JRlM9IiRJRlMiOyBJRlM9JzonCisgICAgICBmb3IgbXlfZGlyIGluICRteV9kaXJfbGlzdDsgZG8KKwlJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorICAgICAgICAjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaWYgdHdvIHByb2Nlc3NlcworICAgICAgICAjIHRyeSB0byBjcmVhdGUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb25jdXJyZW50bHkuICBEb24ndAorICAgICAgICAjIHN0b3AgaW4gdGhhdCBjYXNlIQorICAgICAgICAkTUtESVIgIiRteV9kaXIiIDI+L2Rldi9udWxsIHx8IDoKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisKKyAgICAgICMgQmFpbCBvdXQgaWYgd2UgKG9yIHNvbWUgb3RoZXIgcHJvY2VzcykgZmFpbGVkIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgICAgIHRlc3QgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYWlsZWQgdG8gY3JlYXRlIFxgJDEnIgorICAgIGZpCit9CisKKworIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQorIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZworIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgorIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCitmdW5jX21rdGVtcGRpciAoKQoreworICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKKworICAgIGlmIHRlc3QgIiRvcHRfZHJ5X3J1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorICAgICAgICAjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKKyAgICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgorCisgICAgICAgIHNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKyAgICAgICAgdW1hc2sgMDA3NworICAgICAgICAkTUtESVIgIiRteV90bXBkaXIiCisgICAgICAgIHVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgorICAgIGZpCisKKyAgICAkRUNITyAiJG15X3RtcGRpciIKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V2YWwgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlci4KKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IEZVTkNfUVVPVEVfRk9SX0VWQUxfUkVTVUxUCisjIGlzIGRvdWJsZS1xdW90ZWQsIHN1aXRhYmxlIGZvciBhIHN1YnNlcXVlbnQgZXZhbCwgd2hlcmVhcworIyBGVU5DX1FVT1RFX0ZPUl9FVkFMX1VOUVVPVEVEX1JFU1VMVCBoYXMgbWVyZWx5IGFsbCBjaGFyYWN0ZXJzCisjIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZSBxdW90ZXMgYmFja3NsYXNoaWZpZWQuCitmdW5jX3F1b3RlX2Zvcl9ldmFsICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJcJF0qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQorICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgorICAgIGVzYWMKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAorIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitmdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIl0qKQorCW15X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgXAorCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7CisgICAgICAqKQorICAgICAgICBteV9hcmc9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJG15X2FyZyBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCit9CisKKworIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KK2Z1bmNfc2hvd19ldmFsICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKworIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KK2Z1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQorCSAgICAkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworIyBmdW5jX3RyX3NoCisjIFR1cm4gJDEgaW50byBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYSBzaGVsbCB2YXJpYWJsZSBuYW1lLgorIyBSZXN1bHQgaXMgc3RvcmVkIGluICRmdW5jX3RyX3NoX3Jlc3VsdC4gIEFsbCBjaGFyYWN0ZXJzCisjIG5vdCBpbiB0aGUgc2V0IGEtekEtWjAtOV8gYXJlIHJlcGxhY2VkIHdpdGggJ18nLiBGdXJ0aGVyLAorIyBpZiAkMSBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBhICdfJyBpcyBwcmVwZW5kZWQgYXMgd2VsbC4KK2Z1bmNfdHJfc2ggKCkKK3sKKyAgY2FzZSAkMSBpbgorICBbMC05XSogfCAqWyFhLXpBLVowLTlfXSopCisgICAgZnVuY190cl9zaF9yZXN1bHQ9YCRFQ0hPICIkMSIgfCAkU0VEICdzL15cKFswLTldXCkvX1wxLzsgcy9bXmEtekEtWjAtOV9dL18vZydgCisgICAgOzsKKyAgKiApCisgICAgZnVuY190cl9zaF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKworIyBmdW5jX3ZlcnNpb24KKyMgRWNobyB2ZXJzaW9uIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY192ZXJzaW9uICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnLyhDKS8hYiBnbworCTptb3JlCisJL1wuLyF7CisJICBOCisJICBzL1xuIyAvIC8KKwkgIGIgbW9yZQorCX0KKwk6Z28KKwkvXiMgJyRQUk9HUkFNJyAoR05VIC8sLyMgd2FycmFudHk7IC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisgICAgICAgIHMvXCgoQylcKVsgMC05LC1dKlwoIFsxLTldWzAtOV0qXCkvXDFcMi8KKyAgICAgICAgcAorICAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgIGV4aXQgJD8KK30KKworIyBmdW5jX3VzYWdlCisjIEVjaG8gc2hvcnQgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdXNhZ2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvXiMgICouKi0taGVscC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcy9cJHByb2duYW1lLyckcHJvZ25hbWUnLworCXAKKyAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgZWNobworICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfaGVscCBbTk9FWElUXQorIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdCwKKyMgdW5sZXNzICdub2V4aXQnIGlzIHBhc3NlZCBhcyBhcmd1bWVudC4KK2Z1bmNfaGVscCAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIFJlcG9ydCBidWdzIHRvLyB7CisJOnByaW50CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzKlwkcHJvZ25hbWUqJyRwcm9nbmFtZScqCisJcypcJGhvc3QqJyIkaG9zdCInKgorCXMqXCRTSEVMTConIiRTSEVMTCInKgorCXMqXCRMVENDKiciJExUQ0MiJyoKKwlzKlwkTFRDRkxBR1MqJyIkTFRDRkxBR1MiJyoKKwlzKlwkTEQqJyIkTEQiJyoKKwlzL1wkd2l0aF9nbnVfbGQvJyIkd2l0aF9nbnVfbGQiJy8KKwlzL1wkYXV0b21ha2VfdmVyc2lvbi8nImAoJHtBVVRPTUFLRS1hdXRvbWFrZX0gLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlzL1wkYXV0b2NvbmZfdmVyc2lvbi8nImAoJHtBVVRPQ09ORi1hdXRvY29uZn0gLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlwCisJZAorICAgICB9CisgICAgIC9eIyAuKiBob21lIHBhZ2U6L2IgcHJpbnQKKyAgICAgL14jIEdlbmVyYWwgaGVscCB1c2luZy9iIHByaW50CisgICAgICcgPCAiJHByb2dwYXRoIgorICAgIHJldD0kPworICAgIGlmIHRlc3QgLXogIiQxIjsgdGhlbgorICAgICAgZXhpdCAkcmV0CisgICAgZmkKK30KKworIyBmdW5jX21pc3NpbmdfYXJnIGFyZ25hbWUKKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQgc2V0IGdsb2JhbAorIyBleGl0X2NtZC4KK2Z1bmNfbWlzc2luZ19hcmcgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICBmdW5jX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IGZvciAkMS4iCisgICAgZXhpdF9jbWQ9ZXhpdAorfQorCisKKyMgZnVuY19zcGxpdF9zaG9ydF9vcHQgc2hvcnRvcHQKKyMgU2V0IGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIFNIT1JUT1BUIGFmdGVyIHRoZSAybmQgY2hhcmFjdGVyLgorZnVuY19zcGxpdF9zaG9ydF9vcHQgKCkKK3sKKyAgICBteV9zZWRfc2hvcnRfb3B0PScxcy9eXCguLlwpLiokL1wxLztxJworICAgIG15X3NlZF9zaG9ydF9yZXN0PScxcy9eLi5cKC4qXCkkL1wxLztxJworCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfc2hvcnRfb3B0ImAKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X3Jlc3QiYAorfSAjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19zcGxpdF9sb25nX29wdCBsb25nb3B0CisjIFNldCBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIHNoZWxsCisjIHZhcmlhYmxlcyBhZnRlciBzcGxpdHRpbmcgTE9OR09QVCBhdCB0aGUgYD0nIHNpZ24uCitmdW5jX3NwbGl0X2xvbmdfb3B0ICgpCit7CisgICAgbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtLVtePV0qXCk9LiovXDEvO3EnCisgICAgbXlfc2VkX2xvbmdfYXJnPScxcy9eLS1bXj1dKj0vLycKKworICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19vcHQiYAorICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9sb25nX2FyZyJgCit9ICMgZnVuY19zcGxpdF9sb25nX29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworZXhpdF9jbWQ9OgorCisKKworCisKK21hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKK21hZ2ljX2V4ZT0iJSUlTUFHSUMgRVhFIHZhcmlhYmxlJSUlIgorCisjIEdsb2JhbCB2YXJpYWJsZXMuCitub25vcHQ9CitwcmVzZXJ2ZV9hcmdzPQorbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgorbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgorZXh0cmFjdGVkX2FyY2hpdmVzPQorZXh0cmFjdGVkX3NlcmlhbD0wCisKKyMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAorIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCisjIGxlZnQgb3ZlciBieSBzaGVsbHMuCitleGVjX2NtZD0KKworIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKKyMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgorZnVuY19hcHBlbmQgKCkKK3sKKyAgICBldmFsICIkezF9PVwkJHsxfVwkezJ9IgorfSAjIGZ1bmNfYXBwZW5kIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisjIGZ1bmNfYXBwZW5kX3F1b3RlZCB2YXIgdmFsdWUKKyMgUXVvdGUgVkFMVUUgYW5kIGFwcGVuZCB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUiwgc2VwYXJhdGVkCisjIGJ5IGEgc3BhY2UuCitmdW5jX2FwcGVuZF9xdW90ZWQgKCkKK3sKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IgorICAgIGV2YWwgIiR7MX09XCQkezF9XFwgXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKK30gIyBmdW5jX2FwcGVuZF9xdW90ZWQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICAgIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIke0B9ImAKK30gIyBmdW5jX2FyaXRoIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sZW4gc3RyaW5nCisjIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCitmdW5jX2xlbiAoKQoreworICAgIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJHsxfSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAorfSAjIGZ1bmNfbGVuIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgICAgZnVuY19sbzJvX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGxvMm8iYAorfSAjIGZ1bmNfbG8ybyBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICAgIGZ1bmNfeGZvcm1fcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICdzL1wuW14uXSokLy5sby8nYAorfSAjIGZ1bmNfeGZvcm0gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5CisjIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2Vycm9yICJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuIgorfQorCisKKyMgZnVuY19jb25maWcKKyMgRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIHRoZSB0YWdzIGluIHRoaXMgc2NyaXB0LgorZnVuY19jb25maWcgKCkKK3sKKyAgICByZV9iZWdpbmNmPSdeIyAjIyMgQkVHSU4gTElCVE9PTCcKKyAgICByZV9lbmRjZj0nXiMgIyMjIEVORCBMSUJUT09MJworCisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgJFNFRCAiMSwvJHJlX2JlZ2luY2YgQ09ORklHL2Q7LyRyZV9lbmRjZiBDT05GSUcvLFwkZCIgPCAiJHByb2dwYXRoIgorCisgICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KKyAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KKyAgICAgICRTRUQgLW4gIi8kcmVfYmVnaW5jZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkLywvJHJlX2VuZGNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvcCIgPCAiJHByb2dwYXRoIgorICAgIGRvbmUKKworICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2ZlYXR1cmVzCisjIERpc3BsYXkgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2Z1bmNfZmVhdHVyZXMgKCkKK3sKKyAgICBlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19lbmFibGVfdGFnIHRhZ25hbWUKKyMgVmVyaWZ5IHRoYXQgVEFHTkFNRSBpcyB2YWxpZCwgYW5kIGVpdGhlciBmbGFnIGFuIGVycm9yIGFuZCBleGl0LCBvcgorIyBlbmFibGUgdGhlIFRBR05BTUUgdGFnLiAgV2UgYWxzbyBhZGQgVEFHTkFNRSB0byB0aGUgZ2xvYmFsICR0YWdsaXN0CisjIHZhcmlhYmxlIGhlcmUuCitmdW5jX2VuYWJsZV90YWcgKCkKK3sKKyAgIyBHbG9iYWwgdmFyaWFibGU6CisgIHRhZ25hbWU9IiQxIgorCisgIHJlX2JlZ2luY2Y9Il4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHJlX2VuZGNmPSJeIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKKyAgc2VkX2V4dHJhY3RjZj0iLyRyZV9iZWdpbmNmLywvJHJlX2VuZGNmL3AiCisKKyAgIyBWYWxpZGF0ZSB0YWduYW1lLgorICBjYXNlICR0YWduYW1lIGluCisgICAgKlshLV9BLVphLXowLTksL10qKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiCisgICAgICA7OworICBlc2FjCisKKyAgIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93IGl0J3MKKyAgIyB0aGVyZSBidXQgbm90IHNwZWNpYWxseSBtYXJrZWQuCisgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICBDQykgOzsKKyAgICAqKQorICAgICAgaWYgJEdSRVAgIiRyZV9iZWdpbmNmIiAiJHByb2dwYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKKworCSMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBCZSBjYXJlZnVsIHRvIHF1b3RlIHRoZSBwYXRoCisJIyBhbmQgdGhlIHNlZCBzY3JpcHQsIHRvIGF2b2lkIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlLCBidXQKKwkjIGFsc28gZG9uJ3QgdXNlIG5vbi1wb3J0YWJsZSBxdW90ZXMgd2l0aGluIGJhY2txdW90ZXMgd2l0aGluCisJIyBxdW90ZXMgd2UgaGF2ZSB0byBkbyBpdCBpbiAyIHN0ZXBzOgorCWV4dHJhY3RlZGNmPWAkU0VEIC1uIC1lICIkc2VkX2V4dHJhY3RjZiIgPCAiJHByb2dwYXRoImAKKwlldmFsICIkZXh0cmFjdGVkY2YiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAiaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiCisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworfQorCisjIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQorIyByZWxlYXNlIG9mIGxpYnRvb2wuCitmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKK3sKKyAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCisgICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBlbHNlCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKKyRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KKyRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9NSVNNQVRDSAorICBmaQorfQorCisKKyMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorY2FzZSAkMSBpbgorY2xlYW58Y2xlYXxjbGV8Y2wpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2NvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0CisgIDs7CitmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2luc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworbGlua3xsaW58bGl8bCkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0CisgIDs7Cit1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2VzYWMKKworCisKKyMgT3B0aW9uIGRlZmF1bHRzOgorb3B0X2RlYnVnPToKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfY29uZmlnPWZhbHNlCitvcHRfcHJlc2VydmVfZHVwX2RlcHM9ZmFsc2UKK29wdF9mZWF0dXJlcz1mYWxzZQorb3B0X2ZpbmlzaD1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9oZWxwX2FsbD1mYWxzZQorb3B0X3NpbGVudD06CitvcHRfd2FybmluZz06CitvcHRfdmVyYm9zZT06CitvcHRfc2lsZW50PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorCisKKyMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHRoZQorIyBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgLS12ZXJzaW9uJyBoYXBwZW4gYXMgcXVpY2tseSBhcyB3ZSBjYW4uCit7CisgICMgdGhpcyBqdXN0IGVhc2VzIGV4aXQgaGFuZGxpbmcKKyAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgICBvcHQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAkb3B0IGluCisgICAgICAtLWRlYnVnfC14KQlvcHRfZGVidWc9J3NldCAteCcKKwkJCWZ1bmNfZWNobyAiZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisgICAgICAtLWRyeS1ydW58LS1kcnlydW58LW4pCisJCQlvcHRfZHJ5X3J1bj06CisJCQk7OworICAgICAgLS1jb25maWcpCisJCQlvcHRfY29uZmlnPToKK2Z1bmNfY29uZmlnCisJCQk7OworICAgICAgLS1kbG9wZW58LWRsb3BlbikKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfZGxvcGVuPSIke29wdF9kbG9wZW4rJG9wdF9kbG9wZW4KK30kb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQorCQkJb3B0X3ByZXNlcnZlX2R1cF9kZXBzPToKKwkJCTs7CisgICAgICAtLWZlYXR1cmVzKQorCQkJb3B0X2ZlYXR1cmVzPToKK2Z1bmNfZmVhdHVyZXMKKwkJCTs7CisgICAgICAtLWZpbmlzaCkKKwkJCW9wdF9maW5pc2g9Ogorc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorCQkJOzsKKyAgICAgIC0taGVscCkKKwkJCW9wdF9oZWxwPToKKwkJCTs7CisgICAgICAtLWhlbHAtYWxsKQorCQkJb3B0X2hlbHBfYWxsPToKK29wdF9oZWxwPSc6IGhlbHAtYWxsJworCQkJOzsKKyAgICAgIC0tbW9kZSkKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF9tb2RlPSIkb3B0YXJnIgorY2FzZSAkb3B0YXJnIGluCisgICMgVmFsaWQgbW9kZSBhcmd1bWVudHM6CisgIGNsZWFufGNvbXBpbGV8ZXhlY3V0ZXxmaW5pc2h8aW5zdGFsbHxsaW5rfHJlbGlua3x1bmluc3RhbGwpIDs7CisKKyAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisgICAgIGV4aXRfY21kPWV4aXQKKyAgICAgYnJlYWsKKyAgICAgOzsKK2VzYWMKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1uby1zaWxlbnR8LS1uby1xdWlldCkKKwkJCW9wdF9zaWxlbnQ9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8td2FybmluZ3wtLW5vLXdhcm4pCisJCQlvcHRfd2FybmluZz1mYWxzZQorZnVuY19hcHBlbmQgcHJlc2VydmVfYXJncyAiICRvcHQiCisJCQk7OworICAgICAgLS1uby12ZXJib3NlKQorCQkJb3B0X3ZlcmJvc2U9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tc2lsZW50fC0tcXVpZXQpCisJCQlvcHRfc2lsZW50PToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorICAgICAgICBvcHRfdmVyYm9zZT1mYWxzZQorCQkJOzsKKyAgICAgIC0tdmVyYm9zZXwtdikKKwkJCW9wdF92ZXJib3NlPToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0Igorb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKyAgICAgIC0tdGFnKQorCQkJdGVzdCAkIyA9IDAgJiYgZnVuY19taXNzaW5nX2FyZyAkb3B0ICYmIGJyZWFrCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X3RhZz0iJG9wdGFyZyIKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0ICRvcHRhcmciCitmdW5jX2VuYWJsZV90YWcgIiRvcHRhcmciCisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLVw/fC1oKQkJZnVuY191c2FnZQkJCQk7OworICAgICAgLS1oZWxwKQkJZnVuY19oZWxwCQkJCTs7CisgICAgICAtLXZlcnNpb24pCWZ1bmNfdmVyc2lvbgkJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLS0qPSopCisJCQlmdW5jX3NwbGl0X2xvbmdfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIiAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG5vbi1hcmd1bWVudCBzaG9ydCBvcHRpb25zOgorICAgICAgLVw/KnwtaCp8LW4qfC12KikKKwkJCWZ1bmNfc3BsaXRfc2hvcnRfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZSIgIi0kZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLSkJCWJyZWFrCQkJCQk7OworICAgICAgLSopCQlmdW5jX2ZhdGFsX2hlbHAgInVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0JyIgOzsKKyAgICAgICopCQlzZXQgZHVtbXkgIiRvcHQiICR7MSsiJEAifTsJc2hpZnQ7IGJyZWFrICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgVmFsaWRhdGUgb3B0aW9uczoKKworICAjIHNhdmUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudAorICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKyAgICBub25vcHQ9IiRvcHQiCisgICAgc2hpZnQKKyAgZmkKKworICAjIHByZXNlcnZlIC0tZGVidWcKKyAgdGVzdCAiJG9wdF9kZWJ1ZyIgPSA6IHx8IGZ1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAtLWRlYnVnIgorCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X3ByZXNlcnZlX2R1cF9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgJG9wdF9oZWxwIHx8IHsKKyAgICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6CisgICAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKKyAgICBmaQorCisgICAgIyBEYXJ3aW4gc3Vja3MKKyAgICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCisgICAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgICBpZiB0ZXN0IC1uICIkb3B0X2Rsb3BlbiIgJiYgdGVzdCAiJG9wdF9tb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgICAkRUNITyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgICAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kb3B0X21vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgfQorCisKKyAgIyBCYWlsIGlmIHRoZSBvcHRpb25zIHdlcmUgc2NyZXdlZAorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgICAgTWFpbi4gICAgIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKKyMgZnVuY19sYWxpYl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2xhbGliX3AgKCkKK3sKKyAgICB0ZXN0IC1mICIkMSIgJiYKKyAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCisgICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAorIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAorIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KKyMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKKyMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgorZnVuY19sYWxpYl91bnNhZmVfcCAoKQoreworICAgIGxhbGliX3A9bm8KKyAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgorCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAorCWRvCisJICAgIHJlYWQgbGFsaWJfcF9saW5lCisJICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCisJCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKKwkgICAgZXNhYworCWRvbmUKKwlleGVjIDA8JjUgNTwmLQorICAgIGZpCisgICAgdGVzdCAiJGxhbGliX3AiID0geWVzCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCit7CisgICAgZnVuY19sYWxpYl9wICIkMSIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KKyAgICBjYXNlICQxIGluCisgICAgKi5leGUpIDs7CisgICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OworICAgIGVzYWMKKyAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKKyMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCisjIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQorIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKK3sKKyAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkMSIgIiIgIi4iCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0LyRvYmpkaXIvJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9X2x0c2h3cmFwcGVyIgorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgorfQorCisKKyMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKKyMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCisjIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgorIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCitmdW5jX2V4ZWN1dGVfY21kcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCisgICAgZm9yIGNtZCBpbiAkMTsgZG8KKyAgICAgIElGUz0kc2F2ZV9pZnMKKyAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKKyAgICBkb25lCisgICAgSUZTPSRzYXZlX2lmcworfQorCisKKyMgZnVuY19zb3VyY2UgZmlsZQorIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgorIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisjIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKyMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorZnVuY19zb3VyY2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkMSBpbgorICAgICovKiB8ICpcXCopCS4gIiQxIiA7OworICAgICopCQkuICIuLyQxIiA7OworICAgIGVzYWMKK30KKworCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290IFBBVEgKKyMgUmVwbGFjZSBhIGxlYWRpbmcgPSBpbiBQQVRIIHdpdGggYSBzeXNyb290LiAgU3RvcmUgdGhlIHJlc3VsdCBpbnRvCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorZnVuY19yZXNvbHZlX3N5c3Jvb3QgKCkKK3sKKyAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSQxCisgIGNhc2UgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCBpbgorICA9KikKKyAgICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX3JlcGxhY2Vfc3lzcm9vdCBQQVRICisjIElmIFBBVEggYmVnaW5zIHdpdGggdGhlIHN5c3Jvb3QsIHJlcGxhY2UgaXQgd2l0aCA9IGFuZAorIyBzdG9yZSB0aGUgcmVzdWx0IGludG8gZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0LgorZnVuY19yZXBsYWNlX3N5c3Jvb3QgKCkKK3sKKyAgY2FzZSAiJGx0X3N5c3Jvb3Q6JDEiIGluCisgID8qOiIkbHRfc3lzcm9vdCIqKQorICAgIGZ1bmNfc3RyaXBuYW1lICIkbHRfc3lzcm9vdCIgJycgIiQxIgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0iPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisgICAgOzsKKyAgKikKKyAgICAjIEluY2x1ZGluZyBubyBzeXNyb290LgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0kMQorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2luZmVyX3RhZyBhcmcKKyMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAorIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKKyMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgorIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKK2Z1bmNfaW5mZXJfdGFnICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBDQ19xdW90ZWQ9CisgICAgICBmb3IgYXJnIGluICRDQzsgZG8KKwlmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorICAgICAgZG9uZQorICAgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorICAgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisgICAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopIDs7CisgICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAorICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgorICAgICAgKikKKwlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCisJICBpZiAkR1JFUCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCisJICAgIENDX3F1b3RlZD0KKwkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBDQ19xdW90ZWQgIiRhcmciCisJICAgIGRvbmUKKwkgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorCSAgICBDQ19xdW90ZWRfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDX3F1b3RlZGAKKwkgICAgY2FzZSAiJEAgIiBpbgorCSAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisJICAgICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiICRDQ19xdW90ZWRfZXhwYW5kZWQgIiogfCAiJENDX3F1b3RlZF9leHBhbmRlZCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgorIwllbHNlCisjCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisKKyMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQorIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCitmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCit7CisgICAgd3JpdGVfbGlib2JqPSR7MX0KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX2xvYmo9bm9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9vbGRvYmo9bm9uZQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCisjICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorcGljX29iamVjdD0kd3JpdGVfbG9iagorCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Citub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCisKK0VPRgorICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGSUxFIE5BTUUgQU5EIFBBVEggQ09OVkVSU0lPTiBIRUxQRVIgRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZmlsZSBuYW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsCisjIGFuZCAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEKKyMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0KKyMgaW4gJGJ1aWxkJ3MgJFBBVEguCisjCisjIEFSRyBpcyB0aGUgJGJ1aWxkIGZpbGUgbmFtZSB0byBiZSBjb252ZXJ0ZWQgdG8gdzMyIGZvcm1hdC4KKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiAkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQsIGFuZCB3aWxsCisjIGJlIGVtcHR5IG9uIGVycm9yIChvciB3aGVuIEFSRyBpcyBlbXB0eSkKK2Z1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXJyb3IgY29kZSwgc28gd2UKKyAgICAjIGFyZSBmb3JjZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHN0ZG91dC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICMgY29tbWFuZCBpcyBub3QgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAorICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aCBlcnJvciBjb2RlIG9mCisgICAgIyB6ZXJvIEFORCBub24tZW1wdHkgc3Rkb3V0LCB3aGljaCBleHBsYWlucyB0aGUgb2RkIGNvbnN0cnVjdGlvbjoKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcD1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLWVxIDAgJiYgdGVzdCAtbiAiJHtmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcH0iOyB0aGVuCisgICAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD1gJEVDSE8gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcCIgfAorICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgZWxzZQorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9CisgICAgZmkKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyIEFSRworIyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBwYXRoIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsIGFuZAorIyAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEgY29ycmVjdGx5CisjIGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0gaW4gJGJ1aWxkJ3MKKyMgJFBBVEguIEFzc3VtZXMgQVJHIGhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCisjCisjIEFSRyBpcyBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gd2luMzIuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0LgorIyBVbmNvbnZlcnRpYmxlIGZpbGUgKGRpcmVjdG9yeSkgbmFtZXMgaW4gQVJHIGFyZSBza2lwcGVkOyBpZiBubyBkaXJlY3RvcnkgbmFtZXMKKyMgYXJlIGNvbnZlcnRpYmxlLCB0aGVuIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5LgorZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgICMgdW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lc24ndCBjb252ZXJ0IHBhdGhzLCBvbmx5IGZpbGUgbmFtZXMKKyAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgb2xkSUZTPSRJRlMKKyAgICBJRlM9OgorICAgIGZvciBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YgaW4gJDE7IGRvCisgICAgICBJRlM9JG9sZElGUworICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfZiIKKyAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBlbHNlCisgICAgICAgICAgZnVuY19hcHBlbmQgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQgIjskZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9JG9sZElGUworICBmaQorfQorIyBlbmQ6IGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIKKworCisjIGZ1bmNfY3lncGF0aCBBUkdTLi4uCisjIFdyYXBwZXIgYXJvdW5kIGNhbGxpbmcgdGhlIGN5Z3BhdGggcHJvZ3JhbSB2aWEgTFRfQ1lHUEFUSC4gVGhpcyBpcyB1c2VkIHdoZW4KKyMgd2hlbiAoMSkgJGJ1aWxkIGlzICpuaXggYW5kIEN5Z3dpbiBpcyBob3N0ZWQgdmlhIGEgd2luZSBlbnZpcm9ubWVudDsgb3IgKDIpCisjICRidWlsZCBpcyBNU1lTIGFuZCAkaG9zdCBpcyBDeWd3aW4sIG9yICgzKSAkYnVpbGQgaXMgQ3lnd2luLiBJbiBjYXNlICgxKSBvcgorIyAoMiksIHJldHVybnMgdGhlIEN5Z3dpbiBmaWxlIG5hbWUgb3IgcGF0aCBpbiBmdW5jX2N5Z3BhdGhfcmVzdWx0IChpbnB1dAorIyBmaWxlIG5hbWUgb3IgcGF0aCBpcyBhc3N1bWVkIHRvIGJlIGluIHczMiBmb3JtYXQsIGFzIHByZXZpb3VzbHkgY29udmVydGVkCisjIGZyb20gJGJ1aWxkJ3MgKm5peCBvciBNU1lTIGZvcm1hdCkuIEluIGNhc2UgKDMpLCByZXR1cm5zIHRoZSB3MzIgZmlsZSBuYW1lCisjIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbgorIyBDeWd3aW4gZm9ybWF0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisjCisjIEFSR1MgYXJlIHBhc3NlZCB0byBjeWdwYXRoLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyB0aGUgZmlsZSBuYW1lIG9yIHBhdGggdG8KKyMgYmUgY29udmVydGVkLgorIworIyBTcGVjaWZ5IHRoZSBhYnNvbHV0ZSAqbml4IChvciB3MzIpIG5hbWUgdG8gY3lncGF0aCBpbiB0aGUgTFRfQ1lHUEFUSAorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgZG8gbm90IHB1dCBpdCBpbiAkUEFUSC4KK2Z1bmNfY3lncGF0aCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLW4gIiRMVF9DWUdQQVRIIiAmJiB0ZXN0IC1mICIkTFRfQ1lHUEFUSCI7IHRoZW4KKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PWAkTFRfQ1lHUEFUSCAiJEAiIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgIiQ/IiAtbmUgMDsgdGhlbgorICAgICAgIyBvbiBmYWlsdXJlLCBlbnN1cmUgcmVzdWx0IGlzIGVtcHR5CisgICAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZpCisgIGVsc2UKKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZ1bmNfZXJyb3IgIkxUX0NZR1BBVEggaXMgZW1wdHkgb3Igc3BlY2lmaWVzIG5vbi1leGlzdGVudCBmaWxlOiBcYCRMVF9DWUdQQVRIJyIKKyAgZmkKK30KKyNlbmQ6IGZ1bmNfY3lncGF0aAorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIG9yIHBhdGggQVJHIGZyb20gTVNZUyBmb3JtYXQgdG8gdzMyIGZvcm1hdC4gIFJldHVybgorIyByZXN1bHQgaW4gZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0LgorZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKKyAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0PWAoIGNtZCAvL2MgZWNobyAiJDEiICkgMj4vZGV2L251bGwgfAorICAgICRTRUQgLWUgJ3MvWyBdKiQvLycgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKK30KKyNlbmQ6IGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayBBUkcxIEFSRzIKKyMgVmVyaWZ5IHRoYXQgQVJHMSAoYSBmaWxlIG5hbWUgaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gQVJHMi4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSAocmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBBUkcxKS4KK2Z1bmNfY29udmVydF9maWxlX2NoZWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgdGVzdCAteiAiJDIiICYmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIGhvc3QgZmlsZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQxJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrOgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjaworCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgRlJPTV9QQVRIU0VQIFRPX1BBVEhTRVAgRlJPTV9QQVRIIFRPX1BBVEgKKyMgVmVyaWZ5IHRoYXQgRlJPTV9QQVRIIChhIHBhdGggaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gVE9fUEFUSC4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSwgcmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBhIHNpbXBsaXN0aWMgZmFsbGJhY2sgdmFsdWUgKHNlZSBiZWxvdykuCitmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQ0IiAmJiB0ZXN0IC1uICIkMyI7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBob3N0IHBhdGggY29ycmVzcG9uZGluZyB0byIKKyAgICBmdW5jX2Vycm9yICIgIFxgJDMnIgorICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICMgRmFsbGJhY2suICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHNpbXBsaXN0aWMgImNvbnZlcnNpb24iIGFuZAorICAgICMgc2hvdWxkIG5vdCBiZSAiaW1wcm92ZWQiLiAgU2VlIGxpYnRvb2wuaW5mby4KKyAgICBpZiB0ZXN0ICJ4JDEiICE9ICJ4JDIiOyB0aGVuCisgICAgICBsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnM9InN8JDF8JDJ8ZyIKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJDMiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9jaGFycyJgCisgICAgZWxzZQorICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyIKKyAgICBmaQorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCBGUk9OVFBBVCBCQUNLUEFUIFJFUEwgT1JJRworIyBNb2RpZmllcyBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQgYnkgcHJlcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBGUk9OVFBBVAorIyBhbmQgYXBwZW5kaW5nIFJFUEwgaWYgT1JJRyBtYXRjaGVzIEJBQ0tQQVQuCitmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBjYXNlICQ0IGluCisgICQxICkgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgOzsKKyAgZXNhYworICBjYXNlICQ0IGluCisgICQyICkgZnVuY19hcHBlbmQgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0ICIkMyIKKyAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgRklMRSBOQU1FIENPTlZFUlNJT04gRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9maWxlX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorCisKKyMgZnVuY190b19ob3N0X2ZpbGUgQVJHCisjIENvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY190b19ob3N0X2ZpbGUgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAkdG9faG9zdF9maWxlX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfZmlsZQorCisKKyMgZnVuY190b190b29sX2ZpbGUgQVJHIExBWlkKKyMgY29udmVydHMgdGhlIGZpbGUgbmFtZSBBUkcgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHRvb2xjaGFpbiBmb3JtYXQuIFJldHVybgorIyByZXN1bHQgaW4gZnVuY190b190b29sX2ZpbGVfcmVzdWx0LiAgSWYgdGhlIGNvbnZlcnNpb24gaW4gdXNlIGlzIGxpc3RlZAorIyBpbiAodGhlIGNvbW1hIHNlcGFyYXRlZCkgTEFaWSwgbm8gY29udmVyc2lvbiB0YWtlcyBwbGFjZS4KK2Z1bmNfdG9fdG9vbF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAsJDIsIGluCisgICAgKiwiJHRvX3Rvb2xfZmlsZV9jbWQiLCopCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JDEKKyAgICAgIDs7CisgICAgKikKKyAgICAgICR0b190b29sX2ZpbGVfY21kICIkMSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdD0kZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0CisgICAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX3RvX3Rvb2xfZmlsZQorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIChtaW5ndykgTVNZUyB0byAobWluZ3cpIHczMiBmb3JtYXQ7IGF1dG9tYXRpYworIyBjb252ZXJzaW9uIHRvIHczMiBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSB0aGUgY3dyYXBwZXIuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBiZWNhdXNlICRidWlsZCBpcyBjeWd3aW4sIHdlIGNhbGwgInRoZSIgY3lncGF0aCBpbiAkUEFUSDsgbm8gbmVlZCB0byB1c2UKKyAgICAjIExUX0NZR1BBVEggaW4gdGhpcyBjYXNlLgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD1gY3lncGF0aCAtbSAiJDEiYAorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byB3MzIgZm9ybWF0LiAgUmVxdWlyZXMgYSB3aW5lIGVudmlyb25tZW50CisjIGFuZCBhIHdvcmtpbmcgd2luZXBhdGguIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgQ3lnd2luIGluc3RhbGxlZAorIyBpbiBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIGNvbnZlcnQgZnJvbSAqbml4IHRvIHczMiwgdGhlbiB1c2UgY3lncGF0aCB0byBjb252ZXJ0IGZyb20gdzMyIHRvIGN5Z3dpbi4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgUEFUSCBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaW52b2tlZCB2aWEgYCR0b19ob3N0X3BhdGhfY21kIEFSRycKKyMKKyMgSW4gZWFjaCBjYXNlLCBBUkcgaXMgdGhlIHBhdGggdG8gYmUgY29udmVydGVkIGZyb20gJGJ1aWxkIHRvICRob3N0IGZvcm1hdC4KKyMgVGhlIHJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorIworIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuICBJZgorIyBBUkcgYmVnaW5zIG9yIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciwgaXQgaXMgcHJlc2VydmVkIChidXQKKyMgY29udmVydGVkIHRvICRob3N0IGZvcm1hdCkgb24gb3V0cHV0LgorIworIyBBbGwgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbmFtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorIyAgIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9uICAgIDogZnVuY19jb252ZXJ0X2ZpbGVfWF90b19ZICgpCisjICAgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9uICAgICAgICAgOiBmdW5jX2NvbnZlcnRfcGF0aF9YX3RvX1kgKCkKKyMgd2hlcmUsIGZvciBhbnkgZ2l2ZW4gJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9uIHRoZSAnWF90b19ZJyB2YWx1ZSBpcyB0aGUKKyMgc2FtZS4gIElmIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhZGRlZCBmb3IgbmV3ICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbnMsCisjIHRoZSB0d28gbmV3IGZ1bmN0aW9ucyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4sIG9yIGZ1bmNfaW5pdF90b19ob3N0X3BhdGhfY21kCisjIHdpbGwgYnJlYWsuCisKKworIyBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyBFbnN1cmVzIHRoYXQgZnVuY3Rpb24gInBvaW50ZXIiIHZhcmlhYmxlICR0b19ob3N0X3BhdGhfY21kIGlzIHNldCB0byB0aGUKKyMgYXBwcm9wcmlhdGUgdmFsdWUsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAkdG9faG9zdF9maWxlX2NtZC4KK3RvX2hvc3RfcGF0aF9jbWQ9CitmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiR0b19ob3N0X3BhdGhfY21kIjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICdmdW5jX2NvbnZlcnRfZmlsZV8nICcnICIkdG9faG9zdF9maWxlX2NtZCIKKyAgICB0b19ob3N0X3BhdGhfY21kPSJmdW5jX2NvbnZlcnRfcGF0aF8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0iCisgIGZpCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBBUkcKKyMgQ29udmVydHMgdGhlIHBhdGggQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorICAkdG9faG9zdF9wYXRoX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfcGF0aAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20gQVJHLiAgTVNZUworICAgICMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmU7IGN5Z3BhdGggdHVybnMgdGhlbSBpbnRvICcuOycgYW5kICc7Lic7CisgICAgIyBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBDeWd3aW4gdG8gdzMyIGZvcm1hdC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gY3lncGF0aCAtbSAtcCAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiYAorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudCBhbmQKKyMgYSB3b3JraW5nIHdpbmVwYXRoLiAgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiAiOyIgXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiICI7IiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tIE1TWVMgdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIExUX0NZR1BBVEggc2V0LgorIyBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQgaW4gYQorIyBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20KKyAgICAjIEFSRy4gbXN5cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgaGVyZSwgY3lncGF0aCB0dXJucyB0aGVtCisgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiA6IFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiA6ICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4KKworCisjIGZ1bmNfbW9kZV9jb21waWxlIGFyZy4uLgorZnVuY19tb2RlX2NvbXBpbGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgorICAgIHN1cHByZXNzX29wdD15ZXMKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisgICAgYXJnX21vZGU9bm9ybWFsCisgICAgbGlib2JqPQorICAgIGxhdGVyPQorICAgIHBpZV9mbGFnPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIHRlc3QgLW4gIiRsaWJvYmoiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAieW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIgorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1waWUgfCAtZnBpZSB8IC1mUElFKQorICAgICAgICAgIGZ1bmNfYXBwZW5kIHBpZV9mbGFnICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXNoYXJlZCB8IC1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGZ1bmNfYXBwZW5kIGxhdGVyICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCSAgYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZnVuY19hcHBlbmRfcXVvdGVkIGxhc3RhcmcgIiRhcmciCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCisJICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCisJICBmdW5jX2FwcGVuZCBiYXNlX2NvbXBpbGUgIiAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKikKKwkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKwkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorCSAgIworCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCisJICBzcmNmaWxlPSIkYXJnIgorCSAgOzsKKwllc2FjICAjICBjYXNlICRhcmcKKwk7OworICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIGJhc2VfY29tcGlsZSAiJGxhc3RhcmciCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiB7CisJZnVuY19iYXNlbmFtZSAiJHNyY2ZpbGUiCisJbGlib2JqPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB9CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLltjQ0ZTaWZtc29dIHwgXAorICAgICouYWRhIHwgKi5hZGIgfCAqLmFkcyB8ICouYXNtIHwgXAorICAgICouYysrIHwgKi5jYyB8ICouaWkgfCAqLmNsYXNzIHwgKi5jcHAgfCAqLmN4eCB8IFwKKyAgICAqLltmRl1bMDldPyB8ICouZm9yIHwgKi5qYXZhIHwgKi5nbyB8ICoub2JqIHwgKi5zeCB8ICouY3UgfCAqLmN1cCkKKyAgICAgIGZ1bmNfeGZvcm0gIiRsaWJvYmoiCisgICAgICBsaWJvYmo9JGZ1bmNfeGZvcm1fcmVzdWx0CisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIGZ1bmNfbG8ybyAiJGxpYm9iaiI7IG9iaj0kZnVuY19sbzJvX3Jlc3VsdCA7OworICAgICopCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGlib2JqIgorICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIgXAorICAgICAgJiYgJEVDSE8gIlgkbGlib2JqIiB8ICRHUkVQICdbXX4jXip7fTs8Pj8iJyInIicJICYoKXxgJFtdJyBcCisgICAgICAmJiBmdW5jX3dhcm5pbmcgImxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG9iaiIgIi8iICIiCisgICAgb2JqbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBmaQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRFQ0hPICIkc3JjZmlsZSIgfCAkU0VEICdzJV4uKi8lJTsgcyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqPQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRvdXRwdXRfb2JqIgorICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKyAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJGxvY2tmaWxlIgorICAgIHRyYXAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScgMSAyIDE1CisKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHNyY2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgc3JjZmlsZT0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCisgICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0CisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZWxzZQorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJHhkaXIkb2JqZGlyIgorCisgICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KKwkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJGxvYmoiCisgICAgICBmaQorCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIglcCisgICAgICAgICAgJ3Rlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkbG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorCXN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSRwaWVfZmxhZyIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJG9iaiIKKyAgICAgIGZpCisKKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgZnVuY19hcHBlbmQgY29tbWFuZCAiJHN1cHByZXNzX291dHB1dCIKKyAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiIFwKKyAgICAgICAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgIiRsaWJvYmoiICIkb2JqZGlyLyRvYmpuYW1lIiAiJG9iam5hbWUiCisKKyAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCisgICAgICAgICRSTSAiJGxvY2tmaWxlIgorICAgICAgZmkKKyAgICB9CisKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworJG9wdF9oZWxwIHx8IHsKKyAgdGVzdCAiJG9wdF9tb2RlIiA9IGNvbXBpbGUgJiYgZnVuY19tb2RlX2NvbXBpbGUgJHsxKyIkQCJ9Cit9CisKK2Z1bmNfbW9kZV9oZWxwICgpCit7CisgICAgIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCisgICAgY2FzZSAkb3B0X21vZGUgaW4KKyAgICAgICIiKQorICAgICAgICAjIEdlbmVyaWMgaGVscCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXNhZ2UgY29tbWVudHMKKyAgICAgICAgIyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgorICAgICAgICBmdW5jX2hlbHAKKyAgICAgICAgOzsKKworICAgICAgY2xlYW4pCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgY29tcGlsZSkKKyAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1uby1zdXBwcmVzcyAgICAgIGRvIG5vdCBzdXBwcmVzcyBjb21waWxlciBvdXRwdXQgZm9yIG11bHRpcGxlIHBhc3NlcworICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGQgUElDIG9iamVjdHMgb25seQorICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGQgbm9uLVBJQyBvYmplY3RzIG9ubHkKKyAgLXNoYXJlZCAgICAgICAgICAgZG8gbm90IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLXN0YXRpYyAgICAgICAgICAgb25seSBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1XYyxGTEFHICAgICAgICAgIHBhc3MgRkxBRyBkaXJlY3RseSB0byB0aGUgY29tcGlsZXIKKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgICAgICAgIDs7CisKKyAgICAgIGV4ZWN1dGUpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgICAgICAgIDs7CisKKyAgICAgIGZpbmlzaCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICAgICAgICA7OworCisgICAgICBpbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1pbnN0LXByZWZpeC1kaXIgUFJFRklYLURJUiAgVXNlIFBSRUZJWC1ESVIgYXMgYSBzdGFnaW5nIGFyZWEgZm9yIGluc3RhbGxhdGlvbgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgICAgICAgIDs7CisKKyAgICAgIGxpbmspCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1iaW5kaXIgQklORElSICAgIHNwZWNpZnkgcGF0aCB0byBiaW5hcmllcyBkaXJlY3RvcnkgKGZvciBzeXN0ZW1zIHdoZXJlCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBtdXN0IGJlIGZvdW5kIGluIHRoZSBQQVRIIHNldHRpbmcgYXQgcnVudGltZSkKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQorICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXNoYXJlZCAgICAgICAgICAgb25seSBkbyBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXNocmV4dCBTVUZGSVggICAgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zdGF0aWMtbGlidG9vbC1saWJzCisgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKyAgLXdlYWsgTElCTkFNRSAgICAgZGVjbGFyZSB0aGF0IHRoZSB0YXJnZXQgcHJvdmlkZXMgdGhlIExJQk5BTUUgaW50ZXJmYWNlCisgIC1XYyxGTEFHCisgIC1YY29tcGlsZXIgRkxBRyAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCisgIC1XbCxGTEFHCisgIC1YbGlua2VyIEZMQUcgICAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGxpbmtlcgorICAtWENDbGlua2VyIEZMQUcgICBwYXNzIGxpbmstc3BlY2lmaWMgRkxBRyB0byB0aGUgY29tcGlsZXIgZHJpdmVyIChDQykKKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIHVuaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBlY2hvCisgICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKK30KKworIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5CitpZiAkb3B0X2hlbHA7IHRoZW4KKyAgaWYgdGVzdCAiJG9wdF9oZWxwIiA9IDo7IHRoZW4KKyAgICBmdW5jX21vZGVfaGVscAorICBlbHNlCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwlmdW5jX21vZGVfaGVscAorICAgICAgZG9uZQorICAgIH0gfCBzZWQgLW4gJzFwOyAyLCRzL15Vc2FnZTovICBvcjogL3AnCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwllY2hvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwKKyAgICBzZWQgJzFkCisgICAgICAvXldoZW4gcmVwb3J0aW5nLywvXlJlcG9ydC97CisJSAorCWQKKyAgICAgIH0KKyAgICAgICR4CisgICAgICAvaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMvZAorICAgICAgL21vcmUgZGV0YWlsZWQgLipNT0RFL2QKKyAgICAgIHMvXlVzYWdlOi4qLS1tb2RlPVwoW14gXSpcKSAuKi9EZXNjcmlwdGlvbiBvZiBcMSBtb2RlOi8nCisgIGZpCisgIGV4aXQgJD8KK2ZpCisKKworIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KK2Z1bmNfbW9kZV9leGVjdXRlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIHRlc3QgLXogIiRjbWQiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRvcHRfZGxvcGVuOyBkbworICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKKwl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICoubGEpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmaWxlIgorCWZpbGU9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAorCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZnVuY19hcHBlbmQgZGlyICIvJG9iamRpciIKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRkaXIvJGRsbmFtZSI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCTs7CisKKyAgICAgICopCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKiB8ICoubGEgfCAqLmxvICkgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICIkZmlsZSIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwllbGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgIGZ1bmNfc291cmNlICIkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBhcmdzICIkZmlsZSIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0ICJYJG9wdF9kcnlfcnVuIiA9IFhmYWxzZTsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCisgICAgICBkbworCWV2YWwgImlmIHRlc3QgXCJcJHtzYXZlXyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCisgICAgICAgICAgICAgICAgJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKKwkgICAgICBlbHNlCisJCSRsdF91bnNldCAkbHRfdmFyCisJICAgICAgZmkiCisgICAgICBkb25lCisKKyAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgorICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorCWVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisgICAgICAkRUNITyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGV4ZWN1dGUgJiYgZnVuY19tb2RlX2V4ZWN1dGUgJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfZmluaXNoIGFyZy4uLgorZnVuY19tb2RlX2ZpbmlzaCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBsaWJzPQorICAgIGxpYmRpcnM9CisgICAgYWRtaW5jbWRzPQorCisgICAgZm9yIG9wdCBpbiAiJG5vbm9wdCIgJHsxKyIkQCJ9CisgICAgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRvcHQiOyB0aGVuCisJZnVuY19hcHBlbmQgbGliZGlycyAiICRvcHQiCisKKyAgICAgIGVsaWYgdGVzdCAtZiAiJG9wdCI7IHRoZW4KKwlpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkb3B0IjsgdGhlbgorCSAgZnVuY19hcHBlbmQgbGlicyAiICRvcHQiCisJZWxzZQorCSAgZnVuY193YXJuaW5nICJcYCRvcHQnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwlmaQorCisgICAgICBlbHNlCisJZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBhcmd1bWVudCBcYCRvcHQnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkbGlicyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRsdF9zeXNyb290IjsgdGhlbgorICAgICAgICBzeXNyb290X3JlZ2V4PWAkRUNITyAiJGx0X3N5c3Jvb3QiIHwgJFNFRCAiJHNlZF9tYWtlX2xpdGVyYWxfcmVnZXgiYAorICAgICAgICBzeXNyb290X2NtZD0icy9cKFsgJ11cKSRzeXNyb290X3JlZ2V4L1wxL2c7IgorICAgICAgZWxzZQorICAgICAgICBzeXNyb290X2NtZD0KKyAgICAgIGZpCisKKyAgICAgICMgUmVtb3ZlIHN5c3Jvb3QgcmVmZXJlbmNlcworICAgICAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisgICAgICAgICAgZWNobyAicmVtb3ZpbmcgcmVmZXJlbmNlcyB0byAkbHRfc3lzcm9vdCBhbmQgXGA9JyBwcmVmaXhlcyBmcm9tICRsaWIiCisgICAgICAgIGRvbmUKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKyAgICAgICAgZm9yIGxpYiBpbiAkbGliczsgZG8KKwkgIHNlZCAtZSAiJHtzeXNyb290X2NtZH0gcy9cKFsgJ10tW0xSXVwpPS9cMS9nOyBzL1woWyAnXVwpPS9cMS9nIiAkbGliIFwKKwkgICAgPiAkdG1wZGlyL3RtcC1sYQorCSAgbXYgLWYgJHRtcGRpci90bXAtbGEgJGxpYgorCWRvbmUKKyAgICAgICAgJHtSTX1yICIkdG1wZGlyIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZmluaXNoX2NtZHMiICdhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyciJGNtZCInIicKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZHMiIHx8IGZ1bmNfYXBwZW5kIGFkbWluY21kcyAiCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJJEVDSE8gIiAgICRsaWJkaXIiCisgICAgICBkb25lCisgICAgICBlY2hvCisgICAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKKyAgICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisJZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwllY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwllY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCWxpYmRpcj1MSUJESVIKKwlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKwkkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisJJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisJZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgICBmaQorICAgICAgZWNobworCisgICAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwlzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQorCSAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSksIGNybGUoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCIKKwkgIGVjaG8gInBhZ2VzLiIKKwkgIDs7CisJKikKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZmkKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCitmdW5jX21vZGVfaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICBjYXNlICRub25vcHQgaW4gKnNodG9vbCopIDo7OyAqKSBmYWxzZTs7IGVzYWM7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCisgICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCisgICAgICBhcmc9JDEKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSRub25vcHQKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfcHJvZyAiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGluc3RhbGxfc2hhcmVkX3Byb2c9JGluc3RhbGxfcHJvZworICAgIGNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKyAgICAgICpbXFxcIC9dY3BcICopIGluc3RhbGxfY3A9OiA7OworICAgICAgKikgaW5zdGFsbF9jcD1mYWxzZSA7OworICAgIGVzYWMKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIG5vX21vZGU9OgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgYXJnMj0KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGZpbGVzICIgJGRlc3QiCisJZGVzdD0kYXJnCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpCisJaWYgJGluc3RhbGxfY3A7IHRoZW4gOjsgZWxzZQorCSAgcHJldj0kYXJnCisJZmkKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKQorCXByZXY9JGFyZworCTs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgaWYgdGVzdCAieCRwcmV2IiA9IHgtbSAmJiB0ZXN0IC1uICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIjsgdGhlbgorCSAgICBhcmcyPSRpbnN0YWxsX292ZXJyaWRlX21vZGUKKwkgICAgbm9fbW9kZT1mYWxzZQorCSAgZmkKKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0kYXJnCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3Byb2cgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBpZiB0ZXN0IC1uICIkYXJnMiI7IHRoZW4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnMiIKKyAgICAgIGZpCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3NoYXJlZF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUKKworICAgIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIgJiYgJG5vX21vZGU7IHRoZW4KKyAgICAgIGlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIgorCWZ1bmNfYXBwZW5kIGluc3RhbGxfc2hhcmVkX3Byb2cgIiAtbSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgorICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKKyAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKKyAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCWZ1bmNfYXBwZW5kIHN0YXRpY2xpYnMgIiAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZmlsZSIKKwlmaWxlPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGN1cnJlbnRfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmdXR1cmVfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJZnVuY19hcHBlbmQgZGlyICIkb2JqZGlyIgorCisJaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KKwkgIGluc3RfcHJlZml4X2Rpcj1gJEVDSE8gIiRkZXN0ZGlyIiB8ICRTRUQgLWUgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgZWxzZQorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAorCSAgZmkKKworCSAgZnVuY193YXJuaW5nICJyZWxpbmtpbmcgXGAkZmlsZSciCisJICBmdW5jX3Nob3dfZXZhbCAiJHJlbGlua19jb21tYW5kIiBcCisJICAgICdmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnXCcnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiJworCWZpCisKKwkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lczsgc2hpZnQKKwlpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMSIKKwkgIHNoaWZ0CisKKwkgIHNyY25hbWU9IiRyZWFsbmFtZSIKKwkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKKworCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3NoYXJlZF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICAgICAgJ2V4aXQgJD8nCisJICB0c3RyaXBtZT0iJHN0cmlwbWUiCisJICBjYXNlICRob3N0X29zIGluCisJICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJICAgIGNhc2UgJHJlYWxuYW1lIGluCisJICAgICouZGxsLmEpCisJICAgICAgdHN0cmlwbWU9IiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0IC1uICIkdHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiICdleGl0ICQ/JworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIiBcCisJCSYmIGZ1bmNfc2hvd19ldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJFJNICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwlmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgJ2V4aXQgJD8nCisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBmdW5jX2FwcGVuZCBzdGF0aWNsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAkZGVzdGZpbGUgaW4KKwkqLmxvKQorCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCisJICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0CisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKKwkgIDs7CisJZXNhYworCisJIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisJdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JworCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIGZ1bmNfbG8ybyAiJGZpbGUiCisJICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCisJZmkKKwlleGl0ICRFWElUX1NVQ0NFU1MKKwk7OworCisgICAgICAqKQorCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAorCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KKwkjIGluc3RhbGwKKwlzdHJpcHBlZF9leHQ9IiIKKwljYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKKwkgICAgZmkKKwkgICAgOzsKKwllc2FjCisKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KikKKwkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICBlbHNlCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZmkKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkd3JhcHBlciI7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgdGVzdCAteiAiJGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb24iICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIgorCisJICBmaW5hbGl6ZT15ZXMKKwkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgZnVuY19zb3VyY2UgIiRsaWIiCisJICAgIGZpCisJICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkRUNITyAiJGxpYiIgfCAkU0VEICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgorCisJICBvdXRwdXRuYW1lPQorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgorCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKwkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgorCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgorCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgICAgfQorCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgICAgIGVsc2UKKwkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCisJCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKKwkJICBjb250aW51ZQorCSAgICAgICAgZmkKKwkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKKwkgICAgICBmaQorCSAgICB9CisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJEVDSE8gIiRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkU0VEICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5CisJY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCisJKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGRlc3RmaWxlIgorCSAgICBkZXN0ZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisJJG9wdF9kcnlfcnVuIHx8IGlmIHRlc3QgLW4gIiRvdXRwdXRuYW1lIjsgdGhlbgorCSAgJHtSTX1yICIkdG1wZGlyIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvbGRsaWIiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICB0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICR0b29sX29sZGxpYiIgJ2V4aXQgJD8nCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiICYmIFwKKyAgICAgIGZ1bmNfd2FybmluZyAicmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIKKworICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCisgICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgorICAgICAgJG9wdF9kcnlfcnVuICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKKyAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKKyAgICBlbHNlCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorfQorCit0ZXN0ICIkb3B0X21vZGUiID0gaW5zdGFsbCAmJiBmdW5jX21vZGVfaW5zdGFsbCAkezErIiRAIn0KKworCisjIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zIG91dHB1dG5hbWUgb3JpZ2luYXRvciBwaWNfcAorIyBFeHRyYWN0IHN5bWJvbHMgZnJvbSBkbHByZWZpbGVzIGFuZCBjcmVhdGUgJHtvdXRwdXRuYW1lfVMubyB3aXRoCisjIGEgZGxwcmVvcGVuIHN5bWJvbCB0YWJsZS4KK2Z1bmNfZ2VuZXJhdGVfZGxzeW1zICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIG15X291dHB1dG5hbWU9IiQxIgorICAgIG15X29yaWdpbmF0b3I9IiQyIgorICAgIG15X3BpY19wPSIkezMtbm99IgorICAgIG15X3ByZWZpeD1gJEVDSE8gIiRteV9vcmlnaW5hdG9yIiB8IHNlZCAncyVbXmEtekEtWjAtOV0lXyVnJ2AKKyAgICBteV9kbHN5bXM9CisKKyAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCW15X2Rsc3ltcz0iJHtteV9vdXRwdXRuYW1lfVMuYyIKKyAgICAgIGVsc2UKKwlmdW5jX2Vycm9yICJub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGxzeW1zIjsgdGhlbgorICAgICAgY2FzZSAkbXlfZGxzeW1zIGluCisgICAgICAiIikgOzsKKyAgICAgICouYykKKwkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCW5saXN0PSIkb3V0cHV0X29iamRpci8ke215X291dHB1dG5hbWV9Lm5tIgorCisJZnVuY19zaG93X2V2YWwgIiRSTSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKworCSMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCisJJG9wdF9kcnlfcnVuIHx8ICRFQ0hPID4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiAkbXlfZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG15X291dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNCkpIHx8IChfX0dOVUNfXyA+IDQpKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdzdHJpY3QtcHJvdG90eXBlc1wiCisjZW5kaWYKKworLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKworLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKKyIKKworCWlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCisJICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCisKKwkgICRvcHRfZHJ5X3J1biB8fCBlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKKworCSAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgorCSAgcHJvZ2ZpbGVzPWAkRUNITyAiJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCSAgZm9yIHByb2dmaWxlIGluICRwcm9nZmlsZXM7IGRvCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkcHJvZ2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZnVuY190b190b29sX2ZpbGVfcmVzdWx0JyIKKwkgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiROTSAkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICckRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIH0KKwkgIGZpCisKKwkgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgJFJNICRleHBvcnRfc3ltYm9scworCSAgICAgIGV2YWwgIiR7U0VEfSAtbiAtZSAnL146IEBQUk9HUkFNQCAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKyAgICAgICAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworICAgICAgICAgICAgICAgIGV2YWwgJ2NhdCAiJGV4cG9ydF9zeW1ib2xzIiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBlbHNlCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAiJHtTRUR9IC1lICdzL1woW10uWypeJF1cKS9cXFxcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCInCisJICAgICAgZXZhbCAnJEdSRVAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICBldmFsICdjYXQgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBmaQorCWZpCisKKwlmb3IgZGxwcmVmaWxlIGluICRkbHByZWZpbGVzOyBkbworCSAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRkbHByZWZpbGUnIgorCSAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZSIKKwkgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgICAgICBjYXNlICRob3N0IGluCisJICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICMgaWYgYW4gaW1wb3J0IGxpYnJhcnksIHdlIG5lZWQgdG8gb2J0YWluIGRsbmFtZQorCSAgICAgIGlmIGZ1bmNfd2luMzJfaW1wb3J0X2xpYl9wICIkZGxwcmVmaWxlIjsgdGhlbgorCSAgICAgICAgZnVuY190cl9zaCAiJGRscHJlZmlsZSIKKwkgICAgICAgIGV2YWwgImN1cnJfbGFmaWxlPVwkbGliZmlsZV8kZnVuY190cl9zaF9yZXN1bHQiCisJICAgICAgICBkbHByZWZpbGVfZGxiYXNlbmFtZT0iIgorCSAgICAgICAgaWYgdGVzdCAtbiAiJGN1cnJfbGFmaWxlIiAmJiBmdW5jX2xhbGliX3AgIiRjdXJyX2xhZmlsZSI7IHRoZW4KKwkgICAgICAgICAgIyBVc2Ugc3Vic2hlbGwsIHRvIGF2b2lkIGNsb2JiZXJpbmcgY3VycmVudCB2YXJpYWJsZSB2YWx1ZXMKKwkgICAgICAgICAgZGxwcmVmaWxlX2RsbmFtZT1gc291cmNlICIkY3Vycl9sYWZpbGUiICYmIGVjaG8gIiRkbG5hbWUiYAorCSAgICAgICAgICBpZiB0ZXN0IC1uICIkZGxwcmVmaWxlX2RsbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZV9kbG5hbWUiCisJICAgICAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgICMgbm8gbGFmaWxlLiB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIC1kbHByZW9wZW4gPGltcG9ydCBsaWJyYXJ5Pi4KKwkgICAgICAgICAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQgIiRkbHByZWZpbGUiCisJICAgICAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9JHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CisJICAgICAgICAgIGZpCisJICAgICAgICBmaQorCSAgICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA7IHRoZW4KKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkZGxwcmVmaWxlX2RsYmFzZW5hbWUiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnVuY193YXJuaW5nICJDb3VsZCBub3QgY29tcHV0ZSBETEwgbmFtZSBmcm9tICRuYW1lIgorCSAgICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZpCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwKKwkgICAgICAgICAgICAkU0VEIC1lICcvSSBfX2ltcC9kJyAtZSAncy9JIF9fbm1fL0QgLztzL19ubV9fLy8nID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGVsc2UgIyBub3QgYW4gaW1wb3J0IGxpYgorCSAgICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZnVuY190b190b29sX2ZpbGUgIiRkbHByZWZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgICB9CisJICAgICAgZmkKKwkgICAgOzsKKwkgICAgKikKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgICAgICB9CisJICAgIDs7CisgICAgICAgICAgZXNhYworCWRvbmUKKworCSRvcHRfZHJ5X3J1biB8fCB7CisJICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCisJICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgorCisJICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAkRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAorCSAgICAkTVYgIiRubGlzdCJUICIkbmxpc3QiCisJICBmaQorCisJICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorCSAgaWYgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiB8CisJICAgICAgaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCXNvcnQgLWsgMworCSAgICAgIGVsc2UKKwkJc29ydCArMgorCSAgICAgIGZpIHwKKwkgICAgICB1bmlxID4gIiRubGlzdCJTOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgJEdSRVAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUworCSAgZmkKKworCSAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyInCisJICBlbHNlCisJICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgZmkKKworCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICphZGRyZXNzOworfSBsdF9kbHN5bWxpc3Q7CitleHRlcm4gTFRfRExTWU1fQ09OU1QgbHRfZGxzeW1saXN0CitsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW107CitMVF9ETFNZTV9DT05TVCBsdF9kbHN5bWxpc3QKK2x0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorICB7IFwiJG15X29yaWdpbmF0b3JcIiwgKHZvaWQgKikgMCB9LCIKKworCSAgY2FzZSAkbmVlZF9saWJfcHJlZml4IGluCisJICBubykKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICAqKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgZXNhYworCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCX0gIyAhJG9wdF9kcnlfcnVuCisKKwlwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJKiIgLXN0YXRpYyAiKikgOzsKKwkqKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMi4qfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCIgOzsKKwkgICotKi1ocHV4KikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIiAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIlgkbXlfcGljX3AiICE9IFhubzsgdGhlbgorCSAgICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXN5bXRhYl9jZmxhZ3M9CisJZm9yIGFyZyBpbiAkTFRDRkxBR1M7IGRvCisJICBjYXNlICRhcmcgaW4KKwkgIC1waWUgfCAtZnBpZSB8IC1mUElFKSA7OworCSAgKikgZnVuY19hcHBlbmQgc3ltdGFiX2NmbGFncyAiICRhcmciIDs7CisJICBlc2FjCisJZG9uZQorCisJIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKwlmdW5jX3Nob3dfZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDJHN5bXRhYl9jZmxhZ3MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJG15X2Rsc3ltcyIpJyAnZXhpdCAkPycKKworCSMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIicKKworCSMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCisJc3ltZmlsZW9iaj0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfVMuJG9iamV4dCIKKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYiOyB0aGVuCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpCisJICA7OworCSopCisJICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWZ1bmNfZmF0YWxfZXJyb3IgInVua25vd24gc3VmZml4IGZvciBcYCRteV9kbHN5bXMnIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKyAgICAgICMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKyAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKworICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICBmaQorfQorCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorIyBEZXNwaXRlIHRoZSBuYW1lLCBhbHNvIGRlYWwgd2l0aCA2NCBiaXQgYmluYXJpZXMuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgICRvcHRfZGVidWcKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgICMgS2VlcCB0aGUgZWdyZXAgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ELgorICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKKyAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIHwKKwkkU0VEIC1uIC1lICcKKwkgICAgMSwxMDB7CisJCS8gSSAveworCQkgICAgcywuKixpbXBvcnQsCisJCSAgICBwCisJCSAgICBxCisJCX0KKwkgICAgfSdgCisgICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgorICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OworICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKkRMTCopCisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICA7OworICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KKyAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQorICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIiR3aW4zMl9saWJpZF90eXBlIgorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYiBBUkcKKyMKKyMgUGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKKyMgbmFtZSBvZiB0aGUgRExMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisjIGltcG9ydCBsaWJyYXJ5IEFSRy4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gJERMTFRPT0wgLS1pZGVudGlmeS1zdHJpY3QgLS1pZGVudGlmeSAiJDEiYAorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlIFNFQ1RJT05fTkFNRSBMSUJOQU1FcworIworIyBUaGUgaXMgdGhlIGNvcmUgb2YgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBhCisjIHBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlCisjIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeSBMSUJOQU1FLgorIworIyBTRUNUSU9OX05BTUUgaXMgZWl0aGVyIC5pZGF0YSQ2IG9yIC5pZGF0YSQ3LCBkZXBlbmRpbmcKKyMgb24gdGhlIHBsYXRmb3JtIGFuZCBjb21waWxlciB0aGF0IGNyZWF0ZWQgdGhlIGltcGxpYi4KKyMKKyMgRWNob3MgdGhlIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlCisjIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeS4KK2Z1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICgpCit7CisgICRvcHRfZGVidWcKKyAgbWF0Y2hfbGl0ZXJhbD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgJE9CSkRVTVAgLXMgLS1zZWN0aW9uICIkMSIgIiQyIiAyPi9kZXYvbnVsbCB8CisgICAgJFNFRCAnL15Db250ZW50cyBvZiBzZWN0aW9uICciJG1hdGNoX2xpdGVyYWwiJzoveworICAgICAgIyBQbGFjZSBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIGFyY2hpdmUgbWVtYmVyIGRsbG5hbWUgc2VjdGlvbgorICAgICAgcy8uKi89PT09TUFSSz09PT0vCisgICAgICBwCisgICAgICBkCisgICAgfQorICAgICMgVGhlc2UgbGluZXMgY2FuIHNvbWV0aW1lcyBiZSBsb25nZXIgdGhhbiA0MyBjaGFyYWN0ZXJzLCBidXQKKyAgICAjIGFyZSBhbHdheXMgdW5pbnRlcmVzdGluZworICAgIC86WwkgXSpmaWxlIGZvcm1hdCBwZVtpXVx7LDFcfS0vZAorICAgIC9eSW4gYXJjaGl2ZSBbXjpdKjovZAorICAgICMgRW5zdXJlIG1hcmtlciBpcyBwcmludGVkCisgICAgL149PT09TUFSSz09PT0vcAorICAgICMgUmVtb3ZlIGFsbCBsaW5lcyB3aXRoIGxlc3MgdGhhbiA0MyBjaGFyYWN0ZXJzCisgICAgL14uXHs0M1x9LyFkCisgICAgIyBGcm9tIHJlbWFpbmluZyBsaW5lcywgcmVtb3ZlIGZpcnN0IDQzIGNoYXJhY3RlcnMKKyAgICBzL14uXHs0M1x9Ly8nIHwKKyAgICAkU0VEIC1uICcKKyAgICAgICMgSm9pbiBtYXJrZXIgYW5kIGFsbCBsaW5lcyB1bnRpbCBuZXh0IG1hcmtlciBpbnRvIGEgc2luZ2xlIGxpbmUKKyAgICAgIC9ePT09PU1BUks9PT09LyBiIHBhcmEKKyAgICAgIEgKKyAgICAgICQgYiBwYXJhCisgICAgICBiCisgICAgICA6cGFyYQorICAgICAgeAorICAgICAgcy9cbi8vZworICAgICAgIyBSZW1vdmUgdGhlIG1hcmtlcgorICAgICAgcy9ePT09PU1BUks9PT09Ly8KKyAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIGRvdHMgYW5kIHdoaXRlc3BhY2UKKyAgICAgIHMvW1wuIFx0XSokLy8KKyAgICAgICMgUHJpbnQKKyAgICAgIC8uL3AnIHwKKyAgICAjIHdlIG5vdyBoYXZlIGEgbGlzdCwgb25lIGVudHJ5IHBlciBsaW5lLCBvZiB0aGUgc3RyaW5naWZpZWQKKyAgICAjIGNvbnRlbnRzIG9mIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGFsbCBtZW1iZXJzIG9mIHRoZQorICAgICMgYXJjaGl2ZSB3aGljaCBwb3NzZXNzIHRoYXQgc2VjdGlvbi4gSGV1cmlzdGljOiBlbGltaW5hdGUKKyAgICAjIGFsbCB0aG9zZSB3aGljaCBoYXZlIGEgZmlyc3Qgb3Igc2Vjb25kIGNoYXJhY3RlciB0aGF0IGlzCisgICAgIyBhICcuJyAodGhhdCBpcywgb2JqZHVtcCdzIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVucHJpbnRhYmxlCisgICAgIyBjaGFyYWN0ZXIuKSBUaGlzIHNob3VsZCB3b3JrIGZvciBhbGwgYXJjaGl2ZXMgd2l0aCBsZXNzIHRoYW4KKyAgICAjIDB4MzAyZiBleHBvcnRzIC0tIGJ1dCB3aWxsIGZhaWwgZm9yIERMTHMgd2hvc2UgbmFtZSBhY3R1YWxseQorICAgICMgYmVnaW5zIHdpdGggYSBsaXRlcmFsICcuJyBvciBhIHNpbmdsZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkKKyAgICAjIGEgJy4nLgorICAgICMKKyAgICAjIE9mIHRob3NlIHRoYXQgcmVtYWluLCBwcmludCB0aGUgZmlyc3Qgb25lLgorICAgICRTRUQgLWUgJy9eXC4vZDsvXi5cLi9kO3EnCit9CisKKyMgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYSBHTlUvYmludXRpbHMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcD1gJE5NICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiB8IGV2YWwgIiRnbG9iYWxfc3ltYm9sX3BpcGUiIHwgJEVHUkVQICcgKF9oZWFkX1tBLVphLXowLTlfXStfW2FkXWwqfFtBLVphLXowLTlfXStfW2FkXWwqX2luYW1lKSQnYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfdG1wIgorfQorCisjIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYW4gTVMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRHUkVQICdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUidgCisgIHRlc3QgLW4gIiRmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgQVJHCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjCisjIFRoaXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMgZm9yIHVzZSB3aGVuICRETExUT09MCisjIGRvZXMgbm90IHN1cHBvcnQgdGhlIC0taWRlbnRpZnktc3RyaWN0IG9wdGlvbi4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBiaW51dGlscyBpbXBvcnQgbGlicmFyeQorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PWBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAnLmlkYXRhJDcnICIkMSJgCisgIGVsaWYgZnVuY19jeWdtaW5nX21zX2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBtcy1nZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ2JyAiJDEiYAorICBlbHNlCisgICAgIyB1bmtub3duCisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9IiIKKyAgZmkKK30KKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICBsb2NrZmlsZT0kZl9leF9hbl9hcl9vbGRsaWIubG9jaworICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGZpCisgICAgZnVuY19zaG93X2V2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwiXCRmX2V4X2FuX2FyX29sZGxpYlwiKSIgXAorCQkgICAnc3RhdD0kPzsgcm0gLWYgIiRsb2NrZmlsZSI7IGV4aXQgJHN0YXQnCisgICAgaWYgdGVzdCAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgPSB5ZXM7IHRoZW4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCBybSAtZiAiJGxvY2tmaWxlIgorICAgIGZpCisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9iamVjdCBuYW1lIGNvbmZsaWN0cyBpbiBhcmNoaXZlOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIgorICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KK2Z1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBmdW5jX2Jhc2VuYW1lICIkbXlfeGxpYiIKKyAgICAgIG15X3hsaWI9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIG15X3hsaWJfdT0kbXlfeGxpYgorICAgICAgd2hpbGUgOjsgZG8KKyAgICAgICAgY2FzZSAiICRleHRyYWN0ZWRfYXJjaGl2ZXMgIiBpbgorCSoiICRteV94bGliX3UgIiopCisJICBmdW5jX2FyaXRoICRleHRyYWN0ZWRfc2VyaWFsICsgMQorCSAgZXh0cmFjdGVkX3NlcmlhbD0kZnVuY19hcml0aF9yZXN1bHQKKwkgIG15X3hsaWJfdT1sdCRleHRyYWN0ZWRfc2VyaWFsLSRteV94bGliIDs7CisJKikgYnJlYWsgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBleHRyYWN0ZWRfYXJjaGl2ZXM9IiRleHRyYWN0ZWRfYXJjaGl2ZXMgJG15X3hsaWJfdSIKKyAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWJfdSIKKworICAgICAgZnVuY19ta2Rpcl9wICIkbXlfeGRpciIKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi1kYXJ3aW4qKQorCWZ1bmNfdmVyYm9zZSAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gYmFzZW5hbWUgIiRkYXJ3aW5fYXJjaGl2ZSJgCisJICBkYXJ3aW5fYXJjaGVzPWAkTElQTyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGwgfHwgdHJ1ZWAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbgorCSAgICBkYXJ3aW5fYXJjaGVzPWAkRUNITyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICBmdW5jX3ZlcmJvc2UgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgorCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KKwkgICAgICBmdW5jX21rZGlyX3AgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgJExJUE8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRSTSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICAgICAgICMjIE9rYXkgbm93IHdlJ3ZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQorCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkU0VEIC1lICIkYmFzZW5hbWUiIHwgc29ydCAtdWAKKwkgICAgZGFyd2luX2ZpbGU9CisJICAgIGRhcndpbl9maWxlcz0KKwkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCisJICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICRSTSAtcmYgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKKwkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJfSAjICEkb3B0X2RyeV9ydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorICAgIGRvbmUKKworICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgorfQorCisKKyMgZnVuY19lbWl0X3dyYXBwZXIgW2FyZz1ub10KKyMKKyMgRW1pdCBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBEb24ndCBkaXJlY3RseSBvcGVuIGEgZmlsZSBiZWNhdXNlIHdlIG1heSB3YW50IHRvCisjIGluY29ycG9yYXRlIHRoZSBzY3JpcHQgY29udGVudHMgd2l0aGluIGEgY3lnd2luL21pbmd3CisjIHdyYXBwZXIgZXhlY3V0YWJsZS4gIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4KKyMgZnVuY19tb2RlX2xpbmsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlcworIyBzZXQgdGhlcmVpbi4KKyMKKyMgQVJHIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUgorIyB2YXJpYWJsZSB3aWxsIHRha2UuICBJZiAneWVzJywgdGhlbiB0aGUgZW1pdHRlZCBzY3JpcHQKKyMgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIHN0b3JlZCBpcworIyB0aGUgJG9iamRpciBkaXJlY3RvcnkuICBUaGlzIGlzIGEgY3lnd2luL21pbmd3LXNwZWNpZmljCisjIGJlaGF2aW9yLgorZnVuY19lbWl0X3dyYXBwZXIgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPSR7MS1ub30KKworCSRFQ0hPICJcCisjISAkU0hFTEwKKworIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uPSckbWFjcm9fdmVyc2lvbicKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBmaWxlPVwiXCQwXCIiCisKKyAgICBxRUNITz1gJEVDSE8gIiRFQ0hPIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICRFQ0hPICJcCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCQxCitfTFRFQ0hPX0VPRicKK30KKyAgICBFQ0hPPVwiJHFFQ0hPXCIKKyAgZmkKKworIyBWZXJ5IGJhc2ljIG9wdGlvbiBwYXJzaW5nLiBUaGVzZSBvcHRpb25zIGFyZSAoYSkgc3BlY2lmaWMgdG8KKyMgdGhlIGxpYnRvb2wgd3JhcHBlciwgKGIpIGFyZSBpZGVudGljYWwgYmV0d2VlbiB0aGUgd3JhcHBlcgorIyAvc2NyaXB0LyBhbmQgdGhlIHdyYXBwZXIgL2V4ZWN1dGFibGUvIHdoaWNoIGlzIHVzZWQgb25seSBvbgorIyB3aW5kb3dzIHBsYXRmb3JtcywgYW5kIChjKSBhbGwgYmVnaW4gd2l0aCB0aGUgc3RyaW5nICItLWx0LSIKKyMgKGFwcGxpY2F0aW9uIHByb2dyYW1zIGFyZSB1bmxpa2VseSB0byBoYXZlIG9wdGlvbnMgd2hpY2ggbWF0Y2gKKyMgdGhpcyBwYXR0ZXJuKS4KKyMKKyMgVGhlcmUgYXJlIG9ubHkgdHdvIHN1cHBvcnRlZCBvcHRpb25zOiAtLWx0LWRlYnVnIGFuZAorIyAtLWx0LWR1bXAtc2NyaXB0LiBUaGVyZSBpcywgZGVsaWJlcmF0ZWx5LCBubyAtLWx0LWhlbHAuCisjCisjIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGlzIHBhcnNpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIHRoZQorIyBzY3JpcHQncyAkMCB2YWx1ZSwgZm9sbG93ZWQgYnkgIiRAIi4KK2x0X29wdGlvbl9kZWJ1Zz0KK2Z1bmNfcGFyc2VfbHRfb3B0aW9ucyAoKQoreworICBsdF9zY3JpcHRfYXJnMD1cJDAKKyAgc2hpZnQKKyAgZm9yIGx0X29wdAorICBkbworICAgIGNhc2UgXCJcJGx0X29wdFwiIGluCisgICAgLS1sdC1kZWJ1ZykgbHRfb3B0aW9uX2RlYnVnPTEgOzsKKyAgICAtLWx0LWR1bXAtc2NyaXB0KQorICAgICAgICBsdF9kdW1wX0Q9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyUvW14vXSokJSUnXGAKKyAgICAgICAgdGVzdCBcIlhcJGx0X2R1bXBfRFwiID0gXCJYXCRsdF9zY3JpcHRfYXJnMFwiICYmIGx0X2R1bXBfRD0uCisgICAgICAgIGx0X2R1bXBfRj1cYFwkRUNITyBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgfCAkU0VEIC1lICdzL15YLy8nIC1lICdzJV4uKi8lJSdcYAorICAgICAgICBjYXQgXCJcJGx0X2R1bXBfRC9cJGx0X2R1bXBfRlwiCisgICAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtLWx0LSopCisgICAgICAgIFwkRUNITyBcIlVucmVjb2duaXplZCAtLWx0LSBvcHRpb246ICdcJGx0X29wdCdcIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFByaW50IHRoZSBkZWJ1ZyBiYW5uZXIgaW1tZWRpYXRlbHk6CisgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgZWNobyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IGxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cIiAxPiYyCisgIGZpCit9CisKKyMgVXNlZCB3aGVuIC0tbHQtZGVidWcuIFByaW50cyBpdHMgYXJndW1lbnRzIHRvIHN0ZG91dAorIyAocmVkaXJlY3Rpb24gaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIpCitmdW5jX2x0X2R1bXBfYXJncyAoKQoreworICBsdF9kdW1wX2FyZ3NfTj0xOworICBmb3IgbHRfYXJnCisgIGRvCisgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndltcJGx0X2R1bXBfYXJnc19OXTogXCRsdF9hcmdcIgorICAgIGx0X2R1bXBfYXJnc19OPVxgZXhwciBcJGx0X2R1bXBfYXJnc19OICsgMVxgCisgIGRvbmUKK30KKworIyBDb3JlIGZ1bmN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIHRhcmdldCBhcHBsaWNhdGlvbgorZnVuY19leGVjX3Byb2dyYW1fY29yZSAoKQoreworIgorICBjYXNlICRob3N0IGluCisgICMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cworICAqLSotbWluZ3cgfCAqLSotb3MyKiB8ICotY2VnY2MqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworCisgICopCisgICAgJEVDSE8gIlwKKyAgICAgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbMF06IFwkcHJvZ2Rpci9cJHByb2dyYW1cIiAxPiYyCisgICAgICAgIGZ1bmNfbHRfZHVtcF9hcmdzIFwkezErXCJcJEBcIn0gMT4mMgorICAgICAgZmkKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIlwKKyAgICAgIFwkRUNITyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiIDE+JjIKKyAgICAgIGV4aXQgMQorfQorCisjIEEgZnVuY3Rpb24gdG8gZW5jYXBzdWxhdGUgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KKyMgU3RyaXBzIG9wdGlvbnMgaW4gdGhlIC0tbHQtKiBuYW1lc3BhY2UgZnJvbSBcJEAgYW5kCisjIGxhdW5jaGVzIHRhcmdldCBhcHBsaWNhdGlvbiB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgorZnVuY19leGVjX3Byb2dyYW0gKCkKK3sKKyAgY2FzZSBcIiBcJCogXCIgaW4KKyAgKlxcIC0tbHQtKikKKyAgICBmb3IgbHRfd3JfYXJnCisgICAgZG8KKyAgICAgIGNhc2UgXCRsdF93cl9hcmcgaW4KKyAgICAgIC0tbHQtKikgOzsKKyAgICAgICopIHNldCB4IFwiXCRAXCIgXCJcJGx0X3dyX2FyZ1wiOyBzaGlmdDs7CisgICAgICBlc2FjCisgICAgICBzaGlmdAorICAgIGRvbmUgOzsKKyAgZXNhYworICBmdW5jX2V4ZWNfcHJvZ3JhbV9jb3JlIFwkezErXCJcJEBcIn0KK30KKworICAjIFBhcnNlIG9wdGlvbnMKKyAgZnVuY19wYXJzZV9sdF9vcHRpb25zIFwiXCQwXCIgXCR7MStcIlwkQFwifQorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisKKyAgIyBVc3VhbGx5ICdubycsIGV4Y2VwdCBvbiBjeWd3aW4vbWluZ3cgd2hlbiBlbWJlZGRlZCBpbnRvCisgICMgdGhlIGN3cmFwcGVyLgorICBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUj0kZnVuY19lbWl0X3dyYXBwZXJfYXJnMQorICBpZiB0ZXN0IFwiXCRXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUlwiID0gXCJ5ZXNcIjsgdGhlbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciAnLicKKyAgICBpZiB0ZXN0IFwiXCR0aGlzZGlyXCIgPSBcIi5cIjsgdGhlbgorICAgICAgdGhpc2Rpcj1cYHB3ZFxgCisgICAgZmkKKyAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKKyAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiXCR0aGlzZGlyXCIgfCAkU0VEICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICRFQ0hPICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRNS0RJUiBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRFQ0hPICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRFQ0hPIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJFJNIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRFQ0hPICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwkkRUNITyAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgorCSMKKwkjIEZpeCB0aGUgRExMIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4gIERvIHRoaXMgYmVmb3JlIHByZXBlbmRpbmcKKwkjIHRvIHNobGlicGF0aCwgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoIGFyZSBQQVRIIGFuZCB1bmluc3RhbGxlZAorCSMgbGlicmFyaWVzIG11c3QgY29tZSBmaXJzdC4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRFQ0hPICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkRUNITyBcIlwkJHNobGlicGF0aF92YXJcIiB8ICRTRUQgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSRFQ0hPICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyAgICAgIGZ1bmNfZXhlY19wcm9ncmFtIFwkezErXCJcJEBcIn0KKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkRUNITyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJEVDSE8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICBcJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCit9CisKKworIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKKyMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCisjIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCitmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCit7CisJY2F0IDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0IDw8IkVPRiIKKyNpZmRlZiBfTVNDX1ZFUgorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPHByb2Nlc3MuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaWZkZWYgX19DWUdXSU5fXworIyAgaW5jbHVkZSA8aW8uaD4KKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8qIGRlY2xhcmF0aW9ucyBvZiBub24tQU5TSSBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2ludCBfcHV0ZW52IChjb25zdCBjaGFyICopOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2NoYXIgKnJlYWxwYXRoIChjb25zdCBjaGFyICosIGNoYXIgKik7CitpbnQgcHV0ZW52IChjaGFyICopOworaW50IHNldGVudiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjIGVuZGlmCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKy8qIHBvcnRhYmlsaXR5IGRlZmluZXMsIGV4Y2x1ZGluZyBwYXRoIGhhbmRsaW5nIG1hY3JvcyAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyMgZGVmaW5lIFNfSVhVU1IgX1NfSUVYRUMKKyMgaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyMgIGRlZmluZSBpbnRwdHJfdCBpbnQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIEhBVkVfU0VURU5WCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCisjZWxzZQorIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBTX0lYT1RICisjIGRlZmluZSBTX0lYT1RIIDAKKyNlbmRpZgorI2lmbmRlZiBTX0lYR1JQCisjIGRlZmluZSBTX0lYR1JQIDAKKyNlbmRpZgorCisvKiBwYXRoIGhhbmRsaW5nIHBvcnRhYmlsaXR5IG1hY3JvcyAqLworI2lmbmRlZiBESVJfU0VQQVJBVE9SCisjIGRlZmluZSBESVJfU0VQQVJBVE9SICcvJworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKKyAgZGVmaW5lZCAoX19PUzJfXykKKyMgZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisjIGlmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJworIyBlbmRpZgorIyBpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SXzIgJzsnCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCisjZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKKwkoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgRk9QRU5fV0IKKyMgZGVmaW5lIEZPUEVOX1dCICJ3IgorI2VuZGlmCisjaWZuZGVmIF9PX0JJTkFSWQorIyBkZWZpbmUgX09fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKExUX0RFQlVHV1JBUFBFUikKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAwOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9ICJsaWJ0b29sLXdyYXBwZXIiOyAvKiBpbiBjYXNlIHhzdHJkdXAgZmFpbHMgKi8KKwordm9pZCAqeG1hbGxvYyAoc2l6ZV90IG51bSk7CitjaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOworY29uc3QgY2hhciAqYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKK2NoYXIgKmZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqd3JhcHBlcik7CitjaGFyICpjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpOworaW50IG1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitjaGFyICpzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK3ZvaWQgbHRfZGVidWdwcmludGYgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25udWxsIChjb25zdCBjaGFyICpzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25lbXB0eSAoY29uc3QgY2hhciAqcyk7Cit2b2lkIGx0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKTsKK3ZvaWQgbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Cit2b2lkIGx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqKnByZXBhcmVfc3Bhd24gKGNoYXIgKiphcmd2KTsKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUgKmYpOworRU9GCisKKwkgICAgY2F0IDw8RU9GCit2b2xhdGlsZSBjb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBUk5BTUUgPSAiJHNobGlicGF0aF92YXIiOworRU9GCisKKwkgICAgaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aCAiJHRlbXBfcnBhdGgiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IjsKK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8IkVPRiIKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRkbGxzZWFyY2hwYXRoOiIKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIlBBVEgiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICIiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICJsdC0kb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gIiRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCitFT0YKKwkgICAgZmkKKworCisJICAgIGNhdCA8PCJFT0YiCisKKyNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVggICAgICAgICAiLS1sdC0iCisKK3N0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOworc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBzY3JpcHRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImR1bXAtc2NyaXB0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19vcHQgICAgICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkZWJ1ZyI7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiB2ZXJ5IHNpbXBsZSBhcmcgcGFyc2luZzsgZG9uJ3Qgd2FudCB0byByZWx5IG9uIGdldG9wdAorICAgKiBhbHNvLCBjb3B5IGFsbCBub24gY3dyYXBwZXIgb3B0aW9ucyB0byBuZXdhcmd6LCBleGNlcHQKKyAgICogYXJnelswXSwgd2hpY2ggaXMgaGFuZGxlZCBkaWZmZXJlbnRseQorICAgKi8KKyAgbmV3YXJnYz0wOworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGR1bXBzY3JpcHRfb3B0KSA9PSAwKQorCXsKK0VPRgorCSAgICBjYXNlICIkaG9zdCIgaW4KKwkgICAgICAqbWluZ3cqIHwgKmN5Z3dpbiogKQorCQkjIG1ha2Ugc3Rkb3V0IHVzZSAidW5peCIgbGluZSBlbmRpbmdzCisJCWVjaG8gIiAgICAgICAgICBzZXRtb2RlKDEsX09fQklOQVJZKTsiCisJCTs7CisJICAgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisJICBsdF9kdW1wX3NjcmlwdCAoc3Rkb3V0KTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGRlYnVnX29wdCkgPT0gMCkKKwl7CisgICAgICAgICAgbHRfZGVidWcgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJ1bnJlY29nbml6ZWQgJXMgb3B0aW9uOiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgICAvKiBvdGhlcndpc2UgLi4uICovCisgICAgICBuZXdhcmd6WysrbmV3YXJnY10gPSB4c3RyZHVwIChhcmd2W2ldKTsKKyAgICB9CisgIG5ld2FyZ3pbKytuZXdhcmdjXSA9IE5VTEw7CisKK0VPRgorCSAgICBjYXQgPDxFT0YKKyAgLyogVGhlIEdOVSBiYW5uZXIgbXVzdCBiZSB0aGUgZmlyc3Qgbm9uLWVycm9yIGRlYnVnIG1lc3NhZ2UgKi8KKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgImxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cbiIpOworRU9GCisJICAgIGNhdCA8PCJFT0YiCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgYXJndlswXTogJXNcbiIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIHByb2dyYW1fbmFtZTogJXNcbiIsIHByb2dyYW1fbmFtZSk7CisKKyAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJjb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICB0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYWZ0ZXIgc3ltbGluayBjaGFzZSkgYXQ6ICVzXG4iLAorCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX3BhdGgsIGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKworICAvKiB3cmFwcGVyIG5hbWUgdHJhbnNmb3JtcyAqLworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgLyogdGFyZ2V0X25hbWUgdHJhbnNmb3JtcyAtLSB1c2UgYWN0dWFsIHRhcmdldCBwcm9ncmFtIG5hbWU7IG1pZ2h0IGhhdmUgbHQtIHByZWZpeCAqLworICB0YXJnZXRfbmFtZSA9IHhzdHJkdXAgKGJhc2VfbmFtZSAoVEFSR0VUX1BST0dSQU1fTkFNRSkpOworICBzdHJlbmR6YXAgKHRhcmdldF9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyICh0YXJnZXRfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKHRhcmdldF9uYW1lKTsKKyAgdGFyZ2V0X25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAorCQkgIHRhcmdldF9uYW1lKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgorICBuZXdhcmd6WzBdID0KKyAgICBYTUFMTE9DIChjaGFyLCAoc3RybGVuIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkgKworCQkgICAgc3RybGVuICgiJG9iamRpciIpICsgMSArIHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX25hbWUpICsgMSkpOworICBzdHJjcHkgKG5ld2FyZ3pbMF0sIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiJG9iamRpciIpOworICBzdHJjYXQgKG5ld2FyZ3pbMF0sICIvIik7CitFT0YKKworCSAgICBjYXQgPDwiRU9GIgorICAvKiBzdG9wIGhlcmUsIGFuZCBjb3B5IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyB0d2ljZSAqLworICB0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChuZXdhcmd6WzBdKTsKKworICAvKiBkbyBOT1Qgd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlLCBzbyB1c2UgYWN0dWFsX2N3cmFwcGVyX25hbWUgKi8KKyAgc3RyY2F0IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogRE8gd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlIGlmIGl0IGV4aXN0cywgc28gdXNlIHRhcmdldF9uYW1lICovCisgIGx0X2FyZ3ZfemVybyA9IGx0X2V4dGVuZF9zdHIgKHRtcF9wYXRoc3BlYywgdGFyZ2V0X25hbWUsIDEpOworICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKKyAgdG1wX3BhdGhzcGVjID0gTlVMTDsKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJICAgIGNhdCA8PCJFT0YiCisgIHsKKyAgICBjaGFyKiBwOworICAgIHdoaWxlICgocCA9IHN0cmNociAobmV3YXJnelswXSwgJ1xcJykpICE9IE5VTEwpCisgICAgICB7CisJKnAgPSAnLyc7CisgICAgICB9CisgICAgd2hpbGUgKChwID0gc3RyY2hyIChsdF9hcmd2X3plcm8sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICB9CitFT0YKKwkgICAgOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgbHRfc2V0ZW52ICgiQklOX1NIIiwgInhwZzQiKTsgLyogZm9yIFRydTY0ICovCisgIGx0X3NldGVudiAoIkRVQUxDQVNFIiwgIjEiKTsgIC8qIGZvciBNU0sgc2ggKi8KKyAgLyogVXBkYXRlIHRoZSBETEwgc2VhcmNocGF0aC4gIEVYRV9QQVRIX1ZBTFVFICgkZGxsc2VhcmNocGF0aCkgbXVzdAorICAgICBiZSBwcmVwZW5kZWQgYmVmb3JlICh0aGF0IGlzLCBhcHBlYXIgYWZ0ZXIpIExJQl9QQVRIX1ZBTFVFICgkdGVtcF9ycGF0aCkKKyAgICAgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoICpfVkFSTkFNRXMgYXJlIFBBVEggYnV0IHVuaW5zdGFsbGVkCisgICAgIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuICovCisgIGx0X3VwZGF0ZV9leGVfcGF0aCAoRVhFX1BBVEhfVkFSTkFNRSwgRVhFX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfbGliX3BhdGggKExJQl9QQVRIX1ZBUk5BTUUsIExJQl9QQVRIX1ZBTFVFKTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGx0X2FyZ3ZfemVybzogJXNcbiIsCisJCSAgbm9ubnVsbCAobHRfYXJndl96ZXJvKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBuZXdhcmd6WyVkXTogJXNcbiIsCisJCSAgICAgIGksIG5vbm51bGwgKG5ld2FyZ3pbaV0pKTsKKyAgICB9CisKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisgIC8qIGV4ZWN2IGRvZXNuJ3QgYWN0dWFsbHkgd29yayBvbiBtaW5ndyBhcyBleHBlY3RlZCBvbiB1bml4ICovCisgIG5ld2FyZ3ogPSBwcmVwYXJlX3NwYXduIChuZXdhcmd6KTsKKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiAlc1xuIiwKKwkJICAgICAgbHRfYXJndl96ZXJvLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgIm1lbW9yeSBleGhhdXN0ZWQiKTsKKworICByZXR1cm4gcDsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLAorCQkJICBzdHJpbmcpIDogTlVMTDsKK30KKworY29uc3QgY2hhciAqCitiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmJhc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgLyogU2tpcCBvdmVyIHRoZSBkaXNrIG5hbWUgaW4gTVNET1MgcGF0aG5hbWVzLiAqLworICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQorICAgIG5hbWUgKz0gMjsKKyNlbmRpZgorCisgIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKKyAgICAgIGJhc2UgPSBuYW1lICsgMTsKKyAgcmV0dXJuIGJhc2U7Cit9CisKK2ludAorY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihjaGVja19leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFrZV9leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKGZpbmRfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHdyYXBwZXIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCQkgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisJCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKwkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHAsIHBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVtwX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHBfbGVuICsgMSwgd3JhcHBlcik7CisJCX0KKwkgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCQlyZXR1cm4gY29uY2F0X25hbWU7CisJICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIG5vdCBmb3VuZCBpbiBQQVRIOyBhc3N1bWUgY3VyZGlyICovCisgICAgfQorICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCisgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICAgImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCSAgICAgIHRtcF9wYXRoc3BlYyk7CisgICAgICBpZiAobHN0YXQgKHRtcF9wYXRoc3BlYywgJnMpID09IDApCisJeworCSAgaWYgKFNfSVNMTksgKHMuc3RfbW9kZSkgIT0gMCkKKwkgICAgeworCSAgICAgIGhhc19zeW1saW5rcyA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgbGFzdCBESVJfU0VQQVJBVE9SICovCisJICBwID0gdG1wX3BhdGhzcGVjICsgc3RybGVuICh0bXBfcGF0aHNwZWMpIC0gMTsKKwkgIHdoaWxlICgocCA+IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICBwLS07CisJICBpZiAoKHAgPT0gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHsKKwkgICAgICAvKiBubyBtb3JlIERJUl9TRVBBUkFUT1JTIGxlZnQgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKnAgPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgImVycm9yIGFjY2Vzc2luZyBmaWxlIFwiJXNcIjogJXMiLAorCQkgICAgdG1wX3BhdGhzcGVjLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJImNvdWxkIG5vdCBmb2xsb3cgc3ltbGlua3MgZm9yICVzIiwgcGF0aHNwZWMpOworICAgIH0KKyAgcmV0dXJuIHhzdHJkdXAgKHRtcF9wYXRoc3BlYyk7CisjZW5kaWYKK30KKworY2hhciAqCitzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KQoreworICBzaXplX3QgbGVuLCBwYXRsZW47CisKKyAgYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisgIGFzc2VydCAocGF0ICE9IE5VTEwpOworCisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKyAgcGF0bGVuID0gc3RybGVuIChwYXQpOworCisgIGlmIChwYXRsZW4gPD0gbGVuKQorICAgIHsKKyAgICAgIHN0ciArPSBsZW4gLSBwYXRsZW47CisgICAgICBpZiAoc3RyY21wIChzdHIsIHBhdCkgPT0gMCkKKwkqc3RyID0gJ1wwJzsKKyAgICB9CisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQKK2x0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaWYgKGx0X2RlYnVnKQorICAgIHsKKyAgICAgICh2b2lkKSBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lKTsKKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2x0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqZmlsZSwKKwkgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1vZGUsCisJICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZhX2xpc3QgYXApCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiVkOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lLCBtb2RlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOworICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKKworICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKKyAgICBleGl0IChleGl0X3N0YXR1cyk7Cit9CisKK3ZvaWQKK2x0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsIGZpbGUsIGxpbmUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiBzID8gcyA6ICIobnVsbCkiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25lbXB0eSAoY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIChzICYmICEqcykgPyAiKGVtcHR5KSIgOiBub25udWxsIChzKTsKK30KKwordm9pZAorbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKyAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgLyogYWx3YXlzIG1ha2UgYSBjb3B5LCBmb3IgY29uc2lzdGVuY3kgd2l0aCAhSEFWRV9TRVRFTlYgKi8KKyAgICBjaGFyICpzdHIgPSB4c3RyZHVwICh2YWx1ZSk7CisgICAgc2V0ZW52IChuYW1lLCBzdHIsIDEpOworI2Vsc2UKKyAgICBpbnQgbGVuID0gc3RybGVuIChuYW1lKSArIDEgKyBzdHJsZW4gKHZhbHVlKSArIDE7CisgICAgY2hhciAqc3RyID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgICBzcHJpbnRmIChzdHIsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAocHV0ZW52IChzdHIpICE9IEVYSVRfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgWEZSRUUgKHN0cik7CisgICAgICB9CisjZW5kaWYKKyAgfQorfQorCitjaGFyICoKK2x0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCkKK3sKKyAgY2hhciAqbmV3X3ZhbHVlOworICBpZiAob3JpZ192YWx1ZSAmJiAqb3JpZ192YWx1ZSkKKyAgICB7CisgICAgICBpbnQgb3JpZ192YWx1ZV9sZW4gPSBzdHJsZW4gKG9yaWdfdmFsdWUpOworICAgICAgaW50IGFkZF9sZW4gPSBzdHJsZW4gKGFkZCk7CisgICAgICBuZXdfdmFsdWUgPSBYTUFMTE9DIChjaGFyLCBhZGRfbGVuICsgb3JpZ192YWx1ZV9sZW4gKyAxKTsKKyAgICAgIGlmICh0b19lbmQpCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgb3JpZ192YWx1ZSk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBvcmlnX3ZhbHVlX2xlbiwgYWRkKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIGFkZCk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBhZGRfbGVuLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld192YWx1ZSA9IHhzdHJkdXAgKGFkZCk7CisgICAgfQorICByZXR1cm4gbmV3X3ZhbHVlOworfQorCit2b2lkCitsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9saWJfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKworRU9GCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisKKy8qIFByZXBhcmVzIGFuIGFyZ3VtZW50IHZlY3RvciBiZWZvcmUgY2FsbGluZyBzcGF3bigpLgorICAgTm90ZSB0aGF0IHNwYXduKCkgZG9lcyBub3QgYnkgaXRzZWxmIGNhbGwgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIKKyAgICAgKGdldGVudiAoIkNPTVNQRUMiKSAhPSBOVUxMID8gZ2V0ZW52ICgiQ09NU1BFQyIpIDoKKyAgICAgICh7IE9TVkVSU0lPTklORk8gdjsgdi5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk8pOworICAgICAgICAgR2V0VmVyc2lvbkV4KCZ2KTsKKyAgICAgICAgIHYuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVDsKKyAgICAgIH0pID8gImNtZC5leGUiIDogImNvbW1hbmQuY29tIikuCisgICBJbnN0ZWFkIGl0IHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5ICcgJywgYW5kIGNhbGxzCisgICBDcmVhdGVQcm9jZXNzKCkuICBXZSBtdXN0IHF1b3RlIHRoZSBhcmd1bWVudHMgc2luY2UgV2luMzIgQ3JlYXRlUHJvY2VzcygpCisgICBpbnRlcnByZXRzIGNoYXJhY3RlcnMgbGlrZSAnICcsICdcdCcsICdcXCcsICciJyAoYnV0IG5vdCAnPCcgYW5kICc+JykgaW4gYQorICAgc3BlY2lhbCB3YXk6CisgICAtIFNwYWNlIGFuZCB0YWIgYXJlIGludGVycHJldGVkIGFzIGRlbGltaXRlcnMuIFRoZXkgYXJlIG5vdCB0cmVhdGVkIGFzCisgICAgIGRlbGltaXRlcnMgaWYgdGhleSBhcmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzOiAiLi4uIi4KKyAgIC0gVW5lc2NhcGVkIGRvdWJsZSBxdW90ZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQuIFRoZWlyIG9ubHkgZWZmZWN0IGlzCisgICAgIHRoYXQgd2l0aGluIGRvdWJsZSBxdW90ZXMsIHNwYWNlIGFuZCB0YWIgYXJlIHRyZWF0ZWQgbGlrZSBub3JtYWwKKyAgICAgY2hhcmFjdGVycy4KKyAgIC0gQmFja3NsYXNoZXMgbm90IGZvbGxvd2VkIGJ5IGRvdWJsZSBxdW90ZXMgYXJlIG5vdCBzcGVjaWFsLgorICAgLSBCdXQgMipuKzEgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgYmVjb21lCisgICAgIG4gYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgKG4gPj0gMCk6CisgICAgICAgXCIgLT4gIgorICAgICAgIFxcXCIgLT4gXCIKKyAgICAgICBcXFxcXCIgLT4gXFwiCisgKi8KKyNkZWZpbmUgU0hFTExfU1BFQ0lBTF9DSEFSUyAiXCJcXCBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorI2RlZmluZSBTSEVMTF9TUEFDRV9DSEFSUyAiIFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzciCitjaGFyICoqCitwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndikKK3sKKyAgc2l6ZV90IGFyZ2M7CisgIGNoYXIgKipuZXdfYXJndjsKKyAgc2l6ZV90IGk7CisKKyAgLyogQ291bnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQorICAgIDsKKworICAvKiBBbGxvY2F0ZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgbmV3X2FyZ3YgPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiBQdXQgcXVvdGVkIGFyZ3VtZW50cyBpbnRvIHRoZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzdHJpbmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyaW5nWzBdID09ICdcMCcpCisJbmV3X2FyZ3ZbaV0gPSB4c3RyZHVwICgiXCJcIiIpOworICAgICAgZWxzZSBpZiAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEVDSUFMX0NIQVJTKSAhPSBOVUxMKQorCXsKKwkgIGludCBxdW90ZV9hcm91bmQgPSAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEFDRV9DSEFSUykgIT0gTlVMTCk7CisJICBzaXplX3QgbGVuZ3RoOworCSAgdW5zaWduZWQgaW50IGJhY2tzbGFzaGVzOworCSAgY29uc3QgY2hhciAqczsKKwkgIGNoYXIgKnF1b3RlZF9zdHJpbmc7CisJICBjaGFyICpwOworCisJICBsZW5ndGggPSAwOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoKys7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKwkgICAgICBsZW5ndGgrKzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICBsZW5ndGggKz0gYmFja3NsYXNoZXMgKyAxOworCisJICBxdW90ZWRfc3RyaW5nID0gWE1BTExPQyAoY2hhciwgbGVuZ3RoICsgMSk7CisKKwkgIHAgPSBxdW90ZWRfc3RyaW5nOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgKnArKyA9ICciJzsKKwkgIGZvciAocyA9IHN0cmluZzsgKnMgIT0gJ1wwJzsgcysrKQorCSAgICB7CisJICAgICAgY2hhciBjID0gKnM7CisJICAgICAgaWYgKGMgPT0gJyInKQorCQl7CisJCSAgdW5zaWduZWQgaW50IGo7CisJCSAgZm9yIChqID0gYmFja3NsYXNoZXMgKyAxOyBqID4gMDsgai0tKQorCQkgICAgKnArKyA9ICdcXCc7CisJCX0KKwkgICAgICAqcCsrID0gYzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IGo7CisJICAgICAgZm9yIChqID0gYmFja3NsYXNoZXM7IGogPiAwOyBqLS0pCisJCSpwKysgPSAnXFwnOworCSAgICAgICpwKysgPSAnIic7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKworCSAgbmV3X2FyZ3ZbaV0gPSBxdW90ZWRfc3RyaW5nOworCX0KKyAgICAgIGVsc2UKKwluZXdfYXJndltpXSA9IChjaGFyICopIHN0cmluZzsKKyAgICB9CisgIG5ld19hcmd2W2FyZ2NdID0gTlVMTDsKKworICByZXR1cm4gbmV3X2FyZ3Y7Cit9CitFT0YKKwkJOzsKKwkgICAgZXNhYworCisgICAgICAgICAgICBjYXQgPDwiRU9GIgordm9pZCBsdF9kdW1wX3NjcmlwdCAoRklMRSogZikKK3sKK0VPRgorCSAgICBmdW5jX2VtaXRfd3JhcHBlciB5ZXMgfAorCSAgICAgICRTRUQgLW4gLWUgJworcy9eXCguXHs3OVx9XClcKC4uKlwpL1wxXAorXDIvCitoCitzL1woW1xcIl1cKS9cXFwxL2cKK3MvJC9cXG4vCitzL1woW15cbl0qXCkuKi8gIGZwdXRzICgiXDEiLCBmKTsvcAorZworRCcKKyAgICAgICAgICAgIGNhdCA8PCJFT0YiCit9CitFT0YKK30KKyMgZW5kOiBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisKKyMgZnVuY193aW4zMl9pbXBvcnRfbGliX3AgQVJHCisjIFRydWUgaWYgQVJHIGlzIGFuIGltcG9ydCBsaWIsIGFzIGluZGljYXRlZCBieSAkZmlsZV9tYWdpY19jbWQKK2Z1bmNfd2luMzJfaW1wb3J0X2xpYl9wICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgYGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCQxXCIgMj4vZGV2L251bGwgfCAkU0VEIC1lIDEwcWAgaW4KKyAgICAqaW1wb3J0KikgOiA7OworICAgICopIGZhbHNlIDs7CisgICAgZXNhYworfQorCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGJpbmRpcj0KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZGxzZWxmPW5vCisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBleHBvcnRfc3ltYm9scz0KKyAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KKyAgICBnZW5lcmF0ZWQ9CisgICAgbGlib2Jqcz0KKyAgICBsdGxpYnM9CisgICAgbW9kdWxlPW5vCisgICAgbm9faW5zdGFsbD1ubworICAgIG9ianM9CisgICAgbm9uX3BpY19vYmplY3RzPQorICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQorICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubworICAgIHByZWxvYWQ9bm8KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICB4cnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHRocmVhZF9zYWZlPW5vCisgICAgdmluZm89CisgICAgdmluZm9fbnVtYmVyPW5vCisgICAgd2Vha19saWJzPQorICAgIHNpbmdsZV9tb2R1bGU9IiR7d2x9LXNpbmdsZV9tb2R1bGUiCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWJyZWFrCisJOzsKKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCWNhc2UgJGFyZyBpbgorCS1hbGwtc3RhdGljKQorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCS1zdGF0aWMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0CisJICA7OworCS1zdGF0aWMtbGlidG9vbC1saWJzKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJZXNhYworCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCisgICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcworCisgICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCisgICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgICAgcWFyZz0kZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnRvb2xfYXJncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICRwcmV2IGluCisJb3V0cHV0KQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICA7OworCWVzYWMKKworCWNhc2UgJHByZXYgaW4KKwliaW5kaXIpCisJICBiaW5kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKwkgIGZvcmNlKQorCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBzZWxmKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsc2UKKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkYXJnIgorCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICB0ZXN0IC1mICIkYXJnIiBcCisJICAgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgInN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXhwc3ltc19yZWdleCkKKwkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWZyYW1ld29yaykKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICAgKi0qLWRhcndpbiopCisJICAgICAgY2FzZSAiJGRlcGxpYnMgIiBpbgorCQkqIiAkcWFyZy5sdGZyYW1ld29yayAiKikgOzsKKwkJKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRxYXJnLmx0ZnJhbWV3b3JrIiAjIHRoaXMgaXMgZml4ZWQgbGF0ZXIKKwkJICAgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgIGVzYWMKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlpbnN0X3ByZWZpeCkKKwkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlvYmplY3RsaXN0KQorCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KKwkgICAgc2F2ZV9hcmc9JGFyZworCSAgICBtb3JlYXJncz0KKwkgICAgZm9yIGZpbCBpbiBgY2F0ICIkc2F2ZV9hcmciYAorCSAgICBkbworIwkgICAgICBmdW5jX2FwcGVuZCBtb3JlYXJncyAiICRmaWwiCisJICAgICAgYXJnPSRmaWwKKwkgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KKworCSAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KKwkgICAgICBpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkYXJnIjsgdGhlbgorCQlwaWNfb2JqZWN0PQorCQlub25fcGljX29iamVjdD0KKworCQkjIFJlYWQgdGhlIC5sbyBmaWxlCisJCWZ1bmNfc291cmNlICIkYXJnIgorCisJCWlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIKKwkJZmkKKworCQkjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQlmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQl4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgcHJldj0KKwkJICBmaQorCisJCSAgIyBBIFBJQyBvYmplY3QuCisJCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCQkgIGFyZz0iJHBpY19vYmplY3QiCisJCWZpCisKKwkJIyBOb24tUElDIG9iamVjdC4KKwkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkJICBmaQorCQllbHNlCisJCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCQlmaQorCSAgICAgIGVsc2UKKwkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJCWlmICRvcHRfZHJ5X3J1bjsgdGhlbgorCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQkgIGZ1bmNfbG8ybyAiJGFyZyIKKwkJICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCQkgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgICAgICAgZWxzZQorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCisJCWZpCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJsaW5rIGlucHV0IGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIGZpCisJICBhcmc9JHNhdmVfYXJnCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcHJlY2lvdXNfcmVnZXgpCisJICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlyZWxlYXNlKQorCSAgcmVsZWFzZT0iLSRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcnBhdGggfCB4cnBhdGgpCisJICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkgIGNhc2UgJGFyZyBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgorCSAgICBjYXNlICIkcnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGVsc2UKKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIGZ1bmNfYXBwZW5kIHdlYWtfbGlicyAiICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJeGNjbGlua2VyKQorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGNvbXBpbGVyKQorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhsaW5rZXIpCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1iaW5kaXIpCisJcHJldj1iaW5kaXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICItTCIgJycgIiRhcmciCisJaWYgdGVzdCAteiAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7IHRoZW4KKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJyZXF1aXJlIG5vIHNwYWNlIGJldHdlZW4gXGAtTCcgYW5kIFxgJDEnIgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJuZWVkIHBhdGggZm9yIFxgLUwnIG9wdGlvbiIKKwkgIGZpCisJZmkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwlkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqIHwgKiIgJGFyZyAiKikKKwkgICMgV2lsbCBvbmx5IGhhcHBlbiBmb3IgYWJzb2x1dGUgb3Igc3lzcm9vdCBhcmd1bWVudHMKKwkgIDs7CisJKikKKwkgICMgUHJlc2VydmUgc3lzcm9vdCwgYnV0IG5ldmVyIGluY2x1ZGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKKwkgIGNhc2UgJGRpciBpbgorCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSogfCA9KikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAtTCRkaXIiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBsaWJfc2VhcmNoX3BhdGggIiAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisJICB0ZXN0YmluZGlyPWAkRUNITyAiJGRpciIgfCAkU0VEICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWwqKQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgorCSBjYXNlICRob3N0IGluCisJICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICBjb250aW51ZQorCSAgIDs7CisJIGVzYWMKKwlmaQorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW1vZHVsZSkKKwltb2R1bGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCisgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgorICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdHwtLXN5c3Jvb3QpCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUgXAorICAgICAgfC10aHJlYWRzfC1mb3Blbm1wfC1vcGVubXB8LW1wfC14b3Blbm1wfC1vbXB8LXFzbXA9KikKKwlmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkYXJnIiA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdWx0aV9tb2R1bGUpCisJc2luZ2xlX21vZHVsZT0iJHt3bH0tbXVsdGlfbW9kdWxlIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKKwlmYXN0X2luc3RhbGw9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1pbnN0YWxsKQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1kYXJ3aW4qIHwgKi1jZWdjYyopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgYW5kIERhcndpbiBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgZnVuY193YXJuaW5nICJcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIKKwkgIGZ1bmNfd2FybmluZyAiYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vYmplY3RsaXN0KQorCXByZXY9b2JqZWN0bGlzdAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKKwlwcmV2PXByZWNpb3VzX3JlZ2V4CisJY29udGludWUKKwk7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJPSopCisJICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRkaXIiCisJICBkaXI9JGx0X3N5c3Jvb3QkZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtc2hhcmVkKQorCSMgVGhlIGVmZmVjdHMgb2YgLXNoYXJlZCBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJY29udGludWUKKwk7OworCisgICAgICAtc2hyZXh0KQorCXByZXY9c2hyZXh0CisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KKwkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKKwkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCisJIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0CisJIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXZlcnNpb24tbnVtYmVyKQorCXByZXY9dmluZm8KKwl2aW5mb19udW1iZXI9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtd2VhaykKKyAgICAgICAgcHJldj13ZWFrCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBmdW5jX2FwcGVuZCBhcmcgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgorCWFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJOzsKKworICAgICAgLVdsLCopCisJZnVuY19zdHJpcG5hbWUgJy1XbCwnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YbGlua2VyKQorCXByZXY9eGxpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhDQ2xpbmtlcikKKwlwcmV2PXhjY2xpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyAtbXNnXyogZm9yIG9zZiBjYworICAgICAgLW1zZ18qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJOzsKKworICAgICAgIyBGbGFncyB0byBiZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQsIHdpdGggcmF0aW9uYWxlOgorICAgICAgIyAtNjQsIC1taXBzWzAtOV0gICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXJbMC05XVswLTldKiAgICAgICAgc3BlY2lmeSBwcm9jZXNzb3IgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU3VuIGNvbXBpbGVyCisgICAgICAjICtEQSosICtERCogICAgICAgICAgIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIEhQIGNvbXBpbGVyCisgICAgICAjIC1xKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKKyAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgLUYvcGF0aCAgICAgICAgICAgICAgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qICBwcm9maWxpbmcgZmxhZ3MgZm9yIEdDQworICAgICAgIyBAZmlsZSAgICAgICAgICAgICAgICBHQ0MgcmVzcG9uc2UgZmlsZXMKKyAgICAgICMgLXRwPSogICAgICAgICAgICAgICAgUG9ydGxhbmQgcGdjYyB0YXJnZXQgcHJvY2Vzc29yIHNlbGVjdGlvbgorICAgICAgIyAtLXN5c3Jvb3Q9KiAgICAgICAgICBmb3Igc3lzcm9vdCBzdXBwb3J0CisgICAgICAjIC1PKiwgLWZsdG8qLCAtZndob3ByKiwgLWZ1c2UtbGlua2VyLXBsdWdpbiBHQ0MgbGluay10aW1lIG9wdGltaXphdGlvbgorICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCp8LXRwPSp8LS1zeXNyb290PSp8IFwKKyAgICAgIC1PKnwtZmx0byp8LWZ3aG9wcip8LWZ1c2UtbGlua2VyLXBsdWdpbikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKyAgICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICouJG9iamV4dCkKKwkjIEEgc3RhbmRhcmQgb2JqZWN0LgorCWZ1bmNfYXBwZW5kIG9ianMgIiAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKKwkJcHJldj0KKwkJY29udGludWUKKwkgICAgICBlbHNlCisJCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCXByZXY9ZGxwcmVmaWxlcworCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJHBpY19vYmplY3QiCisJICAgICAgcHJldj0KKwkgICAgZmkKKworCSAgICAjIEEgUElDIG9iamVjdC4KKwkgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCSAgICBhcmc9IiRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBOb24tUElDIG9iamVjdC4KKwkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgICAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJICAgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkgICAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCSAgICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZWxzZQorCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJICBpZiAkb3B0X2RyeV9ydW47IHRoZW4KKwkgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgICAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgICAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkgICAgZnVuY19sbzJvICIkYXJnIgorCSAgICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCSAgICBub25fcGljX29iamVjdD0keGRpciRmdW5jX2xvMm9fcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICouJGxpYmV4dCkKKwkjIEFuIGFyY2hpdmUuCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCisJZnVuY19hcHBlbmQgb2xkX2RlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGFyZyIKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgcHJldj0KKwllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxzZQorCSAgZnVuY19hcHBlbmQgZGVwbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkU0VEIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KKyAgICBmaQorICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgorICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKKworICAgIGZ1bmNfZGlybmFtZSAiJG91dHB1dCIgIi8iICIiCisgICAgb3V0cHV0X29iamRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkb2JqZGlyIgorICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8iCisgICAgdG9vbF9vdXRwdXRfb2JqZGlyPSRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQKKyAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KKyAgICBmdW5jX21rZGlyX3AgIiRvdXRwdXRfb2JqZGlyIgorCisgICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0CisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgIiIpCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiCisgICAgICA7OworICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7CisgICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7CisgICAgKi5sYSkgbGlua21vZGU9bGliIDs7CisgICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KKyAgICBlc2FjCisKKyAgICBzcGVjaWFsZGVwbGlicz0KKworICAgIGxpYnM9CisgICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCisgICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCisgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKyAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJY2FzZSAiJGxpYnMgIiBpbgorCSoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgbGlicyAiICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIGZ1bmNfYXBwZW5kIHByZV9wb3N0X2RlcHMgIiAkcHJlX3Bvc3RfZGVwIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgIGZpCisKKyAgICBkZXBsaWJzPQorICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKyAgICBuZXdsaWJfc2VhcmNoX3BhdGg9CisgICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgbGliKQorCXBhc3Nlcz0iY29udiBkbHByZW9wZW4gbGluayIKKwlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICoubGEpIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2hlbHAgImxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICBwcm9nKQorCWNvbXBpbGVfZGVwbGlicz0KKwlmaW5hbGl6ZV9kZXBsaWJzPQorCWFsbGRlcGxpYnM9bm8KKwluZXdkbGZpbGVzPQorCW5ld2RscHJlZmlsZXM9CisJcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgorCTs7CisgICAgKikgIHBhc3Nlcz0iY29udiIKKwk7OworICAgIGVzYWMKKworICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCisgICAgICAjIFRoZSBwcmVvcGVuIHBhc3MgaW4gbGliIG1vZGUgcmV2ZXJzZXMgJGRlcGxpYnM7IHB1dCBpdCBiYWNrIGhlcmUKKyAgICAgICMgc28gdGhhdCAtTCBjb21lcyBiZWZvcmUgbGlicyB0aGF0IG5lZWQgaXQgZm9yIGluc3RhbmNlLi4uCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIjsgdGhlbgorCSMjIEZJWE1FOiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0aGUgbGlzdCBpcyByZWJ1aWx0IGluIHRoZSB3cm9uZworCSMjICAgICAgICBvcmRlciwgYW5kIGZpeCBpdCB0aGVyZSBwcm9wZXJseQorICAgICAgICB0bXBfZGVwbGlicz0KKwlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgdG1wX2RlcGxpYnM9IiRkZXBsaWIgJHRtcF9kZXBsaWJzIgorCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KKwlsaWJzPSIkZGVwbGlicyIKKwlkZXBsaWJzPQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJY2FzZSAkcGFzcyBpbgorCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7CisJZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKKwlsaW5rKQorCSAgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlIgorCSAgdGVzdCAiWCRsaW5rX2FsbF9kZXBsaWJzIiAhPSBYbm8gJiYgbGlicz0iJGxpYnMgJGRlcGVuZGVuY3lfbGlicyIKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGRscHJlb3BlbiI7IHRoZW4KKwkjIENvbGxlY3QgYW5kIGZvcndhcmQgZGVwbGlicyBvZiBwcmVvcGVuZWQgbGlidG9vbCBsaWJzCisJZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICMgSWdub3JlIG5vbi1saWJ0b29sLWxpYnMKKwkgIGRlcGVuZGVuY3lfbGlicz0KKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkbGliIgorCSAgY2FzZSAkbGliIGluCisJICAqLmxhKQlmdW5jX3NvdXJjZSAiJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgIGVzYWMKKworCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5CisJICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKyAgICAgICAgICAgIGRlcGxpYl9iYXNlPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCisJICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSBcCisgICAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGRlcGxpYiIKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KKwkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkJICAgICoiICRkZXBsaWIgIiopIDs7CisJCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkZGVwbGliIiA7OworCQllc2FjCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJLWwqKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWIgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBmdW5jX3N0cmlwbmFtZSAnLWwnICcnICIkZGVwbGliIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIHNlYXJjaGRpcnM9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aCIKKwkgIGVsc2UKKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aCIKKwkgIGZpCisJICBmb3Igc2VhcmNoZGlyIGluICRzZWFyY2hkaXJzOyBkbworCSAgICBmb3Igc2VhcmNoX2V4dCBpbiAubGEgJHN0ZF9zaHJleHQgLnNvIC5hOyBkbworCSAgICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgICBsaWI9IiRzZWFyY2hkaXIvbGliJHtuYW1lfSR7c2VhcmNoX2V4dH0iCisJICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkJaWYgdGVzdCAiJHNlYXJjaF9leHQiID0gIi5sYSI7IHRoZW4KKwkJICBmb3VuZD15ZXMKKwkJZWxzZQorCQkgIGZvdW5kPW5vCisJCWZpCisJCWJyZWFrIDIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBkb25lCisJICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgorCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgIGVsc2UgIyBkZXBsaWIgaXMgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgIyBJZiAkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzICYmICRkZXBsaWIgaXMgYSBzdGRsaWIsCisJICAgICMgV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgdGhpbmdzIGhlcmUsIGFuZCBub3QgbGF0ZXIuCisJICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKQorCQlpZiBmdW5jX2xhbGliX3AgIiRsaWIiOyB0aGVuCisJCSAgbGlicmFyeV9uYW1lcz0KKwkJICBvbGRfbGlicmFyeT0KKwkJICBmdW5jX3NvdXJjZSAiJGxpYiIKKwkJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJCSAgICBsbD0iJGwiCisJCSAgZG9uZQorCQkgIGlmIHRlc3QgIlgkbGwiID0gIlgkb2xkX2xpYnJhcnkiIDsgdGhlbiAjIG9ubHkgc3RhdGljIHZlcnNpb24gYXZhaWxhYmxlCisJCSAgICBmb3VuZD1ubworCQkgICAgZnVuY19kaXJuYW1lICIkbGliIiAiIiAiLiIKKwkJICAgIGxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKwkJICAgIGxpYj0kbGFkaXIvJG9sZF9saWJyYXJ5CisJCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJCSAgICBlbHNlCisJCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJCSAgICBmaQorCQkgICAgY29udGludWUKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZmkKKwkgIDs7ICMgLWwKKwkqLmx0ZnJhbWV3b3JrKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktTCopCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgICAgOzsKKwkgIHByb2cpCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGNvbnRpbnVlCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IHNjYW47IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICAgIDs7CisJICAqKQorCSAgICBmdW5jX3dhcm5pbmcgIlxgLUwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIGNvbnRpbnVlCisJICA7OyAjIC1MCisJLVIqKQorCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZGlyPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgY29udGludWUKKwkgIDs7CisJKi5sYSkKKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIgorCSAgbGliPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAorCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgorCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgKikKKwkgICAgICB2YWxpZF9hX2xpYj1ubworCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJCW1hdGNoX3BhdHRlcm4qKQorCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIiRkZXBsaWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSBcCisJCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICB2YWxpZF9hX2xpYj15ZXMKKwkJICBmaQorCQk7OworCQlwYXNzX2FsbCkKKwkJICB2YWxpZF9hX2xpYj15ZXMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgaWYgdGVzdCAiJHZhbGlkX2FfbGliIiAhPSB5ZXM7IHRoZW4KKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgorCQllY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlIGhlcmUuIgorCSAgICAgIGVsc2UKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGVwbGliIgorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGRlcGxpYiIKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCisJaWYgdGVzdCAiJGZvdW5kIiA9IHllcyB8fCB0ZXN0IC1mICIkbGliIjsgdGhlbiA6CisJZWxzZQorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgdGhlIGxpYnJhcnkgXGAkbGliJyBvciB1bmhhbmRsZWQgYXJndW1lbnQgXGAkZGVwbGliJyIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkbGliIiBcCisJICB8fCBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCWZ1bmNfZGlybmFtZSAiJGxpYiIgIiIgIi4iCisJbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJZGxuYW1lPQorCWRsb3Blbj0KKwlkbHByZW9wZW49CisJbGliZGlyPQorCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KKwkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAorCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluaworCWluc3RhbGxlZD15ZXMKKwlzaG91bGRub3RsaW5rPW5vCisJYXZvaWR0ZW1wcnBhdGg9CisKKworCSMgUmVhZCB0aGUgLmxhIGZpbGUKKwlmdW5jX3NvdXJjZSAiJGxpYiIKKworCSMgQ29udmVydCAiLWZyYW1ld29yayBmb28iIHRvICJmb28ubHRmcmFtZXdvcmsiCisJaWYgdGVzdCAtbiAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiOyB0aGVuCisJICB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbworCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiAkZGVwZW5kZW5jeV9saWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKKwkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRkbG9wZW4iCisJICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgZnVuY19hcHBlbmQgY29udmVuaWVuY2UgIiAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIGZ1bmNfYXBwZW5kIG9sZF9jb252ZW5pZW5jZSAiICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgdG1wX2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJCWNhc2UgIiR0bXBfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIgorCSAgICBkb25lCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gY29udgorCisKKwkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCisJbGlua2xpYj0KKwlpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmCisJICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IHllcyB8fAorCSAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCxubyI7IH07IHRoZW4KKwkgIGxpbmtsaWI9JG9sZF9saWJyYXJ5CisJZWxzZQorCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBsaW5rbGliPSIkbCIKKwkgIGRvbmUKKwlmaQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJZmkKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCWlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IC1kbG9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgorCSAgZmkKKwkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8CisJICAgICB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZworCSAgICAjIHN0YXRpY2FsbHksIHdlIG5lZWQgdG8gcHJlbG9hZC4gIFdlIGFsc28gbmVlZCB0byBwcmVsb2FkIGFueQorCSAgICAjIGRlcGVuZGVudCBsaWJyYXJpZXMgc28gbGlibHRkbCdzIGRlcGxpYiBwcmVsb2FkZXIgZG9lc24ndAorCSAgICAjIGJvbWIgb3V0IGluIHRoZSBsb2FkIGRlcGxpYnMgcGhhc2UuCisJICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGRsb3BlbgorCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkbGFkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OworCSopCisJICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciCisJICAgIGZ1bmNfd2FybmluZyAicGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIKKwkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCisJICBmaQorCSAgOzsKKwllc2FjCisJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwlsYW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGx0X3N5c3Jvb3QkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGx0X3N5c3Jvb3QkbGliZGlyIgorCSAgICBhYnNkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgIGZpCisJICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcworCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGZpCisJZmkgIyAkaW5zdGFsbGVkID0geWVzCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRsYW5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiICYmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgbGlicmFyaWVzIG1heSAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBjYXNlICIkaG9zdCIgaW4KKwkgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBwbGF0Zm9ybXMgd2l0aCBQRS1ETExzLgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIExpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJ5IGlmIGJvdGgKKwkgICAgICAjIHN0YXRpYyBhbmQgc2hhcmVkIGFyZSBwcmVzZW50LiAgVGhlcmVmb3JlLCBlbnN1cmUgd2UgZXh0cmFjdAorCSAgICAgICMgc3ltYm9scyBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpZiBhIHNoYXJlZCBsaWJyYXJ5IGlzIHByZXNlbnQKKwkgICAgICAjIChvdGhlcndpc2UsIHRoZSBkbG9wZW4gbW9kdWxlIG5hbWUgd2lsbCBiZSBpbmNvcnJlY3QpLiAgV2UgZG8KKwkgICAgICAjIHRoaXMgYnkgcHV0dGluZyB0aGUgaW1wb3J0IGxpYnJhcnkgbmFtZSBpbnRvICRuZXdkbHByZWZpbGVzLgorCSAgICAgICMgV2UgcmVjb3ZlciB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIGJ5ICdzYXZpbmcnIHRoZSBsYSBmaWxlCisJICAgICAgIyBuYW1lIGluIGEgc3BlY2lhbCBwdXJwb3NlIHZhcmlhYmxlLCBhbmQgKGxhdGVyKSBleHRyYWN0aW5nIHRoZQorCSAgICAgICMgZGxuYW1lIGZyb20gdGhlIGxhIGZpbGUuCisJICAgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkaXIvJGxpbmtsaWIiCisJICAgICAgICBldmFsICJsaWJmaWxlXyRmdW5jX3RyX3NoX3Jlc3VsdD1cJGFic19sYWRpci9cJGxhbmFtZSIKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgZmkKKwkgICAgOzsKKwkgICAgKiApCisJICAgICAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAgICAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisJICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgICAgIyBLZWVwIGEgbGlzdCBvZiBwcmVvcGVuZWQgY29udmVuaWVuY2UgbGlicmFyaWVzIHRvIGNoZWNrCisJICAgICAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkgICAgICAgICAgZnVuY19hcHBlbmQgZGxwcmVjb252ZW5pZW5jZWxpYnMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgICAgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRkbG5hbWUiCisJICAgICAgZWxzZQorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgICAgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkJIDs7CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCisJICBkb25lICMgZm9yIGRlcGxpYgorCSAgY29udGludWUKKwlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgICB7IHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fAorCSAgICAgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAorCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgorCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgICBjYXNlICIkdGVtcF9ycGF0aDoiIGluCisJICAgICAgKiIkYWJzZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIHRlbXBfcnBhdGggIiRhYnNkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKworCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfZGVwbGlicyAiICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9bm8KKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm87IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBub3RpbnN0X2RlcGxpYnMgIiAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPXllcworCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKKworCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uIHNvbWUKKwkgICMgc3lzdGVtcyAoZGFyd2luKS4gIERvbid0IGJsZWF0IGFib3V0IGRsb3BlbmVkIG1vZHVsZXMgdGhvdWdoIQorCSAgZGxvcGVubW9kdWxlPSIiCisJICBmb3IgZGxwcmVtb2R1bGV0ZXN0IGluICRkbHByZWZpbGVzOyBkbworCSAgICBpZiB0ZXN0ICJYJGRscHJlbW9kdWxldGVzdCIgPSAiWCRsaWIiOyB0aGVuCisJICAgICAgZGxvcGVubW9kdWxlPSIkZGxwcmVtb2R1bGV0ZXN0IgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICBkb25lCisJICBpZiB0ZXN0IC16ICIkZGxvcGVubW9kdWxlIiAmJiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgY29tcGlsZV9ycGF0aCAiICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KKwkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKKwkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJICAgIHNoaWZ0CisJICAgIHJlYWxuYW1lPSIkMSIKKwkgICAgc2hpZnQKKwkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCBtaW5ndyogfCAqY2VnY2MqKQorCSAgICAgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkJbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJCXZlcnN1ZmZpeD0iLSRtYWpvciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCSAgICBlbHNlCisJICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCisJICAgIGZpCisKKwkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKKwkgICAgc29yb290PSIkc29uYW1lIgorCSAgICBmdW5jX2Jhc2VuYW1lICIkc29yb290IgorCSAgICBzb25hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5kbGwnICIkc29uYW1lIgorCSAgICBuZXdsaWI9bGliaW1wLSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuYQorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCisJICAgICMgQ3JlYXRlICRuZXdsaWIKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgbGliX2xpbmtlZD15ZXMKKwkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCisJICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCQljYXNlICRob3N0IGluCisJCSAgKi0qLXNjbzMuMnY1LjAuWzAyNF0qKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y0KnV3MiopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjVPcGVuVU5JWCogfCAqLSotc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IFwKKwkJICAgICotKi11bml4d2FyZTcqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLWRhcndpbiogKQorCQkgICAgIyBpZiB0aGUgbGliIGlzIGEgKG5vbi1kbG9wZW5lZCkgbW9kdWxlIHRoZW4gd2UgY2FuIG5vdAorCQkgICAgIyBsaW5rIGFnYWluc3QgaXQsIHNvbWVvbmUgaXMgaWdub3JpbmcgdGhlIGVhcmxpZXIgd2FybmluZ3MKKwkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAorCQkJICRHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KKwkJICAgICAgaWYgdGVzdCAiWCRkbG9wZW5tb2R1bGUiICE9ICJYJGxpYiI7IHRoZW4KKwkJCSRFQ0hPICIqKiogV2FybmluZzogbGliICRsaW5rbGliIGlzIGEgbW9kdWxlLCBub3QgYSBzaGFyZWQgbGlicmFyeSIKKwkJCWlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCisJCQkgIGVjaG8KKwkJCSAgZWNobyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgIGVjaG8gIioqKiBUaGUgbGluayB3aWxsIHByb2JhYmx5IGZhaWwsIHNvcnJ5IgorCQkJZWxzZQorCQkJICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkJZmkKKwkJICAgICAgZWxpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJCQlhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkgICAgICBmaQorCQkgICAgZmkKKwkJZXNhYworCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzICYmCisJICAgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkJYWRkX2Rpcj0iLUwkYWJzZGlyIgorCQkjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJCWlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJCSAgY2FzZSAkbGliZGlyIGluCisJCSAgICBbXFwvXSopCisJCSAgICAgIGZ1bmNfYXBwZW5kIGFkZF9kaXIgIiAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfc2hsaWJwYXRoICIkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9zaGxpYnBhdGggIiRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3NobGlicGF0aCAiJGxpYmRpcjoiIDs7CisJICAgICAgZXNhYworCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiICYmCisJCSB0ZXN0IC1mICIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIgOyB0aGVuCisJCWFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCQlhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQljYXNlICRsaWJkaXIgaW4KKwkJICBbXFwvXSopCisJCSAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICBlY2hvCisJICAgICRFQ0hPICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKKwkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgICBlY2hvICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCisJICAgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCWVjaG8KKwkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICR0ZW1wX3hycGF0aCI7OworCQkgICBlc2FjOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX2RlcGxpYnMgIiAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgY2FzZSAkZGVwbGliIGluCisgICAgICAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKyAgICAgICAgICAgICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7OworICAgICAgICAgICAgICAqKSBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIgOzsKKyAgICAgICAgICAgIGVzYWMKKwkgICAgaWYgJG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgIiopCisgICAgICAgICAgICAgICAgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIHBhdGg9CisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkgICAgICAgIGRlcGxpYj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICAgICAgICBmdW5jX2Rpcm5hbWUgIiRkZXBsaWIiICIiICIuIgorCQlkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiAkR1JFUCAiXmluc3RhbGxlZD1ubyIgJGRlcGxpYiA+IC9kZXYvbnVsbDsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgIGRlcGRlcGw9CisJCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KKwkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbworCQkgICAgICBkZXBkZXBsPSR0bXAKKwkJICAgIGRvbmUKKwkJICAgIGlmIHRlc3QgLWYgIiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIgOyB0aGVuCisJCSAgICAgIGRlcGRlcGw9IiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIKKwkJICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTH0gLUwgJGRlcGRlcGwgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGRhcndpbl9pbnN0YWxsX25hbWUiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0w2NH0gLUwgJGRlcGRlcGwgIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGZpCisJCSAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHt3bH0tZHlsaWJfZmlsZSAke3dsfSR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKKwkJICAgICAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgLWR5bGliX2ZpbGUgJHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgorCQkgICAgICBwYXRoPQorCQkgICAgZmkKKwkJICBmaQorCQkgIDs7CisJCSopCisJCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCisJCSAgOzsKKwkJZXNhYworCQllbHNlCisJCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJICB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciIgJiYgXAorCQkgICAgZnVuY193YXJuaW5nICJcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIgorCisJCSAgcGF0aD0iLUwkYWJzZGlyIgorCQlmaQorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gInByb2ciOyB0aGVuCisJICBjb21waWxlX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkY29tcGlsZV9kZXBsaWJzIgorCSAgZmluYWxpemVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRmaW5hbGl6ZV9kZXBsaWJzIgorCWVsc2UKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgImAkRUNITyAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpCisgICAgICBmaQorICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcworCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJZG9uZQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KKwlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgbmV3bGliX3NlYXJjaF9wYXRoPQorCWZpCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCisJICB2YXJzPSJkZXBsaWJzIgorCWVsc2UKKwkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgorCWZpCisJZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCisJICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKKwkgIG5ld19saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCisJICAgICMgRklYTUU6IFBlZGFudGljYWxseSwgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHNvCisJICAgICMgICAgICAgIHRoYXQgc29tZSBuYXN0eSBkZXBlbmRlbmN5IGxvb3AgaXNuJ3QgYWNjaWRlbnRhbGx5CisJICAgICMgICAgICAgIGJyb2tlbjoKKwkgICAgI25ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKKwkgICAgIyBQcmFnbWF0aWNhbGx5LCB0aGlzIHNlZW1zIHRvIGNhdXNlIHZlcnkgZmV3IHByb2JsZW1zIGluCisJICAgICMgcHJhY3RpY2U6CisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgLVIqKSA7OworCSAgICAqKQorCSAgICAgICMgQW5kIGhlcmUgaXMgdGhlIHJlYXNvbjogd2hlbiBhIGxpYnJhcnkgYXBwZWFycyBtb3JlCisJICAgICAgIyB0aGFuIG9uY2UgYXMgYW4gZXhwbGljaXQgZGVwZW5kZW5jZSBvZiBhIGxpYnJhcnksIG9yCisJICAgICAgIyBpcyBpbXBsaWNpdGx5IGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZSBieSB0aGUKKwkgICAgICAjIGNvbXBpbGVyLCBpdCBpcyBjb25zaWRlcmVkIHNwZWNpYWwsIGFuZCBtdWx0aXBsZQorCSAgICAgICMgb2NjdXJyZW5jZXMgdGhlcmVvZiBhcmUgbm90IHJlbW92ZWQuICBDb21wYXJlIHRoaXMKKwkgICAgICAjIHdpdGggaGF2aW5nIHRoZSBzYW1lIGxpYnJhcnkgYmVpbmcgbGlzdGVkIGFzIGEKKwkgICAgICAjIGRlcGVuZGVuY3kgb2YgbXVsdGlwbGUgb3RoZXIgbGlicmFyaWVzOiBpbiB0aGlzIGNhc2UsCisJICAgICAgIyB3ZSBrbm93IChwZWRhbnRpY2FsbHksIHdlIGFzc3VtZSkgdGhlIGxpYnJhcnkgZG9lcyBub3QKKwkgICAgICAjIG5lZWQgdG8gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyB3ZSBrZWVwIG9ubHkgdGhlCisJICAgICAgIyBsYXN0IGNvcHkuICBUaGlzIGlzIG5vdCBhbHdheXMgcmlnaHQsIGJ1dCBpdCBpcyByYXJlCisJICAgICAgIyBlbm91Z2ggdGhhdCB3ZSByZXF1aXJlIHVzZXJzIHRoYXQgcmVhbGx5IG1lYW4gdG8gcGxheQorCSAgICAgICMgc3VjaCB1bnBvcnRhYmxlIGxpbmtpbmcgdHJpY2tzIHRvIGxpbmsgdGhlIGxpYnJhcnkKKwkgICAgICAjIHVzaW5nIC1XbCwtbG5hbWUsIHNvIHRoYXQgbGlidG9vbCBkb2VzIG5vdCBjb25zaWRlciBpdAorCSAgICAgICMgZm9yIGR1cGxpY2F0ZSByZW1vdmFsLgorCSAgICAgIGNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgICAqKQorCQljYXNlICIgJG5ld19saWJzICIgaW4KKwkJKiIgJGRlcGxpYiAiKikgOzsKKwkJKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCQllc2FjCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkbmV3X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopCisJICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKKwlkb25lICMgZm9yIHZhcgorICAgICAgZmkKKyAgICAgICMgTGFzdCBzdGVwOiByZW1vdmUgcnVudGltZSBsaWJzIGZyb20gZGVwZW5kZW5jeV9saWJzCisgICAgICAjICh0aGV5IHN0YXkgaW4gZGVwbGlicykKKyAgICAgIHRtcF9saWJzPQorICAgICAgZm9yIGkgaW4gJGRlcGVuZGVuY3lfbGlicyA7IGRvCisJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICIgaW4KKwkqIiAkaSAiKikKKwkgIGk9IiIKKwkgIDs7CisJZXNhYworCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGkiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0kdG1wX2xpYnMKKyAgICBkb25lICMgZm9yIHBhc3MKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisgICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKyAgICBmaQorCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBvbGRsaWIpCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDs7CisgICAgICBlc2FjCisKKyAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCisgICAgICBmdW5jX2FwcGVuZCBvYmpzICIkb2xkX2RlcGxpYnMiCisgICAgICA7OworCisgICAgbGliKQorICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgorICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgorICAgICAgbGliKikKKwlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwl0ZXN0ICIkbW9kdWxlIiA9IG5vICYmIFwKKwkgIGZ1bmNfZmF0YWxfaGVscCAibGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIKKworCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCisJICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwllbHNlCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBsaWJuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIgorCWVsc2UKKwkgIGVjaG8KKwkgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKKwkgICRFQ0hPICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRvYmpzIgorCWZpCisgICAgICBmaQorCisgICAgICB0ZXN0ICIkZGxzZWxmIiAhPSBubyAmJiBcCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfd2FybmluZyAiaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiCisKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMSIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KKwkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwl0ZXN0IC1uICIkdmluZm8iICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorCisJdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJc2hpZnQKKwlJRlM9IiRzYXZlX2lmcyIKKworCXRlc3QgLW4gIiQ3IiAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgInRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIKKworCSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCisJIyB0aGlzIHJldGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIC5sYSBmaWxlcyBhbmQgYXR0ZW1wdHMKKwkjIHRvIG1ha2UgdGhlIGNvZGUgYmVsb3cgYSBiaXQgbW9yZSBjb21wcmVoZW5zaWJsZQorCisJY2FzZSAkdmluZm9fbnVtYmVyIGluCisJeWVzKQorCSAgbnVtYmVyX21ham9yPSIkMSIKKwkgIG51bWJlcl9taW5vcj0iJDIiCisJICBudW1iZXJfcmV2aXNpb249IiQzIgorCSAgIworCSAgIyBUaGVyZSBhcmUgcmVhbGx5IG9ubHkgdHdvIGtpbmRzIC0tIHRob3NlIHRoYXQKKwkgICMgdXNlIHRoZSBjdXJyZW50IHJldmlzaW9uIGFzIHRoZSBtYWpvciB2ZXJzaW9uCisJICAjIGFuZCB0aG9zZSB0aGF0IHN1YnRyYWN0IGFnZSBhbmQgdXNlIGFnZSBhcworCSAgIyBhIG1pbm9yIHZlcnNpb24uICBCdXQsIHRoZW4gdGhlcmUgaXMgaXJpeAorCSAgIyB3aGljaCBoYXMgYW4gZXh0cmEgMSBhZGRlZCBqdXN0IGZvciBmdW4KKwkgICMKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgIyBjb3JyZWN0IGxpbnV4IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisJICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3N8bm9uZSkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX3JldmlzaW9uIgorCSAgICA7OworCSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHFueHxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGx0X2lyaXhfaW5jcmVtZW50PW5vCisJICAgIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgOzsKKworCW9zZikKKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRhZ2UKKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKwkgIGRvbmUKKworCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgorCSAgZnVuY19hcHBlbmQgdmVyc3RyaW5nICI6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXFueCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgorICAgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRzeW1maWxlb2JqIgorICAgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKworICAgICAgaWYgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbms7IHRoZW4KKwkjIFJlbW92ZSBvdXIgb3V0cHV0cywgYnV0IGRvbid0IHJlbW92ZSBvYmplY3QgZmlsZXMgc2luY2UgdGhleQorCSMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gY29tcGlsaW5nIFBJQyBvYmplY3RzLgorCXJlbW92ZWxpc3Q9CisJdGVtcHJlbW92ZWxpc3Q9YCRFQ0hPICIkb3V0cHV0X29iamRpci8qImAKKwlmb3IgcCBpbiAkdGVtcHJlbW92ZWxpc3Q7IGRvCisJICBjYXNlICRwIGluCisJICAgICouJG9iamV4dCB8ICouZ2NubykKKwkgICAgICAgOzsKKwkgICAgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgfCAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qIHwgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKikKKwkgICAgICAgaWYgdGVzdCAiWCRwcmVjaW91c19maWxlc19yZWdleCIgIT0gIlgiOyB0aGVuCisJCSBpZiAkRUNITyAiJHAiIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQorCQkgdGhlbgorCQkgICBjb250aW51ZQorCQkgZmkKKwkgICAgICAgZmkKKwkgICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJZnVuY19hcHBlbmQgb2xkbGlicyAiICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisKKwkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCisJb2xkb2Jqcz0iJG9ianMgImAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiL1wuJHtsaWJleHR9JC9kOyAkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgorICAgICAgI2ZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisgICAgICAjCWxpYl9zZWFyY2hfcGF0aD1gJEVDSE8gIiRsaWJfc2VhcmNoX3BhdGggIiB8ICRTRUQgInMlICRwYXRoICUgJWciYAorICAgICAgIwlkZXBsaWJzPWAkRUNITyAiJGRlcGxpYnMgIiB8ICRTRUQgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICAjCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICRTRUQgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICAjZG9uZQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwl0ZW1wX3hycGF0aD0KKwlmb3IgbGliZGlyIGluICR4cnBhdGg7IGRvCisJICBmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkgIGZ1bmNfYXBwZW5kIHRlbXBfeHJwYXRoICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorCWZpCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKKyAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKKyAgICAgIGRsZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KKwljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICAjIE1ha2Ugc3VyZSBkbHByZWZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzCisgICAgICBvbGRfZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMiCisgICAgICBkbHByZWZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RscHJlZmlsZXM7IGRvCisJY2FzZSAiJGRscHJlZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyogfCAqLSotaGFpa3UqKQorCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIDs7CisJICAqLSotbmV0YnNkKikKKwkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICA7OworCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQorCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCisJICAgIDs7CisJICAqKQorCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIC1sYyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCisJIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgorCW5hbWVfc2F2ZT0kbmFtZQorCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQorCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQorCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKKwltYWpvcl9zYXZlPSRtYWpvcgorCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCisJIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCisJIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/CisJcmVsZWFzZT0iIgorCXZlcnN1ZmZpeD0iIgorCW1ham9yPSIiCisJbmV3ZGVwbGlicz0KKwlkcm9wcGVkZGVwcz1ubworCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJcGFzc19hbGwpCisJICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgKiIgJGkgIiopCisJCSAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCSAgICBpPSIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCQkgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAorCQkgIGRlcGxpYl9tYXRjaD0kMQorCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICBlbHNlCisJCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgIGVjaG8KKwkJICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgorCQkgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgZWNobyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgICAgaT0iIgorCQkgICAgICA7OworCQkgICAgZXNhYworCQkgIGZpCisJCSAgaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCQkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCisJCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAorCQkgICAgZGVwbGliX21hdGNoPSQxCisJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgIGVsc2UKKwkJICAgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAgIGVjaG8KKwkJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICBlY2hvICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgICBmaQorCQkgIGZpCisJCWVsc2UKKwkJICBkcm9wcGVkZGVwcz15ZXMKKwkJICBlY2hvCisJCSAgJEVDSE8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKKwkJICBlY2hvICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgIGZpCisJICA7OworCWZpbGVfbWFnaWMqKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfZ2xvYiI7IHRoZW4KKwkJICBsaWJuYW1lZ2xvYj1gZnVuY19lY2hvX2FsbCAiJGxpYm5hbWUiIHwgJFNFRCAtZSAkZmlsZV9tYWdpY19nbG9iYAorCQllbHNlCisJCSAgbGlibmFtZWdsb2I9JGxpYm5hbWUKKwkJZmkKKwkJdGVzdCAiJHdhbnRfbm9jYXNlZ2xvYiIgPSB5ZXMgJiYgbm9jYXNlZ2xvYj1gc2hvcHQgLXAgbm9jYXNlZ2xvYmAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgaWYgdGVzdCAiJHdhbnRfbm9jYXNlZ2xvYiIgPSB5ZXM7IHRoZW4KKwkJICAgIHNob3B0IC1zIG5vY2FzZWdsb2IKKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZWdsb2JbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICAgICRub2Nhc2VnbG9iCisJCSAgZWxzZQorCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lZ2xvYlsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZpCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgfAorCQkJICRHUkVQICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJEVDSE8gIiRwb3RsaWIiIHwgJFNFRCAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIHwKKwkJCSAkU0VEIC1lIDEwcSB8CisJCQkgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJCWZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCQlhX2RlcGxpYj0iIgorCQkJYnJlYWsgMgorCQkgICAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwltYXRjaF9wYXR0ZXJuKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0CisJCSAgICBpZiBldmFsICJcJEVDSE8gXCIkcG90ZW50X2xpYlwiIiAyPi9kZXYvbnVsbCB8ICRTRUQgMTBxIHwgXAorCQkgICAgICAgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICAgICAgYV9kZXBsaWI9IiIKKwkJICAgICAgYnJlYWsgMgorCQkgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgorCQllbHNlCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJEVDSE8gIioqKiB1c2luZyBhIHJlZ2V4IHBhdHRlcm4uIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncy8gLWxjJC8vOyBzLyAtW0xSXVteIF0qLy9nJ2AKKwkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgZm9yIGkgaW4gJHByZWRlcHMgJHBvc3RkZXBzIDsgZG8KKwkgICAgICAjIGNhbid0IHVzZSBYc2VkIGJlbG93LCBiZWNhdXNlICRpIG1pZ2h0IGNvbnRhaW4gJy8nCisJICAgICAgdG1wX2RlcGxpYnM9YCRFQ0hPICIgJHRtcF9kZXBsaWJzIiB8ICRTRUQgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBjYXNlICR0bXBfZGVwbGlicyBpbgorCSAgKlshXAlcIF0qKQorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgZWxzZQorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCisJICAgIGZpCisJICAgIGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKKwltYWpvcj0kbWFqb3Jfc2F2ZQorCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQorCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQorCW5hbWU9JG5hbWVfc2F2ZQorCisJY2FzZSAkaG9zdCBpbgorCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IHdpdGggdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgIG5ld2RlcGxpYnM9YCRFQ0hPICIgJG5ld2RlcGxpYnMiIHwgJFNFRCAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICBlY2hvCisJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgorCSAgICAkRUNITyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCisJICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICBlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgorCSAgICBlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgorCSAgICBlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgorCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgIGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICBlY2hvICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisJZmkKKwkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKKwlkZXBsaWJzPSRuZXdkZXBsaWJzCisgICAgICBmaQorICAgICAgIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgorICAgICAgY2FzZSAkaG9zdCBpbgorCSotKi1kYXJ3aW4qKQorCSAgbmV3ZGVwbGlicz1gJEVDSE8gIiAkbmV3ZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCSAgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBkZXBsaWJzPWAkRUNITyAiICRkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICA7OworICAgICAgZXNhYworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBmdW5jX2FwcGVuZCBuZXdfbGlicyAiIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCisKKyAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KKyAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIGRsbmFtZT0KKworICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQorICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFJlbW92ZSAke3dsfSBpbnN0YW5jZXMgd2hlbiBsaW5raW5nIHdpdGggbGQuCisJIyBGSVhNRTogc2hvdWxkIHRlc3QgdGhlIHJpZ2h0IF9jbWRzIHZhcmlhYmxlLgorCWNhc2UgJGFyY2hpdmVfY21kcyBpbgorCSAgKlwkTERcICopIHdsPSA7OworICAgICAgICBlc2FjCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKwkgIGhhcmRjb2RlX2xpYmRpcnM9CisJICBkZXBfcnBhdGg9CisJICBycGF0aD0iJGZpbmFsaXplX3JwYXRoIgorCSAgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkJbGliZGlyPSRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQKKwkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkJZWxzZQorCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICAgIDs7CisJCSAgKikKKwkJICAgIGZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCSAgICAgIGVsc2UKKwkJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCQlmdW5jX2FwcGVuZCBkZXBfcnBhdGggIiAkZmxhZyIKKwkgICAgICBmaQorCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBkb25lCisJICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwkgICAgZXZhbCAiZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGZ1bmNfYXBwZW5kIGxpbmtuYW1lcyAiICRsaW5rIgorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZDEgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgIyBUYWtlIHRoZSBub3JtYWwgYnJhbmNoIGlmIHRoZSBubV9maWxlX2xpc3Rfc3BlYyBicmFuY2gKKwkgICAgICAjIGRvZXNuJ3Qgd29yayBvciBpZiB0b29sIGNvbnZlcnNpb24gaXMgbm90IG5lZWRlZC4KKwkgICAgICBjYXNlICRubV9maWxlX2xpc3Rfc3BlY34kdG9fdG9vbF9maWxlX2NtZCBpbgorCQkqfmZ1bmNfY29udmVydF9maWxlX25vb3AgfCAqfmZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIHwgfiopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9eWVzCisJCSAgZXZhbCBjbWQ9XCIkY21kMVwiCisJCSAgZnVuY19sZW4gIiAkY21kIgorCQkgIGxlbj0kZnVuY19sZW5fcmVzdWx0CisJCSAgOzsKKwkJKikKKwkJICB0cnlfbm9ybWFsX2JyYW5jaD1ubworCQkgIDs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR0cnlfbm9ybWFsX2JyYW5jaCIgPSB5ZXMgXAorCQkgJiYgeyB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgXAorCQkgICAgICB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgfQorCSAgICAgIHRoZW4KKwkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JworCQlza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsaWYgdGVzdCAtbiAiJG5tX2ZpbGVfbGlzdF9zcGVjIjsgdGhlbgorCQlmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCQlvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisJCXNhdmVfbGlib2Jqcz0kbGlib2JqcworCQlzYXZlX291dHB1dD0kb3V0cHV0CisJCW91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5ubQorCQlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkJbGlib2Jqcz0kbm1fZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJCWZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkJZnVuY192ZXJib3NlICJjcmVhdGluZyAkTk0gaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgorCQlmb3Igb2JqIGluICRzYXZlX2xpYm9ianM7IGRvCisJCSAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJCSAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJCWRvbmUgPiAiJG91dHB1dCIKKwkJZXZhbCBjbWQ9XCIkY21kMVwiCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJb3V0cHV0PSRzYXZlX291dHB1dAorCQlsaWJvYmpzPSRzYXZlX2xpYm9ianMKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbHNlCisJCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgorCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgorCQlza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJworCWZpCisKKwlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCisJICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQorCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgorCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCWZpCisKKwl0bXBfZGVwbGlicz0KKwlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICBjYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkgICoiICR0ZXN0X2RlcGxpYiAiKikgOzsKKwkgICopCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9kZXBsaWJzICIgJHRlc3RfZGVwbGliIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisKKwlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiICYmCisJICAgIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzICYmCisJICAgIHRlc3QgLXogIiRsaWJvYmpzIjsgdGhlbgorCSAgICAjIGV4dHJhY3QgdGhlIGFyY2hpdmVzLCBzbyB3ZSBoYXZlIG9iamVjdHMgdG8gbGlzdC4KKwkgICAgIyBUT0RPOiBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGp1c3QgZXh0cmFjdCBvbmUgYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJICAgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIgJiYKKwkgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdCAmJgorCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZQorCSAgIyBvciwgaWYgdXNpbmcgR05VIGxkIGFuZCBza2lwcGVkX2V4cG9ydCBpcyBub3QgOiwgdXNlIGEgbGlua2VyCisJICAjIHNjcmlwdC4KKworCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQorCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQorCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKKwkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCisJICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55CisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCisJICAjIHRoZSBzcGVjLgorCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgZmkKKwkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKKwkgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisJICBvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisKKwkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCisJICAjIGluaXRpYWxpemUgayB0byBvbmUuCisJICB0ZXN0X2NtZHM9CisJICBjb25jYXRfY21kcz0KKwkgIG9iamxpc3Q9CisJICBsYXN0X3JvYmo9CisJICBrPTEKKworCSAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmtzY3JpcHQKKwkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBHTlUgbGQgc2NyaXB0OiAkb3V0cHV0IgorCSAgICBlY2hvICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBlY2hvICcpJyA+PiAkb3V0cHV0CisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIgorCSAgZWxzZQorCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisJICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgICAgICBsZW49JGxlbjAKKworCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICAgIGRvCisJCWZ1bmNfbGVuICIgJG9iaiIKKwkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8CisJCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCQllbHNlCisJCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCisJCSAgICByZWxvYWRfb2Jqcz0kb2JqbGlzdAorCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9IiAkb2JqIgorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkb3V0cHV0IgorCisJICAgIGVsc2UKKwkgICAgICBvdXRwdXQ9CisJICAgIGZpCisKKwkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBsaWJvYmpzPSRvdXRwdXQKKwkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCisJICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkb3B0X3NpbGVudCB8fCB7CisJCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICB9CisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkJbHRfZXhpdD0kPworCisJCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCQlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJCSAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkJICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSAgICAkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQorCQlmaQorCisJCWV4aXQgJGx0X2V4aXQKKwkgICAgICB9CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKworICAgICAgICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICAgICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgICAgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCisJICAgICAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAgICAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICAgICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgICAgICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCSAgICBmaQorCSAgZmkKKworCSAgbGlib2Jqcz0kb3V0cHV0CisJICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KKwkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZmkKKwkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCisJICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KKworCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRkZWxmaWxlcyI7IHRoZW4KKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgdG8gJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRSTSAkZGVsZmlsZXNcIgorCWZpCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCSAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwlmaQorCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCSAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICB9CisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCSAgICBsdF9leGl0PSQ/CisKKwkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPworCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwkgICAgZmkKKwkgIGZpCisKKwkgIGV4aXQgJEVYSVRfU1VDQ0VTUworCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKKworCWxpYm9iaj0kb3V0cHV0CisJZnVuY19sbzJvICIkbGlib2JqIgorCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCisgICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCisgICAgICB3bD0KKworICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBidWlsZGluZyBzaGFyZWQsIHdlIG5lZWQgdG8gdXNlIG5vbl9waWNfb2JqcworICAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIGxpYm9ianM9IiRub25fcGljX29iamVjdHMiCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgL1wubGliJC9kOyAkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotZGFyd2luKikKKwkjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCisJIyBCdXQgaXMgc3VwcG9zZWRseSBmaXhlZCBvbiAxMC40IG9yIGxhdGVyICh5YXkhKS4KKwlpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCisJICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9IGluCisJICAgIDEwLlswMTIzXSkKKwkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCSMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICIgJGZpbmFsaXplX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwk7OworICAgICAgZXNhYworCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGNvbXBpbGVfZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBjb21waWxlX2RlcGxpYnM9IiRuZXdfbGlicyIKKworCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRmaW5hbGl6ZV9kZXBsaWJzIgorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JGxpYmRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmNlZ2NjKiB8ICptaW5ndzMyY2UqKQorICAgICAgICAjIERpc2FibGUgd3JhcHBlcnMgZm9yIGNlZ2NjIGFuZCBtaW5ndzMyY2UgaG9zdHMsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgorICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICA7OworICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAiJHdyYXBwZXJzX3JlcXVpcmVkIiA9IG5vOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkgIHBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZycgLWUgJ3MlQFRPT0xfT1VUUFVUQCUnIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiJyVnJ2AKKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisJZmkKKworCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IicKKwlmaQorCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgorCSRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisJIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKworCWZ1bmNfd2FybmluZyAidGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiCisJZnVuY193YXJuaW5nICJcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTRUQgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworICAgICAgaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIgorCXBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbHNlCisJICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCisJcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkc3ltZmlsZW9iaiIKKwkgIGZpCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKworCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcworCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKworCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQorCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCisJIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKKwkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZworCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5CisJIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgorCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCisJICAgIGRvCisJICAgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKwkgIDoKKwllbHNlCisJICBlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKwkgIGZ1bmNfbWtkaXJfcCAiJGdlbnRvcCIKKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgIGNvdW50ZXI9MQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICBvYmpiYXNlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQlmdW5jX2FyaXRoICRjb3VudGVyICsgMQorCQljb3VudGVyPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQljYXNlICIgJG9sZG9ianMgIiBpbgorCQkqW1wgL10iJG5ld29iaiAiKikgOzsKKwkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OworCQllc2FjCisJICAgICAgZG9uZQorCSAgICAgIGZ1bmNfc2hvd19ldmFsICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKKwkgICAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlmdW5jX3RvX3Rvb2xfZmlsZSAiJG9sZGxpYiIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwl0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCisJZnVuY19sZW4gIiAkY21kcyIKKwlsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCWlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsaWYgdGVzdCAtbiAiJGFyY2hpdmVyX2xpc3Rfc3BlYyI7IHRoZW4KKwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgY29tbWFuZCBmaWxlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIGZvciBvYmogaW4gJG9sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCSAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIKKwkgIGRvbmUgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQKKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQiCisJICBvbGRvYmpzPSIgJGFyY2hpdmVyX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCisJZWxzZQorCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKKwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIHNhdmVfUkFOTElCPSRSQU5MSUIKKwkgIFJBTkxJQj06CisJICBvYmpsaXN0PQorCSAgY29uY2F0X2NtZHM9CisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICAjIElzIHRoZXJlIGEgYmV0dGVyIHdheSBvZiBmaW5kaW5nIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgbGlzdD8KKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgbGFzdF9vbGRvYmo9JG9iagorCSAgZG9uZQorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCisJICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgIGxlbj0kbGVuMAorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2xlbiAiICRvYmoiCisJICAgIGZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKKwkgICAgbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKKwkgICAgaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJICAgICAgOgorCSAgICBlbHNlCisJICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZworCSAgICAgIG9sZG9ianM9JG9iamxpc3QKKwkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgorCQlSQU5MSUI9JHNhdmVfUkFOTElCCisJICAgICAgZmkKKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgICAgIG9iamxpc3Q9CisJICAgICAgbGVuPSRsZW4wCisJICAgIGZpCisJICBkb25lCisJICBSQU5MSUI9JHNhdmVfUkFOTElCCisJICBvbGRvYmpzPSRvYmpsaXN0CisJICBpZiB0ZXN0ICJYJG9sZG9ianMiID0gIlgiIDsgdGhlbgorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzXCIKKwkgIGVsc2UKKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc35cJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGdlbmVyYXRlZCIgJiYgXAorICAgICAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciRnZW5lcmF0ZWQiCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAqLmxhKQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisgICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZWxzZQorCSAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHZhcl92YWx1ZSIKKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKKyAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCisJcmVsaW5rX2NvbW1hbmQ9CisgICAgICBmaQorCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCisJICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgKi5sYSkKKwkJZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdGAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAke2x0X3N5c3Jvb3Q6Kz19JGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAtTCopCisJCWZ1bmNfc3RyaXBuYW1lIC1MICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLUwkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgIC1SKikKKwkJZnVuY19zdHJpcG5hbWUgLVIgJycgIiRkZXBsaWIiCisJCWZ1bmNfcmVwbGFjZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQlmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAtUiRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQiCisJCTs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgKikgZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgorCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQorCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KKwkJIyB0aGUgbGlicmFyeToKKwkJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCWZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAke2x0X3N5c3Jvb3Q6Kz19JGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9CisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OworCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKwkgIGZpCisJICAkUk0gJG91dHB1dAorCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCisJICAjIEluIGZhY3QsIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgdXNlIHRoaXMgY29kZSBmb3IgYWxsIHRhcmdldAorCSAgIyBzeXN0ZW1zIHRoYXQgY2FuJ3QgaGFyZC1jb2RlIGxpYnJhcnkgcGF0aHMgaW50byB0aGVpciBleGVjdXRhYmxlcworCSAgIyBhbmQgdGhhdCBoYXZlIG5vIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUgaW5kZXBlbmRlbnQgb2YgUEFUSCwKKwkgICMgYnV0IGl0IHR1cm5zIG91dCB3ZSBjYW4ndCBlYXNpbHkgZGV0ZXJtaW5lIHRoYXQgZnJvbSBpbnNwZWN0aW5nCisJICAjIGxpYnRvb2wgdmFyaWFibGVzLCBzbyB3ZSBoYXZlIHRvIGhhcmQtY29kZSB0aGUgT1NzIHRvIHdoaWNoIGl0CisJICAjIGFwcGxpZXMgaGVyZTsgYXQgdGhlIG1vbWVudCwgdGhhdCBtZWFucyBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhlIFBFCisJICAjIG9iamVjdCBmb3JtYXQgd2l0aCBETEwgZmlsZXMuICBTZWUgdGhlIGxvbmcgY29tbWVudCBhdCB0aGUgdG9wIG9mCisJICAjIHRlc3RzL2JpbmRpci5hdCBmb3IgZnVsbCBkZXRhaWxzLgorCSAgdGRsbmFtZT0kZGxuYW1lCisJICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KKwkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsIHwgKmNlZ2NjKiwqbGFpLHllcyxubywqLmRsbCkKKwkgICAgICAjIElmIGEgLWJpbmRpciBhcmd1bWVudCB3YXMgc3VwcGxpZWQsIHBsYWNlIHRoZSBkbGwgdGhlcmUuCisJICAgICAgaWYgdGVzdCAieCRiaW5kaXIiICE9IHggOworCSAgICAgIHRoZW4KKwkJZnVuY19yZWxhdGl2ZV9wYXRoICIkaW5zdGFsbF9saWJkaXIiICIkYmluZGlyIgorCQl0ZGxuYW1lPSRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0JGRsbmFtZQorCSAgICAgIGVsc2UKKwkJIyBPdGhlcndpc2UgZmFsbCBiYWNrIG9uIGhldXJpc3RpYy4KKwkJdGRsbmFtZT0uLi9iaW4vJGRsbmFtZQorCSAgICAgIGZpCisJICAgICAgOzsKKwkgIGVzYWMKKwkgICRFQ0hPID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSckbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JyR3ZWFrX2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJEVDSE8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgfQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgZnVuY19zaG93X2V2YWwgJyggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRvdXRwdXRuYW1lIiAmJiAkTE5fUyAiLi4vJG91dHB1dG5hbWUiICIkb3V0cHV0bmFtZSIgKScgJ2V4aXQgJD8nCisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gbGluayB8fCB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB9ICYmCisgICAgZnVuY19tb2RlX2xpbmsgJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfdW5pbnN0YWxsIGFyZy4uLgorZnVuY19tb2RlX3VuaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBSTT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKyAgICBybWZvcmNlPQorICAgIGV4aXRfc3RhdHVzPTAKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIGZ1bmNfYXBwZW5kIFJNICIgJGFyZyIgOzsKKyAgICAgICopIGZ1bmNfYXBwZW5kIGZpbGVzICIgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICB0ZXN0IC16ICIkUk0iICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIgorCisgICAgcm1kaXJzPQorCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisgICAgICBkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gWC47IHRoZW4KKwlvZGlyPSIkb2JqZGlyIgorICAgICAgZWxzZQorCW9kaXI9IiRkaXIvJG9iamRpciIKKyAgICAgIGZpCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgJiYgb2Rpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgdGhlbgorCWNhc2UgIiAkcm1kaXJzICIgaW4KKwkgICoiICRvZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgcm1kaXJzICIgJG9kaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmIHsgdGVzdCAtTCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAorCSB7IHRlc3QgLWggIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJOgorICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKwlleGl0X3N0YXR1cz0xCisJY29udGludWUKKyAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICRuYW1lIGluCisgICAgICAqLmxhKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKwlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQorCisJICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbiIKKwkgIGRvbmUKKwkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG9wdF9tb2RlIiBpbgorCSAgY2xlYW4pCisJICAgIGNhc2UgIiAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICoiICRkbG5hbWUgIiopIDs7CisJICAgICopIHRlc3QgLW4gIiRkbG5hbWUiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kZGxuYW1lIiA7OworCSAgICBlc2FjCisJICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbmFtZSAkb2Rpci8ke25hbWV9aSIKKwkgICAgOzsKKwkgIHVuaW5zdGFsbCkKKwkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgJ3Rlc3QgIiRybWZvcmNlIiA9IHllcyB8fCBleGl0X3N0YXR1cz0xJworCSAgICBmaQorCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQorCisJICAjIEFkZCBQSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KKwkgIGlmIHRlc3QgLW4gIiRwaWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRkaXIvJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiICYmCisJICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICopCisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IGNsZWFuIDsgdGhlbgorCSAgbm9leGVuYW1lPSRuYW1lCisJICBjYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG5hbWUiCisJICAgIG5vZXhlbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICMgJGZpbGUgd2l0aCAuZXhlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gcm1maWxlcywKKwkgICAgIyBhZGQgJGZpbGUgd2l0aG91dCAuZXhlCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgorCSAgaWYgZnVuY19sdHdyYXBwZXJfcCAiJGZpbGUiOyB0aGVuCisJICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCisJICAgICAgcmVsaW5rX2NvbW1hbmQ9CisJICAgICAgZnVuY19zb3VyY2UgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICAgZWxzZQorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQorCSAgICBmaQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbmFtZSAkb2Rpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvbHQtJG5hbWUiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvbHQtJHtub2V4ZW5hbWV9LmMiCisJICAgIGZpCisJICBmaQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkUk0gJHJtZmlsZXMiICdleGl0X3N0YXR1cz0xJworICAgIGRvbmUKKworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgInJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBleGl0ICRleGl0X3N0YXR1cworfQorCit7IHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IGNsZWFuOyB9ICYmCisgICAgZnVuY19tb2RlX3VuaW5zdGFsbCAkezErIiRAIn0KKwordGVzdCAteiAiJG9wdF9tb2RlIiAmJiB7CisgIGhlbHA9IiRnZW5lcmljX2hlbHAiCisgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIE1PREUiCit9CisKK3Rlc3QgLXogIiRleGVjX2NtZCIgJiYgXAorICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkb3B0X21vZGUnIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKK2V4aXQgJGV4aXRfc3RhdHVzCisKKworIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitidWlsZF9saWJ0b29sX2xpYnM9bm8KK2J1aWxkX29sZF9saWJzPXllcworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpIGVjaG8gbm87OyAqKSBlY2hvIHllczs7IGVzYWNgCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CisjIHZpOnN3PTIKKwpkaWZmIC0tZ2l0IGEvYXV0by9taXNzaW5nIGIvYXV0by9taXNzaW5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiOTg5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvL21pc3NpbmcKQEAgLTAsMCArMSwyMTUgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHdyYXBwZXIgZm9yIGEgZmV3IHBvdGVudGlhbGx5IG1pc3NpbmcgR05VIHByb2dyYW1zLgorCitzY3JpcHR2ZXJzaW9uPTIwMTMtMTAtMjguMTM7ICMgVVRDCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBlY2hvIDE+JjIgIlRyeSAnJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitjYXNlICQxIGluCisKKyAgLS1pcy1saWdodHdlaWdodCkKKyAgICAjIFVzZWQgYnkgb3VyIGF1dG9jb25mIG1hY3JvcyB0byBjaGVjayB3aGV0aGVyIHRoZSBhdmFpbGFibGUgbWlzc2luZworICAgICMgc2NyaXB0IGlzIG1vZGVybiBlbm91Z2guCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLXJ1bikKKyAgICAjIEJhY2stY29tcGF0IHdpdGggdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IG9sZGVyIGF1dG9tYWtlLgorICAgIHNoaWZ0CisgICAgOzsKKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK1J1biAnUFJPR1JBTSBbQVJHVU1FTlRdLi4uJywgcmV0dXJuaW5nIGEgcHJvcGVyIGFkdmljZSB3aGVuIHRoaXMgZmFpbHMgZHVlCit0byBQUk9HUkFNIGJlaW5nIG1pc3Npbmcgb3IgdG9vIG9sZC4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorCitTdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6CisgIGFjbG9jYWwgICBhdXRvY29uZiAgYXV0b2hlYWRlciAgIGF1dG9tNHRlICBhdXRvbWFrZSAgbWFrZWluZm8KKyAgYmlzb24gICAgIHlhY2MgICAgICBmbGV4ICAgICAgICAgbGV4ICAgICAgIGhlbHAybWFuCisKK1ZlcnNpb24gc3VmZml4ZXMgdG8gUFJPR1JBTSBhcyB3ZWxsIGFzIHRoZSBwcmVmaXhlcyAnZ251LScsICdnbnUnLCBhbmQKKydnJyBhcmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHRoZSBuYW1lLgorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IHVua25vd24gJyQxJyBvcHRpb24iCisgICAgZWNobyAxPiYyICJUcnkgJyQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgZXhpdCAxCisgICAgOzsKKworZXNhYworCisjIFJ1biB0aGUgZ2l2ZW4gcHJvZ3JhbSwgcmVtZW1iZXIgaXRzIGV4aXQgc3RhdHVzLgorIiRAIjsgc3Q9JD8KKworIyBJZiBpdCBzdWNjZWVkZWQsIHdlIGFyZSBkb25lLgordGVzdCAkc3QgLWVxIDAgJiYgZXhpdCAwCisKKyMgQWxzbyBleGl0IG5vdyBpZiB3ZSBpdCBmYWlsZWQgKG9yIHdhc24ndCBmb3VuZCksIGFuZCAnLS12ZXJzaW9uJyB3YXMKKyMgcGFzc2VkOyBzdWNoIGFuIG9wdGlvbiBpcyBwYXNzZWQgbW9zdCBsaWtlbHkgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlCisjIHByb2dyYW0gaXMgcHJlc2VudCBhbmQgd29ya3MuCitjYXNlICQyIGluIC0tdmVyc2lvbnwtLWhlbHApIGV4aXQgJHN0OzsgZXNhYworCisjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zIHdoZW4gdGhlIHVzZXIKKyMgdHJpZXMgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24gYSBmaWxlIHRoYXQgcmVxdWlyZXMgYQorIyBtaW5pbXVtIHZlcnNpb24uCitpZiB0ZXN0ICRzdCAtZXEgNjM7IHRoZW4KKyAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgorZWxpZiB0ZXN0ICRzdCAtZXEgMTI3OyB0aGVuCisgICMgUHJvZ3JhbSB3YXMgbWlzc2luZy4KKyAgbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgorZWxzZQorICAjIFByb2dyYW0gd2FzIGZvdW5kIGFuZCBleGVjdXRlZCwgYnV0IGZhaWxlZC4gIEdpdmUgdXAuCisgIGV4aXQgJHN0CitmaQorCitwZXJsX1VSTD1odHRwOi8vd3d3LnBlcmwub3JnLworZmxleF9VUkw9aHR0cDovL2ZsZXguc291cmNlZm9yZ2UubmV0LworZ251X3NvZnR3YXJlX1VSTD1odHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUKKworcHJvZ3JhbV9kZXRhaWxzICgpCit7CisgIGNhc2UgJDEgaW4KKyAgICBhY2xvY2FsfGF1dG9tYWtlKQorICAgICAgZWNobyAiVGhlICckMScgcHJvZ3JhbSBpcyBwYXJ0IG9mIHRoZSBHTlUgQXV0b21ha2UgcGFja2FnZToiCisgICAgICBlY2hvICI8JGdudV9zb2Z0d2FyZV9VUkwvYXV0b21ha2U+IgorICAgICAgZWNobyAiSXQgYWxzbyByZXF1aXJlcyBHTlUgQXV0b2NvbmYsIEdOVSBtNCBhbmQgUGVybCBpbiBvcmRlciB0byBydW46IgorICAgICAgZWNobyAiPCRnbnVfc29mdHdhcmVfVVJML2F1dG9jb25mPiIKKyAgICAgIGVjaG8gIjwkZ251X3NvZnR3YXJlX1VSTC9tNC8+IgorICAgICAgZWNobyAiPCRwZXJsX1VSTD4iCisgICAgICA7OworICAgIGF1dG9jb25mfGF1dG9tNHRlfGF1dG9oZWFkZXIpCisgICAgICBlY2hvICJUaGUgJyQxJyBwcm9ncmFtIGlzIHBhcnQgb2YgdGhlIEdOVSBBdXRvY29uZiBwYWNrYWdlOiIKKyAgICAgIGVjaG8gIjwkZ251X3NvZnR3YXJlX1VSTC9hdXRvY29uZi8+IgorICAgICAgZWNobyAiSXQgYWxzbyByZXF1aXJlcyBHTlUgbTQgYW5kIFBlcmwgaW4gb3JkZXIgdG8gcnVuOiIKKyAgICAgIGVjaG8gIjwkZ251X3NvZnR3YXJlX1VSTC9tNC8+IgorICAgICAgZWNobyAiPCRwZXJsX1VSTD4iCisgICAgICA7OworICBlc2FjCit9CisKK2dpdmVfYWR2aWNlICgpCit7CisgICMgTm9ybWFsaXplIHByb2dyYW0gbmFtZSB0byBjaGVjayBmb3IuCisgIG5vcm1hbGl6ZWRfcHJvZ3JhbT1gZWNobyAiJDEiIHwgc2VkICcKKyAgICBzL15nbnUtLy87IHQKKyAgICBzL15nbnUvLzsgdAorICAgIHMvXmcvLzsgdCdgCisKKyAgcHJpbnRmICclc1xuJyAiJyQxJyBpcyAkbXNnLiIKKworICBjb25maWd1cmVfZGVwcz0iJ2NvbmZpZ3VyZS5hYycgb3IgbTQgZmlsZXMgaW5jbHVkZWQgYnkgJ2NvbmZpZ3VyZS5hYyciCisgIGNhc2UgJG5vcm1hbGl6ZWRfcHJvZ3JhbSBpbgorICAgIGF1dG9jb25mKikKKyAgICAgIGVjaG8gIllvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmIHlvdSBtb2RpZmllZCAnY29uZmlndXJlLmFjJywiCisgICAgICBlY2hvICJvciBtNCBmaWxlcyBpbmNsdWRlZCBieSBpdC4iCisgICAgICBwcm9ncmFtX2RldGFpbHMgJ2F1dG9jb25mJworICAgICAgOzsKKyAgICBhdXRvaGVhZGVyKikKKyAgICAgIGVjaG8gIllvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmIHlvdSBtb2RpZmllZCAnYWNjb25maWcuaCcgb3IiCisgICAgICBlY2hvICIkY29uZmlndXJlX2RlcHMuIgorICAgICAgcHJvZ3JhbV9kZXRhaWxzICdhdXRvaGVhZGVyJworICAgICAgOzsKKyAgICBhdXRvbWFrZSopCisgICAgICBlY2hvICJZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZiB5b3UgbW9kaWZpZWQgJ01ha2VmaWxlLmFtJyBvciIKKyAgICAgIGVjaG8gIiRjb25maWd1cmVfZGVwcy4iCisgICAgICBwcm9ncmFtX2RldGFpbHMgJ2F1dG9tYWtlJworICAgICAgOzsKKyAgICBhY2xvY2FsKikKKyAgICAgIGVjaG8gIllvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmIHlvdSBtb2RpZmllZCAnYWNpbmNsdWRlLm00JyBvciIKKyAgICAgIGVjaG8gIiRjb25maWd1cmVfZGVwcy4iCisgICAgICBwcm9ncmFtX2RldGFpbHMgJ2FjbG9jYWwnCisgICAgICA7OworICAgYXV0b200dGUqKQorICAgICAgZWNobyAiWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBtYWludGFpbmVyIGZpbGVzIHRoYXQgcmVxdWlyZSIKKyAgICAgIGVjaG8gInRoZSAnYXV0b200dGUnIHByb2dyYW0gdG8gYmUgcmVidWlsdC4iCisgICAgICBwcm9ncmFtX2RldGFpbHMgJ2F1dG9tNHRlJworICAgICAgOzsKKyAgICBiaXNvbip8eWFjYyopCisgICAgICBlY2hvICJZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZiB5b3UgbW9kaWZpZWQgYSAnLnknIGZpbGUuIgorICAgICAgZWNobyAiWW91IG1heSB3YW50IHRvIGluc3RhbGwgdGhlIEdOVSBCaXNvbiBwYWNrYWdlOiIKKyAgICAgIGVjaG8gIjwkZ251X3NvZnR3YXJlX1VSTC9iaXNvbi8+IgorICAgICAgOzsKKyAgICBsZXgqfGZsZXgqKQorICAgICAgZWNobyAiWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYgeW91IG1vZGlmaWVkIGEgJy5sJyBmaWxlLiIKKyAgICAgIGVjaG8gIllvdSBtYXkgd2FudCB0byBpbnN0YWxsIHRoZSBGYXN0IExleGljYWwgQW5hbHl6ZXIgcGFja2FnZToiCisgICAgICBlY2hvICI8JGZsZXhfVVJMPiIKKyAgICAgIDs7CisgICAgaGVscDJtYW4qKQorICAgICAgZWNobyAiWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSIgXAorICAgICAgICAgICAib2YgYSBtYW4gcGFnZS4iCisgICAgICBlY2hvICJZb3UgbWF5IHdhbnQgdG8gaW5zdGFsbCB0aGUgR05VIEhlbHAybWFuIHBhY2thZ2U6IgorICAgICAgZWNobyAiPCRnbnVfc29mdHdhcmVfVVJML2hlbHAybWFuLz4iCisgICAgOzsKKyAgICBtYWtlaW5mbyopCisgICAgICBlY2hvICJZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZiB5b3UgbW9kaWZpZWQgYSAnLnRleGknIGZpbGUsIG9yIgorICAgICAgZWNobyAiYW55IG90aGVyIGZpbGUgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiIKKyAgICAgIGVjaG8gIllvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFRleGluZm8gcGFja2FnZToiCisgICAgICBlY2hvICI8JGdudV9zb2Z0d2FyZV9VUkwvdGV4aW5mby8+IgorICAgICAgZWNobyAiVGhlIHNwdXJpb3VzIG1ha2VpbmZvIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YiCisgICAgICBlY2hvICJ1c2luZyBhIGJ1Z2d5ICdtYWtlJyAoQUlYLCBEVSwgSVJJWCksIGluIHdoaWNoIGNhc2UgeW91IG1pZ2h0IgorICAgICAgZWNobyAid2FudCB0byBpbnN0YWxsIEdOVSBtYWtlOiIKKyAgICAgIGVjaG8gIjwkZ251X3NvZnR3YXJlX1VSTC9tYWtlLz4iCisgICAgICA7OworICAgICopCisgICAgICBlY2hvICJZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZSBwcm9wZXIiCisgICAgICBlY2hvICJ0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlICdSRUFETUUnIGZpbGUsIGl0IgorICAgICAgZWNobyAib2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZyIKKyAgICAgIGVjaG8gInRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiIKKyAgICAgIGVjaG8gImNhc2Ugc29tZSBvdGhlciBwYWNrYWdlIGNvbnRhaW5zIHRoaXMgbWlzc2luZyAnJDEnIHByb2dyYW0uIgorICAgICAgOzsKKyAgZXNhYworfQorCitnaXZlX2FkdmljZSAiJDEiIHwgc2VkIC1lICcxcy9eL1dBUk5JTkc6IC8nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgLWUgJzIsJHMvXi8gICAgICAgICAvJyA+JjIKKworIyBQcm9wYWdhdGUgdGhlIGNvcnJlY3QgZXhpdCBzdGF0dXMgKGV4cGVjdGVkIHRvIGJlIDEyNyBmb3IgYSBwcm9ncmFtCisjIG5vdCBmb3VuZCwgNjMgZm9yIGEgcHJvZ3JhbSB0aGF0IGZhaWxlZCBkdWUgdG8gdmVyc2lvbiBtaXNtYXRjaCkuCitleGl0ICRzdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkLnNoIGIvYnVpbGQtYW5kcm9pZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGFmZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtYW5kcm9pZC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKK3NldCAtZXYKK1ZFUlNJT049NS4yMgorRFNUPXN0dW5uZWwtJFZFUlNJT04tYW5kcm9pZAorCisjIHRvIGJ1aWxkIFpsaWI6CisjIGV4cG9ydCBDSE9TVD1hcm0tbGludXgtYW5kcm9pZGVhYmkKKyMgLi9jb25maWd1cmUgLS1zdGF0aWMgLS1wcmVmaXg9L29wdC9hbmRyb2lkZWFiaS9zeXNyb290CisjIG1ha2UKKyMgbWFrZSBpbnN0YWxsCisKKyMgdG8gYnVpbGQgT3BlblNTTDoKKyMgZXhwb3J0IENDPWFybS1saW51eC1hbmRyb2lkZWFiaS1nY2MKKyMgLi9Db25maWd1cmUgbGludXgtYXJtdjQgdGhyZWFkcyBuby1zaGFyZWQgemxpYiBuby1kc28gLS1vcGVuc3NsZGlyPS9vcHQvYW5kcm9pZGVhYmkvc3lzcm9vdAorIyBtYWtlCisjIG1ha2UgaW5zdGFsbAorCit0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgZGlzdGNsZWFuCitta2RpciAtcCBiaW4vYW5kcm9pZAorY2QgYmluL2FuZHJvaWQKKy4uLy4uL2NvbmZpZ3VyZSAtLXdpdGgtc3lzcm9vdCAtLWJ1aWxkPWk2ODYtcGMtbGludXgtZ251IC0taG9zdD1hcm0tbGludXgtYW5kcm9pZGVhYmkgLS1wcmVmaXg9L2RhdGEvbG9jYWwKK21ha2UgY2xlYW4KK21ha2UKK2NkIC4uLy4uCitta2RpciAkRFNUCitjcCBiaW4vYW5kcm9pZC9zcmMvc3R1bm5lbCAkRFNUCisjIGFybS1saW51eC1hbmRyb2lkZWFiaS1zdHJpcCAkRFNUL3N0dW5uZWwgJERTVC9vcGVuc3NsCisjIGNwIC9vcHQvYW5kcm9pZGVhYmkvc3lzcm9vdC9iaW4vb3BlbnNzbCAkRFNUCisjIGFybS1saW51eC1hbmRyb2lkZWFiaS1zdHJpcCAkRFNUL29wZW5zc2wKK3ppcCAtciAkRFNULnppcCAkRFNUCitybSAtcmYgJERTVAorIyBzaGEyNTZzdW0gJERTVC56aXAKKyMgbXYgJERTVC56aXAgLi4vZGlzdC8KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzcwZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlCkBAIC0wLDAgKzEsMTc0MjggQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBzdHVubmVsIDUuMjIuCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCAxOTk4LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisjIFVzZSBhIHByb3BlciBpbnRlcm5hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbnN1cmUgd2UgZG9uJ3QgZmFsbAorICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCisgIGlmIHRlc3QgeCIke19hc19jYW5fcmVleGVjfSIgIT0geG5vICYmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisgICAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYzsKKyAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKyMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCitCQVNIX0VOVj0vZGV2L251bGwKK0VOVj0vZGV2L251bGwKKyh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorY2FzZSAkLSBpbiAjICgoKCgKKyAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisgICp2KiApIGFzX29wdHM9LXYgOzsKKyAgKngqICkgYXNfb3B0cz0teCA7OworICAqICkgYXNfb3B0cz0gOzsKK2VzYWMKK2V4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisjIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKKyMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KKyRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKK2FzX2ZuX2V4aXQgMjU1CisgIGZpCisgICMgV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHByb3BhZ2F0ZSB0byBvdGhlciBzdWJwcm9jZXNzZXMuCisgICAgICAgICAgeyBfYXNfY2FuX3JlZXhlYz07IHVuc2V0IF9hc19jYW5fcmVleGVjO30KK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQordGVzdCAteCAvIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCisKKyAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCisgICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgICAgICAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKyMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCitCQVNIX0VOVj0vZGV2L251bGwKK0VOVj0vZGV2L251bGwKKyh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorY2FzZSAkLSBpbiAjICgoKCgKKyAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisgICp2KiApIGFzX29wdHM9LXYgOzsKKyAgKngqICkgYXNfb3B0cz0teCA7OworICAqICkgYXNfb3B0cz0gOzsKK2VzYWMKK2V4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisjIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKKyMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KKyRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKK2V4aXQgMjU1CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCiskMDogaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKKyQwOiBtZXNzYWdlLiBUaGVuIGluc3RhbGwgYSBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1bgorJDA6IHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4iCisgIGZpCisgIGV4aXQgMQorZmkKK2ZpCitmaQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2V4cG9ydCBTSEVMTAorIyBVbnNldCBtb3JlIHZhcmlhYmxlcyBrbm93biB0byBpbnRlcmZlcmUgd2l0aCBiZWhhdmlvciBvZiBjb21tb24gdG9vbHMuCitDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQordW5zZXQgQ0xJQ09MT1JfRk9SQ0UgR1JFUF9PUFRJT05TCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBTaGVsbCBGdW5jdGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCisKKyMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgorYXNfZm5fZXhlY3V0YWJsZV9wICgpCit7CisgIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKK30gIyBhc19mbl9leGVjdXRhYmxlX3AKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKworICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CisKKyAgIyBJZiB3ZSBoYWQgdG8gcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwsIHdlJ3JlIGVuc3VyZWQgdG8gaGF2ZQorICAjIGFscmVhZHkgZG9uZSB0aGF0LCBzbyBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGRvIHNvIGFnYWluIGFuZCBmYWxsCisgICMgaW4gYW4gaW5maW5pdGUgbG9vcC4gIFRoaXMgaGFzIGFscmVhZHkgaGFwcGVuZWQgaW4gcHJhY3RpY2UuCisgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWMKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcFInCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXBSJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcFInCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfdGVzdF94PSd0ZXN0IC14JworYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nc3R1bm5lbCcKK1BBQ0tBR0VfVEFSTkFNRT0nc3R1bm5lbCcKK1BBQ0tBR0VfVkVSU0lPTj0nNS4yMicKK1BBQ0tBR0VfU1RSSU5HPSdzdHVubmVsIDUuMjInCitQQUNLQUdFX0JVR1JFUE9SVD0nJworUEFDS0FHRV9VUkw9JycKKworYWNfdW5pcXVlX2ZpbGU9InNyYy9zdHVubmVsLmMiCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J2FtX19FWEVFWFRfRkFMU0UKK2FtX19FWEVFWFRfVFJVRQorTFRMSUJPQkpTCitMSUJPQkpTCitTU0xESVIKK0RFRkFVTFRfR1JPVVAKK1JBTkRPTV9GSUxFCitMSUJUT09MX0RFUFMKK0NQUAorT1RPT0w2NAorT1RPT0wKK0xJUE8KK05NRURJVAorRFNZTVVUSUwKK01BTklGRVNUX1RPT0wKK1JBTkxJQgorYWNfY3RfQVIKK0FSCitETExUT09MCitPQkpEVU1QCitMTl9TCitOTQorYWNfY3RfRFVNUEJJTgorRFVNUEJJTgorTEQKK0ZHUkVQCitFR1JFUAorR1JFUAorU0VECitMSUJUT09MCitQVEhSRUFEX0NGTEFHUworUFRIUkVBRF9MSUJTCitQVEhSRUFEX0NDCitheF9wdGhyZWFkX2NvbmZpZworYW1fX2Zhc3RkZXBDQ19GQUxTRQorYW1fX2Zhc3RkZXBDQ19UUlVFCitDQ0RFUE1PREUKK2FtX19ub2RlcAorQU1ERVBCQUNLU0xBU0gKK0FNREVQX0ZBTFNFCitBTURFUF9UUlVFCithbV9fcXVvdGUKK2FtX19pbmNsdWRlCitERVBESVIKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUworQ0MKK2hvc3Rfb3MKK2hvc3RfdmVuZG9yCitob3N0X2NwdQoraG9zdAorYnVpbGRfb3MKK2J1aWxkX3ZlbmRvcgorYnVpbGRfY3B1CitidWlsZAorQVVUSE9SX1RFU1RTX0ZBTFNFCitBVVRIT1JfVEVTVFNfVFJVRQorQU1fQkFDS1NMQVNICitBTV9ERUZBVUxUX1ZFUkJPU0lUWQorQU1fREVGQVVMVF9WCitBTV9WCithbV9fdW50YXIKK2FtX190YXIKK0FNVEFSCithbV9fbGVhZGluZ19kb3QKK1NFVF9NQUtFCitBV0sKK21rZGlyX3AKK01LRElSX1AKK0lOU1RBTExfU1RSSVBfUFJPR1JBTQorU1RSSVAKK2luc3RhbGxfc2gKK01BS0VJTkZPCitBVVRPSEVBREVSCitBVVRPTUFLRQorQVVUT0NPTkYKK0FDTE9DQUwKK1ZFUlNJT04KK1BBQ0tBR0UKK0NZR1BBVEhfVworYW1fX2lzcmMKK0lOU1RBTExfREFUQQorSU5TVEFMTF9TQ1JJUFQKK0lOU1RBTExfUFJPR1JBTQordGFyZ2V0X2FsaWFzCitob3N0X2FsaWFzCitidWlsZF9hbGlhcworTElCUworRUNIT19UCitFQ0hPX04KK0VDSE9fQworREVGUworbWFuZGlyCitsb2NhbGVkaXIKK2xpYmRpcgorcHNkaXIKK3BkZmRpcgorZHZpZGlyCitodG1sZGlyCitpbmZvZGlyCitkb2NkaXIKK29sZGluY2x1ZGVkaXIKK2luY2x1ZGVkaXIKK2xvY2Fsc3RhdGVkaXIKK3NoYXJlZHN0YXRlZGlyCitzeXNjb25mZGlyCitkYXRhZGlyCitkYXRhcm9vdGRpcgorbGliZXhlY2Rpcgorc2JpbmRpcgorYmluZGlyCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCitwcmVmaXgKK2V4ZWNfcHJlZml4CitQQUNLQUdFX1VSTAorUEFDS0FHRV9CVUdSRVBPUlQKK1BBQ0tBR0VfU1RSSU5HCitQQUNLQUdFX1ZFUlNJT04KK1BBQ0tBR0VfVEFSTkFNRQorUEFDS0FHRV9OQU1FCitQQVRIX1NFUEFSQVRPUgorU0hFTEwnCithY19zdWJzdF9maWxlcz0nJworYWNfdXNlcl9vcHRzPScKK2VuYWJsZV9vcHRpb25fY2hlY2tpbmcKK2VuYWJsZV9zaWxlbnRfcnVsZXMKK2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCit3aXRoX3RocmVhZHMKK2VuYWJsZV9zdGF0aWMKK2VuYWJsZV9zaGFyZWQKK3dpdGhfcGljCitlbmFibGVfZmFzdF9pbnN0YWxsCit3aXRoX2dudV9sZAord2l0aF9zeXNyb290CitlbmFibGVfbGlidG9vbF9sb2NrCit3aXRoX2VnZF9zb2NrZXQKK3dpdGhfcmFuZG9tCitlbmFibGVfaXB2NgorZW5hYmxlX2ZpcHMKK2VuYWJsZV9zeXN0ZW1kCitlbmFibGVfbGlid3JhcAord2l0aF9zc2wKKycKKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCitob3N0X2FsaWFzCit0YXJnZXRfYWxpYXMKK0NDCitDRkxBR1MKK0xERkxBR1MKK0xJQlMKK0NQUEZMQUdTCitDUFAnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBzdHVubmVsIDUuMjIgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCisgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKyAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCisKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCisgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQorICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9zdHVubmVsXQorICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHN0dW5uZWwgNS4yMjoiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgbGVzcyB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogIm1ha2UgVj0xIikKKyAgLS1kaXNhYmxlLXNpbGVudC1ydWxlcyAgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86ICJtYWtlIFY9MCIpCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD1ub10KKyAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10KKyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKQorICAtLWRpc2FibGUtaXB2NiAgICAgICAgICBkaXNhYmxlIElQdjYgc3VwcG9ydAorICAtLWRpc2FibGUtZmlwcyAgICAgICAgICBkaXNhYmxlIE9wZW5TU0wgRklQUyBzdXBwb3J0CisgIC0tZGlzYWJsZS1zeXN0ZW1kICAgICAgIGRpc2FibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbiBzdXBwb3J0CisgIC0tZGlzYWJsZS1saWJ3cmFwICAgICAgIGRpc2FibGUgVENQIHdyYXBwZXJzIHN1cHBvcnQKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC10aHJlYWRzPW1vZGVsICAgIHNlbGVjdCB0aHJlYWRpbmcgbW9kZWwgKHVjb250ZXh0L3B0aHJlYWQvZm9yaykKKyAgLS13aXRoLXBpY1s9UEtHU10gICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhdCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10KKyAgLS13aXRoLXN5c3Jvb3Q9RElSIFNlYXJjaCBmb3IgZGVwZW5kZW50IGxpYnJhcmllcyB3aXRoaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgdGhlIGNvbXBpbGVyJ3Mgc3lzcm9vdCBpZiBub3Qgc3BlY2lmaWVkKS4KKyAgLS13aXRoLWVnZC1zb2NrZXQ9RklMRSAgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCBwYXRoCisgIC0td2l0aC1yYW5kb209RklMRSAgICAgIHJlYWQgcmFuZG9tbmVzcyBmcm9tIGZpbGUgKGRlZmF1bHQ9L2Rldi91cmFuZG9tKQorICAtLXdpdGgtc3NsPURJUiAgICAgICAgICBsb2NhdGlvbiBvZiBpbnN0YWxsZWQgU1NMIGxpYnJhcmllcy9pbmNsdWRlIGZpbGVzCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorc3R1bm5lbCBjb25maWd1cmUgNS4yMgorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5CisKK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSB0ZXN0IC14IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KKyMgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY3BwCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9ydW4KKworIyBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBGVU5DIGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5CithY19mbl9jX2NoZWNrX2Z1bmMgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfZnVuYworCisjIGFjX2ZuX2NfZmluZF9pbnRYX3QgTElORU5PIEJJVFMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmRzIGEgc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19maW5kX2ludFhfdCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGludCQyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludCQyX3QuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1ubyIKKyAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCisgICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCisgICAgIGZvciBhY190eXBlIGluIGludCQyX3QgJ2ludCcgJ2xvbmcgaW50JyBcCisJICdsb25nIGxvbmcgaW50JyAnc2hvcnQgaW50JyAnc2lnbmVkIGNoYXInOyBkbworICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisJICAgICBlbnVtIHsgTiA9ICQyIC8gMiAtIDEgfTsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoMCA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorCSAgICAgICAgZW51bSB7IE4gPSAkMiAvIDIgLSAxIH07CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpCisJCSA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDIpKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGNhc2UgJGFjX3R5cGUgaW4gIygKKyAgaW50JDJfdCkgOgorICAgIGV2YWwgIiQzPXllcyIgOzsgIygKKyAgKikgOgorICAgIGV2YWwgIiQzPVwkYWNfdHlwZSIgOzsKK2VzYWMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICBpZiBldmFsIHRlc3QgXCJ4XCQiJDMiXCIgPSB4Im5vIjsgdGhlbiA6CisKK2Vsc2UKKyAgYnJlYWsKK2ZpCisgICAgIGRvbmUKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2ZpbmRfaW50WF90CisKKyMgYWNfZm5fY19maW5kX3VpbnRYX3QgTElORU5PIEJJVFMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaW5kcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfZmluZF91aW50WF90ICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdWludCQyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQkMl90Li4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgorICAgICAjIHRoYW4gaGFsZiBvZiB0aGUgZXhwZWN0ZWQgdGFyZ2V0IHdpZHRoLgorICAgICBmb3IgYWNfdHlwZSBpbiB1aW50JDJfdCAndW5zaWduZWQgaW50JyAndW5zaWduZWQgbG9uZyBpbnQnIFwKKwkgJ3Vuc2lnbmVkIGxvbmcgbG9uZyBpbnQnICd1bnNpZ25lZCBzaG9ydCBpbnQnICd1bnNpZ25lZCBjaGFyJzsgZG8KKyAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKCRhY190eXBlKSAtMSA+PiAoJDIgLyAyIC0gMSkpID4+ICgkMiAvIDIgLSAxKSA9PSAzKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXNlICRhY190eXBlIGluICMoCisgIHVpbnQkMl90KSA6CisgICAgZXZhbCAiJDM9eWVzIiA7OyAjKAorICAqKSA6CisgICAgZXZhbCAiJDM9XCRhY190eXBlIiA7OworZXNhYworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgIGlmIGV2YWwgdGVzdCBcInhcJCIkMyJcIiA9IHgibm8iOyB0aGVuIDoKKworZWxzZQorICBicmVhaworZmkKKyAgICAgZG9uZQorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfZmluZF91aW50WF90CisKKyMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCisjIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfdHlwZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPW5vIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgkMikpCisJIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCgkMikpKQorCSAgICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGV2YWwgIiQzPXllcyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX3R5cGUKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKKyAgeWVzOm5vOiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAorCisjIGFjX2ZuX2NfY2hlY2tfbWVtYmVyIExJTkVOTyBBR0dSIE1FTUJFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmllcyB0byBmaW5kIGlmIHRoZSBmaWVsZCBNRU1CRVIgZXhpc3RzIGluIHR5cGUgQUdHUiwgYWZ0ZXIgaW5jbHVkaW5nCisjIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfbWVtYmVyICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIuJDMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLiQzLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQ0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDUKK2ludAorbWFpbiAoKQoreworc3RhdGljICQyIGFjX2FnZ3I7CitpZiAoYWNfYWdnci4kMykKK3JldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQ0PXllcyIKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDUKK2ludAorbWFpbiAoKQoreworc3RhdGljICQyIGFjX2FnZ3I7CitpZiAoc2l6ZW9mIGFjX2FnZ3IuJDMpCityZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkND15ZXMiCitlbHNlCisgIGV2YWwgIiQ0PW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDQKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfbWVtYmVyCitjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSBzdHVubmVsICRhc19tZSA1LjIyLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KKwlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKwlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorCWVsc2UKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKK2ZpCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiIgPiY2O30KK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGF1dG8gIiRzcmNkaXIiL2F1dG87IGRvCisgIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gYXV0byBcIiRzcmNkaXJcIi9hdXRvIiAiJExJTkVOTyIgNQorZmkKKworIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCisjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorCisKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBzcmMvY29uZmlnLmgiCisKKworYW1fX2FwaV92ZXJzaW9uPScxLjE0JworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gIygoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQorIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKKyMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KK2FtX2xmPScKKycKK2Nhc2UgYHB3ZGAgaW4KKyAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZl0qKQorICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZSIgIiRMSU5FTk8iIDU7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXSopCisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6ICckc3JjZGlyJyIgIiRMSU5FTk8iIDU7OworZXNhYworCisjIERvICdzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBhbV9oYXNfc2xlcHQ9bm8KKyAgIGZvciBhbV90cnkgaW4gMSAyOyBkbworICAgICBlY2hvICJ0aW1lc3RhbXAsIHNsZXB0OiAkYW1faGFzX3NsZXB0IiA+IGNvbmZ0ZXN0LmZpbGUKKyAgICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKwkjIC1MIGRpZG4ndCB3b3JrLgorCXNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCisgICAgIGZpCisgICAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisJJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKwkjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisJIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorCSMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKwkjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisJYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KKyAgYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgICAgZmkKKyAgICAgaWYgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZSB8fCB0ZXN0ICRhbV90cnkgLWVxIDI7IHRoZW4KKyAgICAgICBicmVhaworICAgICBmaQorICAgICAjIEp1c3QgaW4gY2FzZS4KKyAgICAgc2xlZXAgMQorICAgICBhbV9oYXNfc2xlcHQ9eWVzCisgICBkb25lCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyMgSWYgd2UgZGlkbid0IHNsZWVwLCB3ZSBzdGlsbCBuZWVkIHRvIGVuc3VyZSB0aW1lIHN0YW1wcyBvZiBjb25maWcuc3RhdHVzIGFuZAorIyBnZW5lcmF0ZWQgZmlsZXMgYXJlIHN0cmljdGx5IG5ld2VyLgorYW1fc2xlZXBfcGlkPQoraWYgZ3JlcCAnc2xlcHQ6IG5vJyBjb25mdGVzdC5maWxlID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAoIHNsZWVwIDEgKSAmCisgIGFtX3NsZWVwX3BpZD0kIQorZmkKKworcm0gLWYgY29uZnRlc3QuZmlsZQorCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIERvdWJsZSBhbnkgXCBvciAkLgorIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KK2FjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAorCisjIEV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoLgorYW1fYXV4X2Rpcj1gY2QgIiRhY19hdXhfZGlyIiAmJiBwd2RgCisKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1pcy1saWdodHdlaWdodCI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJ21pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJ21pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitpZiB0ZXN0IHgiJHtpbnN0YWxsX3NofSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAnJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCciIDs7CisgICopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL2luc3RhbGwtc2giCisgIGVzYWMKK2ZpCisKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nICdzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gIm1ha2UgaW5zdGFsbC1zdHJpcCIuICBIb3dldmVyICdzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSAnU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKworZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRNS0RJUl9QIjsgdGhlbgorICBpZiAke2FjX2N2X3BhdGhfbWtkaXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbworCSBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwkgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIHx8IGNvbnRpbnVlCisJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAorCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKKwkgICAgICAgYWNfY3ZfcGF0aF9ta2Rpcj0kYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0CisJICAgICAgIGJyZWFrIDM7OworCSAgIGVzYWMKKwkgZG9uZQorICAgICAgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorCisgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCisgICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIE1LRElSX1A9IiRhY19pbnN0YWxsX3NoIC1kIgorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUtESVJfUCIgPiY1CiskYXNfZWNobyAiJE1LRElSX1AiID4mNjsgfQorCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVdLPSRhY19jdl9wcm9nX0FXSworaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQorJGFzX2VjaG8gIiRBV0siID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhaworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2lsZW50LXJ1bGVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbGVudF9ydWxlcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3NpbGVudF9ydWxlczsKK2ZpCisKK2Nhc2UgJGVuYWJsZV9zaWxlbnRfcnVsZXMgaW4gIyAoKCgKKyAgeWVzKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0wOzsKKyAgIG5vKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0xOzsKKyAgICAqKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0xOzsKK2VzYWMKK2FtX21ha2U9JHtNQUtFLW1ha2V9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFtX21ha2Ugc3VwcG9ydHMgbmVzdGVkIHZhcmlhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhbV9tYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXMuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiAkYXNfZWNobyAnVFJVRT0kKEJBUiQoVikpCitCQVIwPWZhbHNlCitCQVIxPXRydWUKK1Y9MQorYW1fX2RvaXQ6CisJQCQoVFJVRSkKKy5QSE9OWTogYW1fX2RvaXQnIHwgJGFtX21ha2UgLWYgLSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9eWVzCitlbHNlCisgIGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzPW5vCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyIgPiY2OyB9CitpZiB0ZXN0ICRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyA9IHllczsgdGhlbgorICAgIEFNX1Y9JyQoViknCisgIEFNX0RFRkFVTFRfVj0nJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSknCitlbHNlCisgIEFNX1Y9JEFNX0RFRkFVTFRfVkVSQk9TSVRZCisgIEFNX0RFRkFVTFRfVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKK2ZpCitBTV9CQUNLU0xBU0g9J1wnCisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBhbV9faXNyYz0nIC1JJChzcmNkaXIpJworICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAic291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiICIkTElORU5PIiA1CisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KKyBQQUNLQUdFPSdzdHVubmVsJworIFZFUlNJT049JzUuMjInCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitfQUNFT0YKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9CisKKworQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQorCisKK01BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQorCisjIEZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFRvIGJlIHJlbW92ZWQgb25jZSBBdXRvbWFrZSAxLjkueAorIyBkaWVzIG91dCBmb3IgZ29vZC4gIEZvciBtb3JlIGJhY2tncm91bmQsIHNlZToKKyMgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9hdXRvbWFrZS8yMDEyLTA3L21zZzAwMDAxLmh0bWw+CisjIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYXV0b21ha2UvMjAxMi0wNy9tc2cwMDAxNC5odG1sPgorbWtkaXJfcD0nJChNS0RJUl9QKScKKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAorIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCitBTVRBUj0nJCR7VEFSLXRhcn0nCisKKworIyBXZSdsbCBsb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgorX2FtX3Rvb2xzPSdnbnV0YXIgIHBheCBjcGlvIG5vbmUnCisKK2FtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCisKKworCisKKworCisjIFBPU0lYIHdpbGwgc2F5IGluIGEgZnV0dXJlIHZlcnNpb24gdGhhdCBydW5uaW5nICJybSAtZiIgd2l0aCBubyBhcmd1bWVudAorIyBpcyBPSzsgYW5kIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBtYWtlIHRoYXQgYXNzdW1wdGlvbiBpbiBvdXIgTWFrZWZpbGUKKyMgcmVjaXBlcy4gIFNvIHVzZSBhbiBhZ2dyZXNzaXZlIHByb2JlIHRvIGNoZWNrIHRoYXQgdGhlIHVzYWdlIHdlIHdhbnQgaXMKKyMgYWN0dWFsbHkgc3VwcG9ydGVkICJpbiB0aGUgd2lsZCIgdG8gYW4gYWNjZXB0YWJsZSBkZWdyZWUuCisjIFNlZSBhdXRvbWFrZSBidWcjMTA4MjguCisjIFRvIG1ha2UgYW55IGlzc3VlIG1vcmUgdmlzaWJsZSwgY2F1c2UgdGhlIHJ1bm5pbmcgY29uZmlndXJlIHRvIGJlIGFib3J0ZWQKKyMgYnkgZGVmYXVsdCBpZiB0aGUgJ3JtJyBwcm9ncmFtIGluIHVzZSBkb2Vzbid0IG1hdGNoIG91ciBleHBlY3RhdGlvbnM7IHRoZQorIyB1c2VyIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHRob3VnaC4KK2lmIHJtIC1mICYmIHJtIC1mciAmJiBybSAtcmY7IHRoZW4gOiBPSzsgZWxzZQorICBjYXQgPiYyIDw8J0VORCcKK09vcHMhCisKK1lvdXIgJ3JtJyBwcm9ncmFtIHNlZW1zIHVuYWJsZSB0byBydW4gd2l0aG91dCBmaWxlIG9wZXJhbmRzIHNwZWNpZmllZAorb24gdGhlIGNvbW1hbmQgbGluZSwgZXZlbiB3aGVuIHRoZSAnLWYnIG9wdGlvbiBpcyBwcmVzZW50LiAgVGhpcyBpcyBjb250cmFyeQordG8gdGhlIGJlaGF2aW91ciBvZiBtb3N0IHJtIHByb2dyYW1zIG91dCB0aGVyZSwgYW5kIG5vdCBjb25mb3JtaW5nIHdpdGgKK3RoZSB1cGNvbWluZyBQT1NJWCBzdGFuZGFyZDogPGh0dHA6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTU0Mj4KKworUGxlYXNlIHRlbGwgYnVnLWF1dG9tYWtlQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sIGluY2x1ZGluZyB0aGUgdmFsdWUKK29mIHlvdXIgJFBBVEggYW5kIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4gIFRoaXMKK2NhbiBoZWxwIHVzIGltcHJvdmUgZnV0dXJlIGF1dG9tYWtlIHZlcnNpb25zLgorCitFTkQKKyAgaWYgdGVzdCB4IiRBQ0NFUFRfSU5GRVJJT1JfUk1fUFJPR1JBTSIgPSB4InllcyI7IHRoZW4KKyAgICBlY2hvICdDb25maWd1cmF0aW9uIHdpbGwgcHJvY2VlZCBhbnl3YXksIHNpbmNlIHlvdSBoYXZlIHNldCB0aGUnID4mMgorICAgIGVjaG8gJ0FDQ0VQVF9JTkZFUklPUl9STV9QUk9HUkFNIHZhcmlhYmxlIHRvICJ5ZXMiJyA+JjIKKyAgICBlY2hvID4mMgorICBlbHNlCisgICAgY2F0ID4mMiA8PCdFTkQnCitBYm9ydGluZyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLCB0byBlbnN1cmUgeW91IHRha2Ugbm90aWNlIG9mIHRoZSBpc3N1ZS4KKworWW91IGNhbiBkb3dubG9hZCBhbmQgaW5zdGFsbCBHTlUgY29yZXV0aWxzIHRvIGdldCBhbiAncm0nIGltcGxlbWVudGF0aW9uCit0aGF0IGJlaGF2ZXMgcHJvcGVybHk6IDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY29yZXV0aWxzLz4uCisKK0lmIHlvdSB3YW50IHRvIGNvbXBsZXRlIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MgdXNpbmcgeW91ciBwcm9ibGVtYXRpYworJ3JtJyBhbnl3YXksIGV4cG9ydCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUNDRVBUX0lORkVSSU9SX1JNX1BST0dSQU0KK3RvICJ5ZXMiLCBhbmQgcmUtcnVuIGNvbmZpZ3VyZS4KKworRU5ECisgICAgYXNfZm5fZXJyb3IgJD8gIllvdXIgJ3JtJyBwcm9ncmFtIGlzIGJhZCwgc29ycnkuIiAiJExJTkVOTyIgNQorICBmaQorZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBfR05VX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKKworCisgaWYgdGVzdCAtZCAiLmdpdCI7IHRoZW4KKyAgQVVUSE9SX1RFU1RTX1RSVUU9CisgIEFVVEhPUl9URVNUU19GQUxTRT0nIycKK2Vsc2UKKyAgQVVUSE9SX1RFU1RTX1RSVUU9JyMnCisgIEFVVEhPUl9URVNUU19GQUxTRT0KK2ZpCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CithY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2J1aWxkIGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSE9TVCAiJGhvc3QiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvIENQVV8kaG9zdF9jcHUgfCB0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4tIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX18gfCB0ciAtZGMgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwX2AgMQorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gVkVORE9SXyRob3N0X3ZlbmRvciB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li0gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfXyB8IHRyIC1kYyBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBfYCAxCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyBPU18kaG9zdF9vcyB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li0gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfXyB8IHRyIC1kYyBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBfYCAxCitfQUNFT0YKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCitybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9CitpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKKyByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCisjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitzdHJ1Y3Qgc3RhdDsKKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X3Byb2dfY2NfY19vKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisgICMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgorICAjIEZvbGxvd2luZyBBQ19QUk9HX0NDX0NfTywgd2UgZG8gdGhlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lCisgICMgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLAorICAjIHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KKyAgYW1fY3ZfcHJvZ19jY19jX289eWVzCisgIGZvciBhbV9pIGluIDEgMjsgZG8KKyAgICBpZiB7IGVjaG8gIiRhc19tZTokTElORU5POiAkQ0MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCIgPiY1CisgICAoJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQpID4mNSAyPiY1CisgICBhY19zdGF0dXM9JD8KKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIChleGl0ICRhY19zdGF0dXMpOyB9IFwKKyAgICAgICAgICYmIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQ7IHRoZW4KKyAgICAgIDogT0sKKyAgICBlbHNlCisgICAgICBhbV9jdl9wcm9nX2NjX2Nfbz1ubworICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIHJtIC1mIGNvcmUgY29uZnRlc3QqCisgIHVuc2V0IGFtX2kKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X3Byb2dfY2NfY19vIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfcHJvZ19jY19jX28iID4mNjsgfQoraWYgdGVzdCAiJGFtX2N2X3Byb2dfY2NfY19vIiAhPSB5ZXM7IHRoZW4KKyAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCisgICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgorICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCisgICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCisgICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgorICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgorZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgorCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCisKKworYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSAnbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQorcm0gLWYgY29uZmluYyBjb25mbWYKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7CitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCisgIGFtX19ub2RlcD0nX25vJworZmkKKyBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgQU1ERVBfVFJVRT0KKyAgQU1ERVBfRkFMU0U9JyMnCitlbHNlCisgIEFNREVQX1RSVUU9JyMnCisgIEFNREVQX0ZBTFNFPQorZmkKKworCisKK2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgJ0QnIC0tIGJlY2F1c2UgJy1NRCcgbWVhbnMgInB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCIuCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyAiOiA+IHN1Yi9jb25mdHN0JGkuaCIgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyAxMCAvYmluL3NoLgorICAgICAgZWNobyAnLyogZHVtbXkgKi8nID4gc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCAnLWMnIGFuZCAnLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgJy1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzLgorICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIGdjYykKKyAgICAgICMgVGhpcyBkZXBtb2RlIGNhdXNlcyBhIGNvbXBpbGVyIHJhY2UgaW4gdW5pdmVyc2FsIG1vZGUuCisgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQorICAgICAgOzsKKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIEFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQuCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayAnLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQorQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyBpZgorICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENDX1RSVUU9CisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9JyMnCitlbHNlCisgIGFtX19mYXN0ZGVwQ0NfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0KK2ZpCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCBcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCitTSEVMTCA9IC9iaW4vc2gKK2FsbDoKKwlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJworX0FDRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KKyAgKkBAQCUlJT0/Kj1AQEAlJSUqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7CisgICopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OworZXNhYworcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICBTRVRfTUFLRT0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRocmVhZCBtb2RlbCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRocmVhZCBtb2RlbCIgPiY2O30KKyMgdGhyZWFkIGRldGVjdGlvbiBzaG91bGQgYmUgZG9uZSBmaXJzdCwgYXMgaXQgbWF5IGNoYW5nZSB0aGUgQ0MgdmFyaWFibGUKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhyZWFkcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdGhyZWFkcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGhyZWFkczsKKyAgICBjYXNlICIkd2l0aHZhbCIgaW4KKyAgICAgICAgdWNvbnRleHQpCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFVDT05URVhUIG1vZGUgc2VsZWN0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogVUNPTlRFWFQgbW9kZSBzZWxlY3RlZCIgPiY2O30KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1VDT05URVhUIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICAgICA7OworICAgICAgICBwdGhyZWFkKQorICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQVEhSRUFEIG1vZGUgc2VsZWN0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUFRIUkVBRCBtb2RlIHNlbGVjdGVkIiA+JjY7fQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYXhfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTLi4uICIgPiY2OyB9CisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdGhyZWFkX2pvaW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBwdGhyZWFkX2pvaW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfcHRocmVhZF9vaz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRheF9wdGhyZWFkX29rIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorZmkKKworIyBXZSBtdXN0IGNoZWNrIGZvciB0aGUgdGhyZWFkcyBsaWJyYXJ5IHVuZGVyIGEgbnVtYmVyIG9mIGRpZmZlcmVudAorIyBuYW1lczsgdGhlIG9yZGVyaW5nIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBzeXN0ZW1zCisjIChlLmcuIERFQykgaGF2ZSBib3RoIC1scHRocmVhZCBhbmQgLWxwdGhyZWFkcywgd2hlcmUgb25lIG9mIHRoZQorIyBsaWJyYXJpZXMgaXMgYnJva2VuIChub24tUE9TSVgpLgorCisjIENyZWF0ZSBhIGxpc3Qgb2YgdGhyZWFkIGZsYWdzIHRvIHRyeS4gIEl0ZW1zIHN0YXJ0aW5nIHdpdGggYSAiLSIgYXJlCisjIEMgY29tcGlsZXIgZmxhZ3MsIGFuZCBvdGhlciBpdGVtcyBhcmUgbGlicmFyeSBuYW1lcywgZXhjZXB0IGZvciAibm9uZSIKKyMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2UgdHJ5IHdpdGhvdXQgYW55IGZsYWdzIGF0IGFsbCwgYW5kICJwdGhyZWFkLWNvbmZpZyIKKyMgd2hpY2ggaXMgYSBwcm9ncmFtIHJldHVybmluZyB0aGUgZmxhZ3MgZm9yIHRoZSBQdGggZW11bGF0aW9uIGxpYnJhcnkuCisKK2F4X3B0aHJlYWRfZmxhZ3M9InB0aHJlYWRzIG5vbmUgLUt0aHJlYWQgLWt0aHJlYWQgbHRocmVhZCAtcHRocmVhZCAtcHRocmVhZHMgLW10aHJlYWRzIHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQgcHRocmVhZC1jb25maWciCisKKyMgVGhlIG9yZGVyaW5nICppcyogKHNvbWV0aW1lcykgaW1wb3J0YW50LiAgU29tZSBub3RlcyBvbiB0aGUKKyMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisKKyMgcHRocmVhZHM6IEFJWCAobXVzdCBjaGVjayB0aGlzIGJlZm9yZSAtbHB0aHJlYWQpCisjIG5vbmU6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKyMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorIyBsdGhyZWFkOiBMaW51eFRocmVhZHMgcG9ydCBvbiBGcmVlQlNEIChhbHNvIHByZWZlcnJlZCB0byAtcHRocmVhZCkKKyMgLXB0aHJlYWQ6IExpbnV4L2djYyAoa2VybmVsIHRocmVhZHMpLCBCU0QvZ2NjICh1c2VybGFuZCB0aHJlYWRzKQorIyAtcHRocmVhZHM6IFNvbGFyaXMvZ2NjCisjIC1tdGhyZWFkczogTWluZ3czMi9nY2MsIEx5bngvZ2NjCisjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKyMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgJHtob3N0X29zfSBpbgorICAgICAgICBzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGF4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYXhfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKKworICAgICAgICBkYXJ3aW4qKQorICAgICAgICBheF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZCAkYXhfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworIyBDbGFuZyBkb2Vzbid0IGNvbnNpZGVyIHVucmVjb2duaXplZCBvcHRpb25zIGFuIGVycm9yIHVubGVzcyB3ZSBzcGVjaWZ5CisjIC1XZXJyb3IuIFdlIHRocm93IGluIHNvbWUgZXh0cmEgQ2xhbmctc3BlY2lmaWMgb3B0aW9ucyB0byBlbnN1cmUgdGhhdAorIyB0aGlzIGRvZXNuJ3QgaGFwcGVuIGZvciBHQ0MsIHdoaWNoIGFsc28gYWNjZXB0cyAtV2Vycm9yLgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGNvbXBpbGVyIG5lZWRzIC1XZXJyb3IgdG8gcmVqZWN0IHVua25vd24gZmxhZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgY29tcGlsZXIgbmVlZHMgLVdlcnJvciB0byByZWplY3QgdW5rbm93biBmbGFncy4uLiAiID4mNjsgfQorc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitheF9wdGhyZWFkX2V4dHJhX2ZsYWdzPSItV2Vycm9yIgorQ0ZMQUdTPSIkQ0ZMQUdTICRheF9wdGhyZWFkX2V4dHJhX2ZsYWdzIC1XdW5rbm93bi13YXJuaW5nLW9wdGlvbiAtV3NpemVvZi1hcnJheS1hcmd1bWVudCIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBmb28odm9pZCk7CitpbnQKK21haW4gKCkKK3sKK2ZvbygpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgYXhfcHRocmVhZF9leHRyYV9mbGFncz0KKyAgICAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCitmb3IgZmxhZyBpbiAkYXhfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFncyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3MuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgcHRocmVhZC1jb25maWcpCisgICAgICAgICAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwdGhyZWFkLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHRocmVhZC1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2F4X3B0aHJlYWRfY29uZmlnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGF4X3B0aHJlYWRfY29uZmlnIjsgdGhlbgorICBhY19jdl9wcm9nX2F4X3B0aHJlYWRfY29uZmlnPSIkYXhfcHRocmVhZF9jb25maWciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19heF9wdGhyZWFkX2NvbmZpZz0ieWVzIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2F4X3B0aHJlYWRfY29uZmlnIiAmJiBhY19jdl9wcm9nX2F4X3B0aHJlYWRfY29uZmlnPSJubyIKK2ZpCitmaQorYXhfcHRocmVhZF9jb25maWc9JGFjX2N2X3Byb2dfYXhfcHRocmVhZF9jb25maWcKK2lmIHRlc3QgLW4gIiRheF9wdGhyZWFkX2NvbmZpZyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9wdGhyZWFkX2NvbmZpZyIgPiY1CiskYXNfZWNobyAiJGF4X3B0aHJlYWRfY29uZmlnIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9ImBwdGhyZWFkLWNvbmZpZyAtLWxkZmxhZ3NgIGBwdGhyZWFkLWNvbmZpZyAtLWxpYnNgIgorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRheF9wdGhyZWFkX2V4dHJhX2ZsYWdzIgorCisgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKKyAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQorICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKKyAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKKyAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0CisgICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCisgICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCisgICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCisgICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIHJvdXRpbmUodm9pZCAqYSkgeyBhID0gMDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgKnN0YXJ0X3JvdXRpbmUodm9pZCAqYSkgeyByZXR1cm4gYTsgfQoraW50CittYWluICgpCit7CitwdGhyZWFkX3QgdGg7IHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGgsIDAsIHN0YXJ0X3JvdXRpbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jbGVhbnVwX3BvcCgwKSAvKiA7ICovCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfcHRocmVhZF9vaz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfcHRocmVhZF9vayIgPiY1CiskYXNfZWNobyAiJGF4X3B0aHJlYWRfb2siID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYXhfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgRGV0ZWN0IEFJWCBsb3NzYWdlOiBKT0lOQUJMRSBhdHRyaWJ1dGUgaXMgY2FsbGVkIFVOREVUQUNIRUQuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZS4uLiAiID4mNjsgfQorICAgICAgICBhdHRyX25hbWU9dW5rbm93bgorICAgICAgICBmb3IgYXR0ciBpbiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOyBkbworICAgICAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworaW50IGF0dHIgPSAkYXR0cjsgcmV0dXJuIGF0dHIgLyogOyAqLworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF0dHJfbmFtZT0kYXR0cjsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICBkb25lCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXR0cl9uYW1lIiA+JjUKKyRhc19lY2hvICIkYXR0cl9uYW1lIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAiJGF0dHJfbmFtZSIgIT0gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEU7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSAkYXR0cl9uYW1lCitfQUNFT0YKKworICAgICAgICBmaQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMuLi4gIiA+JjY7IH0KKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICR7aG9zdF9vc30gaW4KKyAgICAgICAgICAgIGFpeCogfCBmcmVlYnNkKiB8IGRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICBvc2YqIHwgaHB1eCopIGZsYWc9Ii1EX1JFRU5UUkFOVCI7OworICAgICAgICAgICAgc29sYXJpcyopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgZmxhZz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICMgVE9ETzogV2hhdCBhYm91dCBDbGFuZyBvbiBTb2xhcmlzPworICAgICAgICAgICAgICAgIGZsYWc9Ii1tdCAtRF9SRUVOVFJBTlQiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGZsYWciID4mNQorJGFzX2VjaG8gIiRmbGFnIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAieCRmbGFnIiAhPSB4bm87IHRoZW4KKyAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgUFRIUkVBRF9QUklPX0lOSEVSSVQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFBUSFJFQURfUFJJT19JTkhFUklULi4uICIgPiY2OyB9CitpZiAke2F4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgICAgICAgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBpID0gUFRIUkVBRF9QUklPX0lOSEVSSVQ7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQ9eWVzCitlbHNlCisgIGF4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQiID4mNQorJGFzX2VjaG8gIiRheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVCIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIngkYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQiID0gInh5ZXMiOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IGNvbXBpbGUgd2l0aCAqX3IgdmFyaWFudAorICAgICAgICBpZiB0ZXN0ICJ4JEdDQyIgIT0geHllczsgdGhlbgorICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgIGFpeCopCisgICAgICAgICAgICAgICAgY2FzZSAieC8kQ0MiIGluICMoCisgIHgqL2M4OXx4Ki9jODlfMTI4fHgqL2M5OXx4Ki9jOTlfMTI4fHgqL2NjfHgqL2NjMTI4fHgqL3hsY3x4Ki94bGNfdjZ8eCoveGxjMTI4fHgqL3hsYzEyOF92NikgOgorICAgICNoYW5kbGUgYWJzb2x1dGUgcGF0aCBkaWZmZXJlbnRseSBmcm9tIFBBVEggYmFzZWQgcHJvZ3JhbSBsb29rdXAKKyAgICAgICAgICAgICAgICAgICBjYXNlICJ4JENDIiBpbiAjKAorICB4LyopIDoKKyAgICBpZiBhc19mbl9leGVjdXRhYmxlX3AgJHtDQ31fcjsgdGhlbiA6CisgIFBUSFJFQURfQ0M9IiR7Q0N9X3IiCitmaSA7OyAjKAorICAqKSA6CisgICAgZm9yIGFjX3Byb2cgaW4gJHtDQ31fcgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1BUSFJFQURfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUFRIUkVBRF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19QVEhSRUFEX0NDPSIkUFRIUkVBRF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1BUSFJFQURfQ0M9JGFjX2N2X3Byb2dfUFRIUkVBRF9DQworaWYgdGVzdCAtbiAiJFBUSFJFQURfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFRIUkVBRF9DQyIgPiY1CiskYXNfZWNobyAiJFBUSFJFQURfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkUFRIUkVBRF9DQyIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRQVEhSRUFEX0NDIiB8fCBQVEhSRUFEX0NDPSIkQ0MiCisgOzsKK2VzYWMgOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGZpCitmaQorCit0ZXN0IC1uICIkUFRIUkVBRF9DQyIgfHwgUFRIUkVBRF9DQz0iJENDIgorCisKKworCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFRIUkVBRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICA6CitlbHNlCisgICAgICAgIGF4X3B0aHJlYWRfb2s9bm8KKworZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisgICAgICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgICAgIENDPSIkUFRIUkVBRF9DQyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BUSFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgIDs7CisgICAgICAgIGZvcmspCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZPUksgbW9kZSBzZWxlY3RlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGT1JLIG1vZGUgc2VsZWN0ZWQiID4mNjt9CisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9GT1JLIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gdGhyZWFkIG1vZGVsIFwiJHt3aXRodmFsfVwiIiAiJExJTkVOTyIgNQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKK2Vsc2UKKworICAgICMgZG8gbm90IGF0dGVtcHQgdG8gYXV0b2RldGVjdCBVQ09OVEVYVCB0aHJlYWRpbmcKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2F4X3B0aHJlYWRfb2s9bm8KKworIyBXZSB1c2VkIHRvIGNoZWNrIGZvciBwdGhyZWFkLmggZmlyc3QsIGJ1dCB0aGlzIGZhaWxzIGlmIHB0aHJlYWQuaAorIyByZXF1aXJlcyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzIChlLmcuIG9uIFRydWU2NCBvciBTZXF1ZW50KS4KKyMgSXQgZ2V0cyBjaGVja2VkIGZvciBpbiB0aGUgbGluayB0ZXN0IGFueXdheS4KKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW55IG9mIHRoZSBQVEhSRUFEX0xJQlMsCisjIGV0Y2V0ZXJhIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kIGlmIHRocmVhZHMgbGlua2luZyB3b3JrcyB1c2luZworIyB0aGVtOgoraWYgdGVzdCB4IiRQVEhSRUFEX0xJQlMkUFRIUkVBRF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHUy4uLiAiID4mNjsgfQorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcHRocmVhZF9qb2luICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9qb2luICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9wdGhyZWFkX29rIiA+JjUKKyRhc19lY2hvICIkYXhfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCitheF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICR7aG9zdF9vc30gaW4KKyAgICAgICAgc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBheF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgcHRocmVhZCAtbXQgLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7CisKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgYXhfcHRocmVhZF9mbGFncz0iLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKKyMgQ2xhbmcgZG9lc24ndCBjb25zaWRlciB1bnJlY29nbml6ZWQgb3B0aW9ucyBhbiBlcnJvciB1bmxlc3Mgd2Ugc3BlY2lmeQorIyAtV2Vycm9yLiBXZSB0aHJvdyBpbiBzb21lIGV4dHJhIENsYW5nLXNwZWNpZmljIG9wdGlvbnMgdG8gZW5zdXJlIHRoYXQKKyMgdGhpcyBkb2Vzbid0IGhhcHBlbiBmb3IgR0NDLCB3aGljaCBhbHNvIGFjY2VwdHMgLVdlcnJvci4KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBjb21waWxlciBuZWVkcyAtV2Vycm9yIHRvIHJlamVjdCB1bmtub3duIGZsYWdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGNvbXBpbGVyIG5lZWRzIC1XZXJyb3IgdG8gcmVqZWN0IHVua25vd24gZmxhZ3MuLi4gIiA+JjY7IH0KK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorYXhfcHRocmVhZF9leHRyYV9mbGFncz0iLVdlcnJvciIKK0NGTEFHUz0iJENGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyAtV3Vua25vd24td2FybmluZy1vcHRpb24gLVdzaXplb2YtYXJyYXktYXJndW1lbnQiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgZm9vKHZvaWQpOworaW50CittYWluICgpCit7Citmb28oKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIGF4X3B0aHJlYWRfZXh0cmFfZmxhZ3M9CisgICAgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworaWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGF4X3B0aHJlYWRfZmxhZ3M7IGRvCisKKyAgICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICAgICAgICAgIG5vbmUpCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIHB0aHJlYWQtY29uZmlnKQorICAgICAgICAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHRocmVhZC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHB0aHJlYWQtY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19heF9wdGhyZWFkX2NvbmZpZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRheF9wdGhyZWFkX2NvbmZpZyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19heF9wdGhyZWFkX2NvbmZpZz0iJGF4X3B0aHJlYWRfY29uZmlnIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYXhfcHRocmVhZF9jb25maWc9InllcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19heF9wdGhyZWFkX2NvbmZpZyIgJiYgYWNfY3ZfcHJvZ19heF9wdGhyZWFkX2NvbmZpZz0ibm8iCitmaQorZmkKK2F4X3B0aHJlYWRfY29uZmlnPSRhY19jdl9wcm9nX2F4X3B0aHJlYWRfY29uZmlnCitpZiB0ZXN0IC1uICIkYXhfcHRocmVhZF9jb25maWciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfcHRocmVhZF9jb25maWciID4mNQorJGFzX2VjaG8gIiRheF9wdGhyZWFkX2NvbmZpZyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgICAgICAgICAgICAgaWYgdGVzdCB4IiRheF9wdGhyZWFkX2NvbmZpZyIgPSB4bm87IHRoZW4gY29udGludWU7IGZpCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCByb3V0aW5lKHZvaWQgKmEpIHsgYSA9IDA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpzdGFydF9yb3V0aW5lKHZvaWQgKmEpIHsgcmV0dXJuIGE7IH0KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRoLCAwLCBzdGFydF9yb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NsZWFudXBfcHVzaChyb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY2xlYW51cF9wb3AoMCkgLyogOyAqLworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRheF9wdGhyZWFkX29rIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAieCRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGUuLi4gIiA+JjY7IH0KKyAgICAgICAgYXR0cl9uYW1lPXVua25vd24KKyAgICAgICAgZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KKyAgICAgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBhdHRyID0gJGF0dHI7IHJldHVybiBhdHRyIC8qIDsgKi8KKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhdHRyX25hbWU9JGF0dHI7IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgZG9uZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF0dHJfbmFtZSIgPiY1CiskYXNfZWNobyAiJGF0dHJfbmFtZSIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgJGF0dHJfbmFtZQorX0FDRU9GCisKKyAgICAgICAgZmkKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIG1vcmUgc3BlY2lhbCBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIHB0aHJlYWRzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIG1vcmUgc3BlY2lhbCBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIHB0aHJlYWRzLi4uICIgPiY2OyB9CisgICAgICAgIGZsYWc9bm8KKyAgICAgICAgY2FzZSAke2hvc3Rfb3N9IGluCisgICAgICAgICAgICBhaXgqIHwgZnJlZWJzZCogfCBkYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OworICAgICAgICAgICAgb3NmKiB8IGhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgICAgIHNvbGFyaXMqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIGZsYWc9Ii1EX1JFRU5UUkFOVCIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAjIFRPRE86IFdoYXQgYWJvdXQgQ2xhbmcgb24gU29sYXJpcz8KKyAgICAgICAgICAgICAgICBmbGFnPSItbXQgLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRmbGFnIiA+JjUKKyRhc19lY2hvICIkZmxhZyIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWcgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBmaQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFBUSFJFQURfUFJJT19JTkhFUklUIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBQVEhSRUFEX1BSSU9fSU5IRVJJVC4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitpbnQgaSA9IFBUSFJFQURfUFJJT19JTkhFUklUOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUPXllcworZWxzZQorICBheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQiID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGF4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUIiA9ICJ4eWVzIjsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBjb21waWxlIHdpdGggKl9yIHZhcmlhbnQKKyAgICAgICAgaWYgdGVzdCAieCRHQ0MiICE9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICBhaXgqKQorICAgICAgICAgICAgICAgIGNhc2UgIngvJENDIiBpbiAjKAorICB4Ki9jODl8eCovYzg5XzEyOHx4Ki9jOTl8eCovYzk5XzEyOHx4Ki9jY3x4Ki9jYzEyOHx4Ki94bGN8eCoveGxjX3Y2fHgqL3hsYzEyOHx4Ki94bGMxMjhfdjYpIDoKKyAgICAjaGFuZGxlIGFic29sdXRlIHBhdGggZGlmZmVyZW50bHkgZnJvbSBQQVRIIGJhc2VkIHByb2dyYW0gbG9va3VwCisgICAgICAgICAgICAgICAgICAgY2FzZSAieCRDQyIgaW4gIygKKyAgeC8qKSA6CisgICAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICR7Q0N9X3I7IHRoZW4gOgorICBQVEhSRUFEX0NDPSIke0NDfV9yIgorZmkgOzsgIygKKyAgKikgOgorICAgIGZvciBhY19wcm9nIGluICR7Q0N9X3IKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19QVEhSRUFEX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFBUSFJFQURfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfUFRIUkVBRF9DQz0iJFBUSFJFQURfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19QVEhSRUFEX0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitQVEhSRUFEX0NDPSRhY19jdl9wcm9nX1BUSFJFQURfQ0MKK2lmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBUSFJFQURfQ0MiID4mNQorJGFzX2VjaG8gIiRQVEhSRUFEX0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFBUSFJFQURfQ0MiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkUFRIUkVBRF9DQyIgfHwgUFRIUkVBRF9DQz0iJENDIgorIDs7Citlc2FjIDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICBmaQorZmkKKwordGVzdCAtbiAiJFBUSFJFQURfQ0MiIHx8IFBUSFJFQURfQ0M9IiRDQyIKKworCisKKworCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUFRIUkVBRCB0aHJlYWQgbW9kZWwgZGV0ZWN0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUFRIUkVBRCB0aHJlYWQgbW9kZWwgZGV0ZWN0ZWQiID4mNjt9CisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIENDPSIkUFRIUkVBRF9DQyIKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BUSFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKworICAgICAgICA6CitlbHNlCisgICAgICAgIGF4X3B0aHJlYWRfb2s9bm8KKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZPUksgdGhyZWFkIG1vZGVsIGRldGVjdGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZPUksgdGhyZWFkIG1vZGVsIGRldGVjdGVkIiA+JjY7fQorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfRk9SSyAxIiA+PmNvbmZkZWZzLmgKKworCitmaQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY29tcGlsZXIvbGlua2VyIGZsYWdzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY29tcGlsZXIvbGlua2VyIGZsYWdzIiA+JjY7fQorCisKKworCitmb3IgZmxhZyBpbiAtV2FsbDsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLVdleHRyYTsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLVdwZWRhbnRpYzsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLVdmb3JtYXQ9MjsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLVdjb252ZXJzaW9uOyBkbworICBhc19DQUNIRVZBUj1gJGFzX2VjaG8gImF4X2N2X2NoZWNrX2NmbGFnc19fJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfQ0FDSEVWQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JENGTEFHUworICBDRkxBR1M9IiRDRkxBR1MgICRmbGFnIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9JGF4X2NoZWNrX3NhdmVfZmxhZ3MKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19DQUNIRVZBUgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IHgiYGV2YWwgJ2FzX3ZhbD0keyckYXNfQ0FDSEVWQVInfTskYXNfZWNobyAiJGFzX3ZhbCInYCIgPSB4eWVzOyB0aGVuIDoKKyAgaWYgJHtDRkxBR1MrOn0gZmFsc2U7IHRoZW4gOgorICBjYXNlICIgJENGTEFHUyAiIGluCisgICAgKiIgJGZsYWcgIiopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyBcJGZsYWciOyB9ID4mNQorICAoOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyAkZmxhZykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwkZmxhZ1wiIjsgfSA+JjUKKyAgKDogQ0ZMQUdTPSIkQ0ZMQUdTICRmbGFnIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIENGTEFHUz0iJENGTEFHUyAkZmxhZyIKKyAgICAgIDs7CisgICBlc2FjCitlbHNlCisgIENGTEFHUz0iJGZsYWciCitmaQorCitlbHNlCisgIDoKK2ZpCisKK2RvbmUKKworCisKKworCitmb3IgZmxhZyBpbiAtV25vLWxvbmctbG9uZzsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9uczsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1M9XCJcJENGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IENGTEFHUz0iJENGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBDRkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworCisKKworZm9yIGZsYWcgaW4gLWZzdGFjay1wcm90ZWN0b3I7IGRvCisgIGFzX0NBQ0hFVkFSPWAkYXNfZWNobyAiYXhfY3ZfY2hlY2tfY2ZsYWdzX18kZmxhZyIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgQyBjb21waWxlciBhY2NlcHRzICRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgQyBjb21waWxlciBhY2NlcHRzICRmbGFnLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19DQUNIRVZBUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgYXhfY2hlY2tfc2F2ZV9mbGFncz0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAgJGZsYWciCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkYXNfQ0FDSEVWQVI9eWVzIgorZWxzZQorICBldmFsICIkYXNfQ0FDSEVWQVI9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0kYXhfY2hlY2tfc2F2ZV9mbGFncworZmkKK2V2YWwgYWNfcmVzPVwkJGFzX0NBQ0hFVkFSCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgeCJgZXZhbCAnYXNfdmFsPSR7JyRhc19DQUNIRVZBUid9OyRhc19lY2hvICIkYXNfdmFsIidgIiA9IHh5ZXM7IHRoZW4gOgorICBpZiAke0NGTEFHUys6fSBmYWxzZTsgdGhlbiA6CisgIGNhc2UgIiAkQ0ZMQUdTICIgaW4KKyAgICAqIiAkZmxhZyAiKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUyBhbHJlYWR5IGNvbnRhaW5zIFwkZmxhZyI7IH0gPiY1CisgICg6IENGTEFHUyBhbHJlYWR5IGNvbnRhaW5zICRmbGFnKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgOzsKKyAgICAqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogQ0ZMQUdTPVwiXCRDRkxBR1MgXCRmbGFnXCIiOyB9ID4mNQorICAoOiBDRkxBR1M9IiRDRkxBR1MgJGZsYWciKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRmbGFnIgorICAgICAgOzsKKyAgIGVzYWMKK2Vsc2UKKyAgQ0ZMQUdTPSIkZmxhZyIKK2ZpCisKK2Vsc2UKKyAgOgorZmkKKworZG9uZQorCisKKworCisKK2ZvciBmbGFnIGluIC1mUElFOyBkbworICBhc19DQUNIRVZBUj1gJGFzX2VjaG8gImF4X2N2X2NoZWNrX2NmbGFnc19fJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfQ0FDSEVWQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JENGTEFHUworICBDRkxBR1M9IiRDRkxBR1MgICRmbGFnIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9JGF4X2NoZWNrX3NhdmVfZmxhZ3MKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19DQUNIRVZBUgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IHgiYGV2YWwgJ2FzX3ZhbD0keyckYXNfQ0FDSEVWQVInfTskYXNfZWNobyAiJGFzX3ZhbCInYCIgPSB4eWVzOyB0aGVuIDoKKyAgaWYgJHtDRkxBR1MrOn0gZmFsc2U7IHRoZW4gOgorICBjYXNlICIgJENGTEFHUyAiIGluCisgICAgKiIgJGZsYWcgIiopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyBcJGZsYWciOyB9ID4mNQorICAoOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyAkZmxhZykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwkZmxhZ1wiIjsgfSA+JjUKKyAgKDogQ0ZMQUdTPSIkQ0ZMQUdTICRmbGFnIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIENGTEFHUz0iJENGTEFHUyAkZmxhZyIKKyAgICAgIDs7CisgICBlc2FjCitlbHNlCisgIENGTEFHUz0iJGZsYWciCitmaQorCitlbHNlCisgIDoKK2ZpCisKK2RvbmUKKworCisKKworCitmb3IgZmxhZyBpbiAtRF9GT1JUSUZZX1NPVVJDRT0yOyBkbworICBhc19DQUNIRVZBUj1gJGFzX2VjaG8gImF4X2N2X2NoZWNrX2NmbGFnc19fJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkZmxhZy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfQ0FDSEVWQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JENGTEFHUworICBDRkxBR1M9IiRDRkxBR1MgICRmbGFnIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9JGF4X2NoZWNrX3NhdmVfZmxhZ3MKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19DQUNIRVZBUgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IHgiYGV2YWwgJ2FzX3ZhbD0keyckYXNfQ0FDSEVWQVInfTskYXNfZWNobyAiJGFzX3ZhbCInYCIgPSB4eWVzOyB0aGVuIDoKKyAgaWYgJHtDRkxBR1MrOn0gZmFsc2U7IHRoZW4gOgorICBjYXNlICIgJENGTEFHUyAiIGluCisgICAgKiIgJGZsYWcgIiopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyBcJGZsYWciOyB9ID4mNQorICAoOiBDRkxBR1MgYWxyZWFkeSBjb250YWlucyAkZmxhZykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwkZmxhZ1wiIjsgfSA+JjUKKyAgKDogQ0ZMQUdTPSIkQ0ZMQUdTICRmbGFnIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIENGTEFHUz0iJENGTEFHUyAkZmxhZyIKKyAgICAgIDs7CisgICBlc2FjCitlbHNlCisgIENGTEFHUz0iJGZsYWciCitmaQorCitlbHNlCisgIDoKK2ZpCisKK2RvbmUKKworCisKKworCitmb3IgZmxhZyBpbiAtZlBJRSAtcGllOyBkbworICBhc19DQUNIRVZBUj1gJGFzX2VjaG8gImF4X2N2X2NoZWNrX2xkZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRMREZMQUdTCisgIExERkxBR1M9IiRMREZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBMREZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGlmICR7TERGTEFHUys6fSBmYWxzZTsgdGhlbiA6CisgIGNhc2UgIiAkTERGTEFHUyAiIGluCisgICAgKiIgJGZsYWcgIiopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBMREZMQUdTIGFscmVhZHkgY29udGFpbnMgXCRmbGFnIjsgfSA+JjUKKyAgKDogTERGTEFHUyBhbHJlYWR5IGNvbnRhaW5zICRmbGFnKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgOzsKKyAgICAqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogTERGTEFHUz1cIlwkTERGTEFHUyBcJGZsYWdcIiI7IH0gPiY1CisgICg6IExERkxBR1M9IiRMREZMQUdTICRmbGFnIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIExERkxBR1M9IiRMREZMQUdTICRmbGFnIgorICAgICAgOzsKKyAgIGVzYWMKK2Vsc2UKKyAgTERGTEFHUz0iJGZsYWciCitmaQorCitlbHNlCisgIDoKK2ZpCisKK2RvbmUKKworCisKKworCitmb3IgZmxhZyBpbiAtV2wsLXoscmVscm87IGRvCisgIGFzX0NBQ0hFVkFSPWAkYXNfZWNobyAiYXhfY3ZfY2hlY2tfbGRmbGFnc19fJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgYWNjZXB0cyAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgYWNjZXB0cyAkZmxhZy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfQ0FDSEVWQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JExERkxBR1MKKyAgTERGTEFHUz0iJExERkxBR1MgICRmbGFnIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIExERkxBR1M9JGF4X2NoZWNrX3NhdmVfZmxhZ3MKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19DQUNIRVZBUgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IHgiYGV2YWwgJ2FzX3ZhbD0keyckYXNfQ0FDSEVWQVInfTskYXNfZWNobyAiJGFzX3ZhbCInYCIgPSB4eWVzOyB0aGVuIDoKKyAgaWYgJHtMREZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRMREZMQUdTICIgaW4KKyAgICAqIiAkZmxhZyAiKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IExERkxBR1MgYWxyZWFkeSBjb250YWlucyBcJGZsYWciOyB9ID4mNQorICAoOiBMREZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBMREZMQUdTPVwiXCRMREZMQUdTIFwkZmxhZ1wiIjsgfSA+JjUKKyAgKDogTERGTEFHUz0iJExERkxBR1MgJGZsYWciKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgTERGTEFHUz0iJExERkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBMREZMQUdTPSIkZmxhZyIKK2ZpCisKK2Vsc2UKKyAgOgorZmkKKworZG9uZQorCisKKworCisKK2ZvciBmbGFnIGluIC1XbCwteixub3c7IGRvCisgIGFzX0NBQ0hFVkFSPWAkYXNfZWNobyAiYXhfY3ZfY2hlY2tfbGRmbGFnc19fJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgYWNjZXB0cyAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgYWNjZXB0cyAkZmxhZy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfQ0FDSEVWQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JExERkxBR1MKKyAgTERGTEFHUz0iJExERkxBR1MgICRmbGFnIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX0NBQ0hFVkFSPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIExERkxBR1M9JGF4X2NoZWNrX3NhdmVfZmxhZ3MKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19DQUNIRVZBUgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IHgiYGV2YWwgJ2FzX3ZhbD0keyckYXNfQ0FDSEVWQVInfTskYXNfZWNobyAiJGFzX3ZhbCInYCIgPSB4eWVzOyB0aGVuIDoKKyAgaWYgJHtMREZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRMREZMQUdTICIgaW4KKyAgICAqIiAkZmxhZyAiKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IExERkxBR1MgYWxyZWFkeSBjb250YWlucyBcJGZsYWciOyB9ID4mNQorICAoOiBMREZMQUdTIGFscmVhZHkgY29udGFpbnMgJGZsYWcpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICA7OworICAgICopCisgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogOiBMREZMQUdTPVwiXCRMREZMQUdTIFwkZmxhZ1wiIjsgfSA+JjUKKyAgKDogTERGTEFHUz0iJExERkxBR1MgJGZsYWciKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgTERGTEFHUz0iJExERkxBR1MgJGZsYWciCisgICAgICA7OworICAgZXNhYworZWxzZQorICBMREZMQUdTPSIkZmxhZyIKK2ZpCisKK2Vsc2UKKyAgOgorZmkKKworZG9uZQorCisKKworCisKK2ZvciBmbGFnIGluIC1XbCwteixub2V4ZWNzdGFjazsgZG8KKyAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19sZGZsYWdzX18kZmxhZyIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciBhY2NlcHRzICRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciBhY2NlcHRzICRmbGFnLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19DQUNIRVZBUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgYXhfY2hlY2tfc2F2ZV9mbGFncz0kTERGTEFHUworICBMREZMQUdTPSIkTERGTEFHUyAgJGZsYWciCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkYXNfQ0FDSEVWQVI9eWVzIgorZWxzZQorICBldmFsICIkYXNfQ0FDSEVWQVI9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgTERGTEFHUz0kYXhfY2hlY2tfc2F2ZV9mbGFncworZmkKK2V2YWwgYWNfcmVzPVwkJGFzX0NBQ0hFVkFSCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgeCJgZXZhbCAnYXNfdmFsPSR7JyRhc19DQUNIRVZBUid9OyRhc19lY2hvICIkYXNfdmFsIidgIiA9IHh5ZXM7IHRoZW4gOgorICBpZiAke0xERkxBR1MrOn0gZmFsc2U7IHRoZW4gOgorICBjYXNlICIgJExERkxBR1MgIiBpbgorICAgICoiICRmbGFnICIqKQorICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IDogTERGTEFHUyBhbHJlYWR5IGNvbnRhaW5zIFwkZmxhZyI7IH0gPiY1CisgICg6IExERkxBR1MgYWxyZWFkeSBjb250YWlucyAkZmxhZykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IExERkxBR1M9XCJcJExERkxBR1MgXCRmbGFnXCIiOyB9ID4mNQorICAoOiBMREZMQUdTPSIkTERGTEFHUyAkZmxhZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBMREZMQUdTPSIkTERGTEFHUyAkZmxhZyIKKyAgICAgIDs7CisgICBlc2FjCitlbHNlCisgIExERkxBR1M9IiRmbGFnIgorZmkKKworZWxzZQorICA6CitmaQorCitkb25lCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGxpYnRvb2wiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsaWJ0b29sIiA+JjY7fQorY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IExpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBcYHB3ZFxgIiA+JjI7fSA7OworZXNhYworCisKKworbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JworCisKKworCisKKworCisKKworCisKKworCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgorIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworCitFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzLi4uICIgPiY2OyB9CisjIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KK2lmIHRlc3QgIlhgKCBwcmludCAtciAtLSAtbiApIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAorICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnQgLXIgLS0nCitlbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludGYgJXNcbicKK2Vsc2UKKyAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgorICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKKyAgeworICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIiCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcHJpbnRmIiA+JjUKKyRhc19lY2hvICJwcmludGYiID4mNjsgfSA7OworICBwcmludCopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludCAtciIgPiY1CiskYXNfZWNobyAicHJpbnQgLXIiID4mNjsgfSA7OworICAqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY2F0IiA+JjUKKyRhc19lY2hvICJjYXQiID4mNjsgfSA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAgICAgICBhY19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCisgICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCisgICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKKyAgICAgZG9uZQorICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAorICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3NjcmlwdDt9CisgICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCisgIGFjX3BhdGhfU0VEX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9TRUQiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9TRUQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX1NFRAorY2FzZSBgIiRhY19wYXRoX1NFRCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIgYWNfcGF0aF9TRURfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJycgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9TRUQiIC1mIGNvbmZ0ZXN0LnNlZCA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfU0VEX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIgorICAgICAgYWNfcGF0aF9TRURfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9TRURfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX1NFRCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBzZWQgY291bGQgYmUgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX1NFRD0kU0VECitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX1NFRCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfU0VEIiA+JjY7IH0KKyBTRUQ9IiRhY19jdl9wYXRoX1NFRCIKKyAgcm0gLWYgY29uZnRlc3Quc2VkCisKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfRUdSRVAiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmZ3JlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZmdyZXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9GR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGVjaG8gJ2FiKmMnIHwgJEdSRVAgLUYgJ2FiKmMnID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0ZHUkVQPSIkR1JFUCAtRiIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEZHUkVQIjsgdGhlbgorICBhY19wYXRoX0ZHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZmdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0ZHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9GR1JFUCIgfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0ZHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9GR1JFUAorY2FzZSBgIiRhY19wYXRoX0ZHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIgYWNfcGF0aF9GR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnRkdSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfRkdSRVAiIEZHUkVQIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9GR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9GR1JFUD0iJGFjX3BhdGhfRkdSRVAiCisgICAgICBhY19wYXRoX0ZHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfRkdSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0ZHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGZncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9GR1JFUD0kRkdSRVAKK2ZpCisKKyAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0ZHUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9GR1JFUCIgPiY2OyB9CisgRkdSRVA9IiRhY19jdl9wYXRoX0ZHUkVQIgorCisKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gJEVDSE8gIiRhY19wcm9nInwgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSAkRUNITyAiJGFjX3Byb2ciIHwgJEdSRVAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gJEVDSE8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KK2ZpCitpZiAke2x0X2N2X3BhdGhfTEQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKKyRhc19lY2hvICIkTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCit0ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19nbnVfbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNjsgfQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9OTSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcGF0aF9OTSIgPiY2OyB9CitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4gOgorICAgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBlbHNlCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBkdW1wYmluICJsaW5rIC1kdW1wIgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19EVU1QQklOKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCisgIGFjX2N2X3Byb2dfRFVNUEJJTj0iJERVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitEVU1QQklOPSRhY19jdl9wcm9nX0RVTVBCSU4KK2lmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERVTVBCSU4iID4mNQorJGFzX2VjaG8gIiREVU1QQklOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkRFVNUEJJTiIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiREVU1QQklOIjsgdGhlbgorICBhY19jdF9EVU1QQklOPSREVU1QQklOCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19jdF9EVU1QQklOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRFVNUEJJTj0kYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOCitpZiB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EVU1QQklOIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFVNUEJJTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfRFVNUEJJTiIgPSB4OyB0aGVuCisgICAgRFVNUEJJTj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBEVU1QQklOPSRhY19jdF9EVU1QQklOCisgIGZpCitmaQorCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9ubV9pbnRlcmZhY2UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JjUpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mNSkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiY1KQorICBjYXQgY29uZnRlc3Qub3V0ID4mNQorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9ubV9pbnRlcmZhY2UiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQorTE5fUz0kYXNfbG5fcworaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKKyRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQorZmkKKworIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19tYXhfY21kX2xlbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKlsJIF0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iICYmIFwKKwl0ZXN0IHVuZGVmaW5lZCAhPSAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBlbnYgZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworCitmaQorCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUiID4mNQorJGFzX2VjaG8gIm5vbmUiID4mNjsgfQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworCisKKworCisKKzogJHtDUD0iY3AgLWYifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHMuLi4gIiA+JjY7IH0KKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkeHNpX3NoZWxsIiA+JjUKKyRhc19lY2hvICIkeHNpX3NoZWxsIiA+JjY7IH0KKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIFwiKz1cIiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIuLi4gIiA+JjY7IH0KK2x0X3NoZWxsX2FwcGVuZD1ubworKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJDErPVwkMiIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9zaGVsbF9hcHBlbmQiID4mNQorJGFzX2VjaG8gIiRsdF9zaGVsbF9hcHBlbmQiID4mNjsgfQorCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKKworCisKKworCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKKworZmkKKwordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY2OyB9CisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfdG9fdG9vbF9maWxlX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX3JlbG9hZF9mbGFnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9CityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT0JKRFVNUD0kYWNfY3ZfcHJvZ19PQkpEVU1QCitpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3RfT0JKRFVNUD0kT0JKRFVNUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9iamR1bXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09CSkRVTVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSIkYWNfY3RfT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9Im9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT0JKRFVNUD0kYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09CSkRVTVAiID0geDsgdGhlbgorICAgIE9CSkRVTVA9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9CSkRVTVA9JGFjX2N0X09CSkRVTVAKKyAgZmkKK2Vsc2UKKyAgT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKK2ZpCisKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFs0LTldKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbNDVdKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCisgIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKikKKyAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRlsgLV1bMC05XVswLTldKSgtYml0KT8oIFtMTV1TQik/IHNoYXJlZCBvYmplY3QoIGZpbGUpP1ssIC1dKiBQQS1SSVNDIFswLTldXC5bMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XVwuWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbMy05XSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298XC5hKSQnCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJExEIGluCisgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKKyAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKKyAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICBlc2FjCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIGdsaWJjL0VMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSB8IGdudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9CisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bXDFdXC9bXDFdXC9nOy9nImAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK2ZpCisKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19ETExUT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRETExUT09MIiA+JjUKKyRhc19lY2hvICIkRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RMTFRPT0wiID0geDsgdGhlbgorICAgIERMTFRPT0w9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKKyAgZmkKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gYXNzb2NpYXRlIHJ1bnRpbWUgYW5kIGxpbmsgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjY7IH0KK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGFyCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0FSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BUj0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVI9JGFjX2N2X3Byb2dfQVIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1CiskYXNfZWNobyAiJEFSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQVIiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQVIiOyB0aGVuCisgIGFjX2N0X0FSPSRBUgorICBmb3IgYWNfcHJvZyBpbiBhcgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0FSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKK2lmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0FSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0FSIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgorICAgIEFSPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBBUj0kYWNfY3RfQVIKKyAgZmkKK2ZpCisKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcl9hdF9maWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfYXJfYXRfZmlsZT1ubworICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gY29uZnRlc3QuJGFjX29iamV4dCA+IGNvbmZ0ZXN0LmxzdAorICAgICAgbHRfYXJfdHJ5PSckQVIgJEFSX0ZMQUdTIGxpYmNvbmZ0ZXN0LmEgQGNvbmZ0ZXN0LmxzdCA+JjUnCisgICAgICB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkbHRfYXJfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkbHRfYXJfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICAgICAgaWYgdGVzdCAiJGFjX3N0YXR1cyIgLWVxIDA7IHRoZW4KKwkjIEVuc3VyZSB0aGUgYXJjaGl2ZXIgZmFpbHMgdXBvbiBib2d1cyBmaWxlIG5hbWVzLgorCXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgbGliY29uZnRlc3QuYQorCXsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRsdF9hcl90cnlcIiI7IH0gPiY1CisgIChldmFsICRsdF9hcl90cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisJaWYgdGVzdCAiJGFjX3N0YXR1cyIgLW5lIDA7IHRoZW4KKyAgICAgICAgICBsdF9jdl9hcl9hdF9maWxlPUAKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICBybSAtZiBjb25mdGVzdC4qIGxpYmNvbmZ0ZXN0LmEKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcl9hdF9maWxlIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJfYXRfZmlsZSIgPiY2OyB9CisKK2lmIHRlc3QgIngkbHRfY3ZfYXJfYXRfZmlsZSIgPSB4bm87IHRoZW4KKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPQorZWxzZQorICBhcmNoaXZlcl9saXN0X3NwZWM9JGx0X2N2X2FyX2F0X2ZpbGUKK2ZpCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKwordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCisgICAgUkFOTElCPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKwordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKKworCisKKworCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCR0b29sX29sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCitmaQorCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPXllcyA7OworICAqKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj1ubyA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW0FCQ0RFR1JTVF0nCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbQkNERUdRUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbQkRSVF0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW0RUXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tBQkRUXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbREZOU1RVXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Citlc2FjCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCisjIFNvbWUgc3lzdGVtcyAoZXNwLiBvbiBpYTY0KSBsaW5rIGRhdGEgYW5kIGNvZGUgc3ltYm9scyBkaWZmZXJlbnRseSwKKyMgc28gdXNlIHRoaXMgZ2VuZXJhbCBhcHByb2FjaC4KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXClbIF0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXClbIF0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChsaWJbXiBdKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyAnIlwKKyIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAorIiAgICAgL15DT0ZGIFNZTUJPTCBUQUJMRS97Zm9yKGkgaW4gaGlkZSkgZGVsZXRlIGhpZGVbaV19OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4IgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsJIF1cKCRzeW1jb2RlJHN5bWNvZGUqXClbCSBdWwkgXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK19MVF9FT0YKKworICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdFwiIjsgfSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0CisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19MVF9FT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCitMVF9ETFNZTV9DT05TVCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICAgICAgICphZGRyZXNzOworfQorbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUworCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9JGx0X2dsb2JzeW1fc2F2ZV9MSUJTCisJICBDRkxBR1M9JGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1MKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1CisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZmFpbGVkIiA+JjUKKyRhc19lY2hvICJmYWlsZWQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQorJGFzX2VjaG8gIm9rIiA+JjY7IH0KK2ZpCisKKyMgUmVzcG9uc2UgZmlsZSBzdXBwb3J0LgoraWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitlbGlmICROTSAtLWhlbHAgMj4vZGV2L251bGwgfCBncmVwICdbQF1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN5c3Jvb3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN5c3Jvb3QuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXNyb290IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zeXNyb290K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXNyb290OworZWxzZQorICB3aXRoX3N5c3Jvb3Q9bm8KK2ZpCisKKworbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke3dpdGhfc3lzcm9vdH0iID4mNQorJGFzX2VjaG8gIiR7d2l0aF9zeXNyb290fSIgPiY2OyB9CisgICBhc19mbl9lcnJvciAkPyAiVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgIDs7Citlc2FjCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtsdF9zeXNyb290Oi1ub30iID4mNQorJGFzX2VjaG8gIiR7bHRfc3lzcm9vdDotbm99IiA+JjY7IH0KKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2xpYnRvb2xfbG9jazsKK2ZpCisKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAgICpFTEYtMzIqKQorCUhQVVhfSUE2NF9NT0RFPSIzMiIKKwk7OworICAgICAgKkVMRi02NCopCisJSFBVWF9JQTY0X01PREU9IjY0IgorCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJzbWlwIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYm1pcG4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGY2NGJtaXAiCisJOzsKKyAgICAgIGVzYWMKKyAgICBlbHNlCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTMyIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtNjQiCisJICA7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworeDg2XzY0LSprZnJlZWJzZCotZ251fHg4Nl82NC0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorCSAgICAgICp4ODYtNjQqKQorCQlMRD0iJHtMRC1sZH0gLW0gZWxmMzJfeDg2XzY0IgorCQk7OworCSAgICAgICopCisJCUxEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkJOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgcG93ZXJwYzY0bGUtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMybHBwY2xpbnV4IgorCSAgICA7OworCSAgcG93ZXJwYzY0LSopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwb3dlcnBjbGUtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0bHBwYyIKKwkgICAgOzsKKwkgIHBvd2VycGMtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCitlbHNlCisgIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikKKyAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICBpPzg2LSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSotc29sYXJpcyopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgIyBHTlUgbGQgMi4yMSBpbnRyb2R1Y2VkIF9zb2wyIGVtdWxhdGlvbnMuICBVc2UgdGhlbSBpZiBhdmFpbGFibGUuCisgICAgICAgIGlmICR7TEQtbGR9IC1WIHwgZ3JlcCBfc29sMiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICBMRD0iJHtMRC1sZH1fc29sMiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisJaWYgJHtMRC1sZH0gLTY0IC1yIC1vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0Lm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7Citlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1tdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiRNQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTD0iJHthY190b29sX3ByZWZpeH1tdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitNQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRNQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdF9NQU5JRkVTVF9UT09MPSRNQU5JRkVTVF9UT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X01BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0iJGFjX2N0X01BTklGRVNUX1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MPSJtdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9NQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X01BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPSB4OyB0aGVuCisgICAgTUFOSUZFU1RfVE9PTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBNQU5JRkVTVF9UT09MPSRhY19jdF9NQU5JRkVTVF9UT09MCisgIGZpCitlbHNlCisgIE1BTklGRVNUX1RPT0w9IiRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wiCitmaQorCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiY1CisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgaWYgJEdSRVAgJ01hbmlmZXN0IFRvb2wnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD15ZXMKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNjsgfQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorCisKKworCisKKworICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfRFNZTVVUSUw9IiREU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0RTWU1VVElMPSIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0RTWU1VVElMPSRhY19jdl9wcm9nX0RTWU1VVElMCitpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFNZTVVUSUwiID4mNQorJGFzX2VjaG8gIiREU1lNVVRJTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N0X0RTWU1VVElMPSREU1lNVVRJTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRzeW11dGlsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUw9IiRhY19jdF9EU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSJkc3ltdXRpbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9EU1lNVVRJTD0kYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTAoraWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RTWU1VVElMIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFNZTVVUSUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9EU1lNVVRJTCIgPSB4OyB0aGVuCisgICAgRFNZTVVUSUw9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRFNZTVVUSUw9JGFjX2N0X0RTWU1VVElMCisgIGZpCitlbHNlCisgIERTWU1VVElMPSIkYWNfY3ZfcHJvZ19EU1lNVVRJTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1ubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19OTUVESVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgorICBhY19jdl9wcm9nX05NRURJVD0iJE5NRURJVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX05NRURJVD0iJHthY190b29sX3ByZWZpeH1ubWVkaXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTk1FRElUPSRhY19jdl9wcm9nX05NRURJVAoraWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICROTUVESVQiID4mNQorJGFzX2VjaG8gIiROTUVESVQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX05NRURJVCI7IHRoZW4KKyAgYWNfY3RfTk1FRElUPSROTUVESVQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG5tZWRpdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9IiRhY19jdF9OTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9Im5tZWRpdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9OTUVESVQ9JGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUCitpZiB0ZXN0IC1uICIkYWNfY3RfTk1FRElUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X05NRURJVCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X05NRURJVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X05NRURJVCIgPSB4OyB0aGVuCisgICAgTk1FRElUPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE5NRURJVD0kYWNfY3RfTk1FRElUCisgIGZpCitlbHNlCisgIE5NRURJVD0iJGFjX2N2X3Byb2dfTk1FRElUIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWxpcG8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bGlwbzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTElQTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgorICBhY19jdl9wcm9nX0xJUE89IiRMSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfTElQTz0iJHthY190b29sX3ByZWZpeH1saXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0xJUE89JGFjX2N2X3Byb2dfTElQTworaWYgdGVzdCAtbiAiJExJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTElQTyIgPiY1CiskYXNfZWNobyAiJExJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0xJUE8iOyB0aGVuCisgIGFjX2N0X0xJUE89JExJUE8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsaXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsaXBvOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9MSVBPKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0iJGFjX2N0X0xJUE8iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSJsaXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0xJUE89JGFjX2N2X3Byb2dfYWNfY3RfTElQTworaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTElQTyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0xJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9MSVBPIiA9IHg7IHRoZW4KKyAgICBMSVBPPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIExJUE89JGFjX2N0X0xJUE8KKyAgZmkKK2Vsc2UKKyAgTElQTz0iJGFjX2N2X3Byb2dfTElQTyIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfT1RPT0w9IiRPVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MPSIke2FjX3Rvb2xfcHJlZml4fW90b29sIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09UT09MPSRhY19jdl9wcm9nX09UT09MCitpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0wiID4mNQorJGFzX2VjaG8gIiRPVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0wiOyB0aGVuCisgIGFjX2N0X09UT09MPSRPVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w9IiRhY19jdF9PVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSJvdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTAoraWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PVE9PTCIgPSB4OyB0aGVuCisgICAgT1RPT0w9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT1RPT0w9JGFjX2N0X09UT09MCisgIGZpCitlbHNlCisgIE9UT09MPSIkYWNfY3ZfcHJvZ19PVE9PTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbDY0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sNjQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIkT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MNjQ9IiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPVE9PTDY0PSRhY19jdl9wcm9nX09UT09MNjQKK2lmIHRlc3QgLW4gIiRPVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MNjQiID4mNQorJGFzX2VjaG8gIiRPVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PVE9PTDY0IjsgdGhlbgorICBhY19jdF9PVE9PTDY0PSRPVE9PTDY0CisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb3Rvb2w2NDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0w2NCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9IiRhY19jdF9PVE9PTDY0IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0ib3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTDY0PSRhY19jdl9wcm9nX2FjX2N0X09UT09MNjQKK2lmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MNjQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT1RPT0w2NCIgPSB4OyB0aGVuCisgICAgT1RPT0w2ND0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPVE9PTDY0PSRhY19jdF9PVE9PTDY0CisgIGZpCitlbHNlCisgIE9UT09MNjQ9IiRhY19jdl9wcm9nX09UT09MNjQiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgorCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQorCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQorCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKKwkjIGxpbmsgZmxhZ3MuCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCisJZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JjUKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisJIyBPdGhlcndpc2UsIGlmIHRoZSBvdXRwdXQgd2FzIGNyZWF0ZWQgd2l0aCBhIDAgZXhpdCBjb2RlIGZyb20KKwkjIHRoZSBjb21waWxlciwgaXQgd29ya2VkLgorCWVsaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwOyB0aGVuCisJICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisJZmkKKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJcm0gLWYgY29uZnRlc3QuKgorICAgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjY7IH0KKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXMKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNjsgfQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX2ZvcmNlX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mNQorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mNQorICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mNQorICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiY1CisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBtYWluKCkgeyByZXR1cm4gMDt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKKyAgICAgIF9sdF9yZXN1bHQ9JD8KKyAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyICYmICRHUkVQIGZvcmNlX2xvYWQgY29uZnRlc3QuZXJyOyB0aGVuCisJY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiY1CisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjY7IH0KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bOTFdKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKwkxMC5bMDEyXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKworIyBTZXQgb3B0aW9ucworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9bm8KK2ZpCisKKworCisKKworCisKKworCisKKyAgICAgICAgZW5hYmxlX2Rsb3Blbj1ubworCisKKyAgZW5hYmxlX3dpbjMyX2RsbD1ubworCisKKyAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcGljOyBsdF9wPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJHdpdGh2YWwgaW4KKyAgICB5ZXN8bm8pIHBpY19tb2RlPSR3aXRodmFsIDs7CisgICAgKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIGx0X3BrZyBpbiAkd2l0aHZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJGx0X3BrZyIgPSAiWCRsdF9wIjsgdGhlbgorCSAgcGljX21vZGU9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIHBpY19tb2RlPWRlZmF1bHQKK2ZpCisKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0CisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9mYXN0X2luc3RhbGw7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworCisKKworCisKKworCisKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRsdG1haW4iCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CiskYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFRfT0JKRElSICIkbHRfY3Zfb2JqZGlyLyIKK19BQ0VPRgorCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CisKK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCisKKworCisKKworICBsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVhsaW5rZXIgJworICAgICAgaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iLVhjb21waWxlciAkbHRfcHJvZ19jb21waWxlcl9waWMiCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251IHwgZ251KikKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAjIG9sZCBJbnRlbCBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KKyAgICAgIGVjYyopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIGljYyB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKyAgICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorICAgICAgaWNjKiB8IGlmb3J0KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgTGFoZXkgRm9ydHJhbiA4LjEuCisgICAgICBsZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctLXNoYXJlZCcKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLS1zdGF0aWMnCisJOzsKKyAgICAgIG5hZ2ZvciopCisJIyBOQUcgRm9ydHJhbiBjb21waWxlcgorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwtV2wsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKKwkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctcXBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIENlcmVzXCBGb3J0cmFuKiB8ICpTdW4qRm9ydHJhbipcIFsxLTddLiogfCAqU3VuKkZvcnRyYW4qXCA4LlswLTNdKikKKwkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9JycKKwkgIDs7CisJKlN1blwgRiogfCAqU3VuKkZvcnRyYW4qKQorCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJworCSAgOzsKKwkqU3VuXCBDKikKKwkgICMgU3VuIEMgNS45CisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgOzsKKyAgICAgICAgKkludGVsKlwgW0NGXSpDb21waWxlciopCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisJICA7OworCSpQb3J0bGFuZFwgR3JvdXAqKQorCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1waWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIDs7Citlc2FjCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9waWMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYz0kbHRfcHJvZ19jb21waWxlcl9waWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWMiID4mNjsgfQorbHRfcHJvZ19jb21waWxlcl9waWM9JGx0X2N2X3Byb2dfY29tcGlsZXJfcGljCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz1ubworICAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWM9IiAkbHRfcHJvZ19jb21waWxlcl9waWMiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCitmaQorCitmaQorCisKKworCisKKworCisKKworCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gLXIgY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgOgorZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorZmkKKworCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9CisKKworCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KKworCisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKworICBydW5wYXRoX3Zhcj0KKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubworICBhcmNoaXZlX2NtZHM9CisgIGFyY2hpdmVfZXhwc3ltX2NtZHM9CisgIGNvbXBpbGVyX25lZWRzX29iamVjdD1ubworICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPW5vCisgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBoYXJkY29kZV9hdXRvbWF0aWM9bm8KKyAgaGFyZGNvZGVfZGlyZWN0PW5vCisgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT1ubworICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorICBoYXJkY29kZV9taW51c19MPW5vCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgaW5oZXJpdF9ycGF0aD1ubworICBsaW5rX2FsbF9kZXBsaWJzPXVua25vd24KKyAgbW9kdWxlX2NtZHM9CisgIG1vZHVsZV9leHBzeW1fY21kcz0KKyAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KKyAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9CisgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KKyAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgaW5jbHVkZV9leHBzeW1zPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIGV4Y2x1ZGVfZXhwc3ltcz0nX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJworICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgIyBFeGNsdWRlIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBzeW1ib2xzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBsaW51eCogfCBrKmJzZCotZ251IHwgZ251KikKKyAgICBsaW5rX2FsbF9kZXBsaWJzPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlicz15ZXMKKworICAjIE9uIHNvbWUgdGFyZ2V0cywgR05VIGxkIGlzIGNvbXBhdGlibGUgZW5vdWdoIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIKKyAgIyB0aGF0IHdlJ3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlcmZhY2UgZm9yIGJvdGguCisgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPW5vCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorCSMgVGhlIEFJWCBwb3J0IG9mIEdOVSBsZCBoYXMgYWx3YXlzIGFzcGlyZWQgdG8gY29tcGF0aWJpbGl0eQorCSMgd2l0aCB0aGUgbmF0aXZlIGxpbmtlci4gIEhvd2V2ZXIsIGFzIHRoZSB3YXJuaW5nIGluIHRoZSBHTlUgbGQKKwkjIGJsb2NrIHNheXMsIHZlcnNpb25zIGJlZm9yZSAyLjE5LjUqIGNvdWxkbid0IHJlYWxseSBjcmVhdGUgd29ya2luZworCSMgc2hhcmVkIGxpYnJhcmllcywgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJmYWNlIHVzZWQuCisJY2FzZSBgJExEIC12IDI+JjFgIGluCisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi4xOS41KikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLlsyLTldKikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCBbMy05XSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4WzMtOV0qKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjE5LCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIGluc3RhbGwgYmludXRpbHMKKyoqKiAyLjIwIG9yIGFib3ZlLCBvciBtb2RpZnkgeW91ciBQQVRIIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZC4KKyoqKiBZb3Ugd2lsbCB0aGVuIG5lZWQgdG8gcmVzdGFydCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgorCitfTFRfRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCWFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS87cy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhjbHVkZV9leHBzeW1zPSdbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgaW50ZXJpeFszLTldKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgIHRtcF9kaWV0PW5vCisgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBkaWV0XCAqKSB0bXBfZGlldD15ZXM7OwkjIGxpbnV4LWRpZXRsaWJjIHdpdGggc3RhdGljIGxpbmtpbmcgKCFkaWV0LWR5bikKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAorCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KKyAgICAgIHRoZW4KKwl0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKyAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKwkgIHRtcF9zaGFyZWRmbGFnPSctLXNoYXJlZCcgOzsKKwl4bFtjQ10qIHwgYmd4bFtjQ10qIHwgbXBpeGxbY0NdKikgIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCisJICB0bXBfYWRkZmxhZz0gOzsKKwludmNjKikJIyBDdWRhIENvbXBpbGVyIERyaXZlciAyLjIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGNvbXBpbGVyX25lZWRzX29iamVjdD15ZXMKKwkgIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGNvbXBpbGVyX25lZWRzX29iamVjdD15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHM9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisgICAgICAgIGZpCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCXhsZiogfCBiZ2YqIHwgYmd4bGYqIHwgbXBpeGxmKikKKwkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCAkR1JFUCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikKKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4WzQtOV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXhbNS05XSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgYXJjaGl2ZV9jbWRzPScnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIGZpbGVfbGlzdF9zcGVjPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8ICRHUkVQIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICA6CisJICBlbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKwlsaW5rX2FsbF9kZXBsaWJzPW5vCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1iZXhwYWxsJworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPSIvdXNyL2xpYjovbGliIgorICBmaQorCitmaQorCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aF8KK2ZpCisKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPSIvdXNyL2xpYjovbGliIgorICBmaQorCitmaQorCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aF8KK2ZpCisKKwkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJvaycKKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgZWxzZQorCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBic2RpWzQ1XSopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGNsKikKKwkjIE5hdGl2ZSBNU1ZDCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCWFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKwlmaWxlX2xpc3Rfc3BlYz0nQCcKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICBzZWQgLW4gLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyAtZSAnMVxcXCFwJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZWxzZQorCSAgICBzZWQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZml+CisJICAkQ0MgLW8gJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzICJAJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUuZXhwIiAtV2wsLURMTCwtSU1QTElCOiIkdG9vbF9vdXRwdXRfb2JqZGlyJGxpYm5hbWUuZGxsLmxpYiJ+CisJICBsaW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkjIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgKT0ndHJ1ZScKKwllbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworCWV4Y2x1ZGVfZXhwc3ltcz0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworCWV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxLERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddWyBdL3MvLipbIF0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKwkjIERvbid0IHVzZSByYW5saWIKKwlvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCisJcG9zdGxpbmtfY21kcz0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICopCisJICAgICAgbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCSAgICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgOzsKKwkgIGVzYWN+CisJICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgIGZpJworCTs7CisgICAgICAqKQorCSMgQXNzdW1lIE1TVkMgd3JhcHBlcgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGZ1bmNfZWNob19hbGwgIiRkZXBsaWJzIiB8ICRTRUQgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorCW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCisJIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKwlvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisKKworICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfYXV0b21hdGljPXllcworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworCisgIGVsc2UKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJworICBmaQorICBsaW5rX2FsbF9kZXBsaWJzPXllcworICBhbGxvd191bmRlZmluZWRfZmxhZz0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIGFyY2hpdmVfY21kcz0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBtb2R1bGVfY21kcz0iXCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZHN5bXV0aWx9IgorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHM9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKworICBlbHNlCisgIGxkX3NobGlicz1ubworICBmaQorCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIuKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCWhhcmRjb2RlX2RpcmVjdD15ZXMKKwloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRDQyB1bmRlcnN0YW5kcyAtYi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX19iKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9fYj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTIC1iIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX19iIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX19iIiA9IHh5ZXM7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworZWxzZQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKK2ZpCisKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0PXllcworCSAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSMgVHJ5IHRvIHVzZSB0aGUgLWV4cG9ydGVkX3N5bWJvbCBsZCBvcHRpb24sIGlmIGl0IGRvZXMgbm90CisJIyB3b3JrLCBhc3N1bWUgdGhhdCAtZXhwb3J0c19maWxlIGRvZXMgbm90IHdvcmsgZWl0aGVyIGFuZAorCSMgaW1wbGljaXRseSBleHBvcnQgYWxsIHN5bWJvbHMuCisJIyBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIGxhbmd1YWdlcywgc28gbm8gcGVyLXRhZyBjYWNoZSB2YXJpYWJsZS4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGhvc3Rfb3MgbGlua2VyIGFjY2VwdHMgLWV4cG9ydGVkX3N5bWJvbC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisJICAgTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCAke3dsfS1leHBvcnRlZF9zeW1ib2wgJHt3bH1mb28gJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9L2Rldi9udWxsIgorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH0KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXMKK2Vsc2UKKyAgbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2w9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY2OyB9CisJaWYgdGVzdCAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA9IHllczsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtZXhwb3J0c19maWxlICRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaW5oZXJpdF9ycGF0aD15ZXMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICAgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHM9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorCisKKworCisKKworCisKKworCisKKworCisKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAkUk0gY29uZnRlc3QqCisJZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorCSAgdGhlbgorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworCSAgZWxzZQorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgIGZpCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCWZpCisJJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGRhcndpbiopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8sL0xSLyIgOzsKKyAgICAqKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovIiA7OworICBlc2FjCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlZF9zdHJpcF9lcT0icyw9XChbQS1aYS16XTpcKSxcMSxnIiA7OworICAgICopIGx0X3NlZF9zdHJpcF9lcT0icyw9LywvLGciIDs7CisgIGVzYWMKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGF3ayAkbHRfYXdrX2FyZyB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgJGx0X3NlZF9zdHJpcF9lcWAKKyAgY2FzZSAkbHRfc2VhcmNoX3BhdGhfc3BlYyBpbgorICAqXDsqKQorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAncy87LyAvZydgCisgICAgOzsKKyAgKikKKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICA7OworICBlc2FjCisgICMgT2ssIG5vdyB3ZSBoYXZlIHRoZSBwYXRoLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCB3ZSBjYW4gc3RlcCB0aHJvdWdoIGl0CisgICMgYW5kIGFkZCBtdWx0aWxpYiBkaXIgaWYgbmVjZXNzYXJ5LgorICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0KKyAgbHRfbXVsdGlfb3NfZGlyPWAkQ0MgJENQUEZMQUdTICRDRkxBR1MgJExERkxBR1MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSAyPi9kZXYvbnVsbGAKKyAgZm9yIGx0X3N5c19wYXRoIGluICRsdF9zZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGlmIHRlc3QgLWQgIiRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIjsgdGhlbgorICAgICAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciIKKyAgICBlbHNlCisgICAgICB0ZXN0IC1kICIkbHRfc3lzX3BhdGgiICYmIFwKKwlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKKyAgICBmaQorICBkb25lCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMiIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW2x0X2Zvb10rKzsgfQorICBpZiAobHRfZnJlcVtsdF9mb29dID09IDEpIHsgcHJpbnQgbHRfZm9vOyB9Cit9J2AKKyAgIyBBV0sgcHJvZ3JhbSBhYm92ZSBlcnJvbmVvdXNseSBwcmVwZW5kcyAnLycgdG8gQzovZG9zL3BhdGhzCisgICMgZm9yIHRoZXNlIGhvc3RzLgorICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHxcCisgICAgICAkU0VEICdzLC9cKFtBLVphLXpdOlwpLFwxLGcnYCA7OworICBlc2FjCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRsdF9OTDJTUGAKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4WzQtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8ICRHUkVQIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBwb3dlcnBjKQorICAgICMgU2luY2UgSnVseSAyMDA3IEFtaWdhT1M0IG9mZmljaWFsbHkgc3VwcG9ydHMgLnNvIGxpYnJhcmllcy4KKyAgICAjIFdoZW4gY29tcGlsaW5nIHRoZSBleGVjdXRhYmxlLCBhZGQgLXVzZS1keW5sZCAtTHNvYmpzOiB0byB0aGUgY29tcGlsZWxpbmUuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgOzsKKyAgbTY4aykKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWBmdW5jX2VjaG9fYWxsICIkbGliIiB8ICRTRUQgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgOzsKKyAgZXNhYworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpWzQ1XSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSIKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbYS16QS1aXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbMjNdLiopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyLiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworaGFpa3UqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIHJ1bnRpbWVfbG9hZGVyIgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy9ib290L2hvbWUvY29uZmlnL2xpYiAvYm9vdC9jb21tb24vbGliIC9ib290L3N5c3RlbS9saWInCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICBocHBhKjY0KikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKKyAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQorICA7OworCitpbnRlcml4WzMtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUgfCBnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBpZiAke2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bFwiOyBcCisJIExERkxBR1M9XCJcJExERkxBR1MgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIiIKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaWYgICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbDsgdGhlbiA6CisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKK2ZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisKK2ZpCisKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CiskYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8CisgICB0ZXN0IC1uICIkcnVucGF0aF92YXIiIHx8CisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1CiskYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkaW5oZXJpdF9ycGF0aCIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKKworCisKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKK2Vsc2UKKworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKworZmkKKworICAgIDs7CisKKyAgKikKKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxkX3NobF9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbGQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNobF9sb2FkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2hsX2xvYWQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKK2Vsc2UKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHN2bGQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID0geHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9kbGRfbGluays6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjbGluZSAkTElORU5PICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXaGVuIC1mdmlzYmlsaXR5PWhpZGRlbiBpcyB1c2VkLCBhc3N1bWUgdGhlIGNvZGUgaGFzIGJlZW4gYW5ub3RhdGVkCisgICBjb3JyZXNwb25kaW5nbHkgZm9yIHRoZSBzeW1ib2xzIG5lZWRlZC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKSkKK2ludCBmbm9yZCAoKSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKTsKKyNlbmRpZgorCitpbnQgZm5vcmQgKCkgeyByZXR1cm4gNDI7IH0KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7CisJfQorICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KK19MVF9FT0YKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICBmaQorICAgIDs7CisgICopCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgOzsKKyAgZXNhYworZmkKKworCisKKworCisKKworCisKKworCisKKyAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQorJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgZmkKKyAgICA7OworCisgIGFpeFs0LTldKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zdGF0aWMiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfc3RhdGljIiA+JjY7IH0KKworCisKKworZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9IiRsdF9zYXZlX0NDIgorCisKKworCisKKworCisKKworCisKKworCisKKworICAgICAgICBhY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgbGlidG9vbCIKKworCisKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZXMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlcyIgPiY2O30KK2FjX2ZuX2NfZmluZF9pbnRYX3QgIiRMSU5FTk8iICI4IiAiYWNfY3ZfY19pbnQ4X3QiCitjYXNlICRhY19jdl9jX2ludDhfdCBpbiAjKAorICBub3x5ZXMpIDs7ICMoCisgICopCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgaW50OF90ICRhY19jdl9jX2ludDhfdAorX0FDRU9GCis7OworZXNhYworCithY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiMTYiICJhY19jdl9jX2ludDE2X3QiCitjYXNlICRhY19jdl9jX2ludDE2X3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGludDE2X3QgJGFjX2N2X2NfaW50MTZfdAorX0FDRU9GCis7OworZXNhYworCithY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX2ludDMyX3QiCitjYXNlICRhY19jdl9jX2ludDMyX3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGludDMyX3QgJGFjX2N2X2NfaW50MzJfdAorX0FDRU9GCis7OworZXNhYworCithY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX2ludDY0X3QiCitjYXNlICRhY19jdl9jX2ludDY0X3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGludDY0X3QgJGFjX2N2X2NfaW50NjRfdAorX0FDRU9GCis7OworZXNhYworCithY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjgiICJhY19jdl9jX3VpbnQ4X3QiCitjYXNlICRhY19jdl9jX3VpbnQ4X3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCiskYXNfZWNobyAiI2RlZmluZSBfVUlOVDhfVCAxIiA+PmNvbmZkZWZzLmgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnQ4X3QgJGFjX2N2X2NfdWludDhfdAorX0FDRU9GCis7OworICBlc2FjCisKK2FjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMTYiICJhY19jdl9jX3VpbnQxNl90IgorY2FzZSAkYWNfY3ZfY191aW50MTZfdCBpbiAjKAorICBub3x5ZXMpIDs7ICMoCisgICopCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSB1aW50MTZfdCAkYWNfY3ZfY191aW50MTZfdAorX0FDRU9GCis7OworICBlc2FjCisKK2FjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX3VpbnQzMl90IgorY2FzZSAkYWNfY3ZfY191aW50MzJfdCBpbiAjKAorICBub3x5ZXMpIDs7ICMoCisgICopCisKKyRhc19lY2hvICIjZGVmaW5lIF9VSU5UMzJfVCAxIiA+PmNvbmZkZWZzLmgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnQzMl90ICRhY19jdl9jX3VpbnQzMl90CitfQUNFT0YKKzs7CisgIGVzYWMKKworYWNfZm5fY19maW5kX3VpbnRYX3QgIiRMSU5FTk8iICI2NCIgImFjX2N2X2NfdWludDY0X3QiCitjYXNlICRhY19jdl9jX3VpbnQ2NF90IGluICMoCisgIG5vfHllcykgOzsgIygKKyAgKikKKworJGFzX2VjaG8gIiNkZWZpbmUgX1VJTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgdWludDY0X3QgJGFjX2N2X2NfdWludDY0X3QKK19BQ0VPRgorOzsKKyAgZXNhYworCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzc2l6ZV90IiAiYWNfY3ZfdHlwZV9zc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNzaXplX3QgaW50CitfQUNFT0YKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3R5cGVfdWlkX3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInVpZF90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBhY19jdl90eXBlX3VpZF90PXllcworZWxzZQorICBhY19jdl90eXBlX3VpZF90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfdWlkX3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpZF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWlkX3QgPSBubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSB1aWRfdCBpbnQiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIGdpZF90IGludCIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tsZW5fdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2xlbl90Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJzb2NrbGVuX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyAoZGVmaW5lZCBhcyBpbnQpIiA+JjUKKyRhc19lY2hvICJubyAoZGVmaW5lZCBhcyBpbnQpIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgc29ja2xlbl90IGludCIgPj5jb25mZGVmcy5oCisKK2ZpCitybSAtZiBjb25mdGVzdCoKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IHNvY2thZGRyX3VuIiAiYWNfY3ZfdHlwZV9zdHJ1Y3Rfc29ja2FkZHJfdW4iICIjaW5jbHVkZSA8c3lzL3VuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3VuIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1VOIDEKK19BQ0VPRgorCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBhZGRyaW5mbyIgImFjX2N2X3R5cGVfc3RydWN0X2FkZHJpbmZvIiAiI2luY2x1ZGUgPG5ldGRiLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2FkZHJpbmZvIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX0FERFJJTkZPIDEKK19BQ0VPRgorCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBUWSBkZXZpY2UgZmlsZXMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQVFkgZGV2aWNlIGZpbGVzIiA+JjY7fQoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgICBhc19hY19GaWxlPWAkYXNfZWNobyAiYWNfY3ZfZmlsZV8iL2Rldi9wdG14IiIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9kZXYvcHRteFwiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBcIi9kZXYvcHRteFwiLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19hY19GaWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciICIkTElORU5PIiA1CitpZiB0ZXN0IC1yICIiL2Rldi9wdG14IiI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgorZWxzZQorICBldmFsICIkYXNfYWNfRmlsZT1ubyIKK2ZpCitmaQorZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisgICAgYXNfYWNfRmlsZT1gJGFzX2VjaG8gImFjX2N2X2ZpbGVfIi9kZXYvcHRjIiIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9kZXYvcHRjXCIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFwiL2Rldi9wdGNcIi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskYXNfYWNfRmlsZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQoraWYgdGVzdCAtciAiIi9kZXYvcHRjIiI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgorZWxzZQorICBldmFsICIkYXNfYWNfRmlsZT1ubyIKK2ZpCitmaQorZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFVl9QVFNfQU5EX1BUQyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MtY29tcGlsYXRpb246IGFzc3VtaW5nIC9kZXYvcHRteCBhbmQgL2Rldi9wdGMgYXJlIG5vdCBhdmFpbGFibGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MtY29tcGlsYXRpb246IGFzc3VtaW5nIC9kZXYvcHRteCBhbmQgL2Rldi9wdGMgYXJlIG5vdCBhdmFpbGFibGUiID4mMjt9CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW50cm9weSBzb3VyY2VzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZW50cm9weSBzb3VyY2VzIiA+JjY7fQorCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWVnZC1zb2NrZXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2VnZF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2VnZF9zb2NrZXQ7IEVHRF9TT0NLRVQ9IiR3aXRodmFsIgorCitmaQorCisgICAgaWYgdGVzdCAtbiAiJEVHRF9TT0NLRVQiOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgRUdEX1NPQ0tFVCAiJEVHRF9TT0NLRVQiCitfQUNFT0YKKworICAgIGZpCisKKyAgICAjIENoZWNrIGZvciB1c2VyLXNwZWNpZmllZCByYW5kb20gZGV2aWNlCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcmFuZG9tIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9yYW5kb20rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3JhbmRvbTsgUkFORE9NX0ZJTEU9IiR3aXRodmFsIgorZWxzZQorCisgICAgICAgICAgICAjIENoZWNrIGZvciByYW5kb20gZGV2aWNlCisgICAgICAgICAgICBhc19hY19GaWxlPWAkYXNfZWNobyAiYWNfY3ZfZmlsZV8iL2Rldi91cmFuZG9tIiIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9kZXYvdXJhbmRvbVwiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBcIi9kZXYvdXJhbmRvbVwiLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19hY19GaWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciICIkTElORU5PIiA1CitpZiB0ZXN0IC1yICIiL2Rldi91cmFuZG9tIiI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgorZWxzZQorICBldmFsICIkYXNfYWNfRmlsZT1ubyIKK2ZpCitmaQorZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgorICBSQU5ET01fRklMRT0iL2Rldi91cmFuZG9tIgorZmkKKworCisKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkUkFORE9NX0ZJTEUiOyB0aGVuCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBSQU5ET01fRklMRSAiJFJBTkRPTV9GSUxFIgorX0FDRU9GCisKKyAgICBmaQorZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MtY29tcGlsYXRpb246IGFzc3VtaW5nIGVudHJvcHkgc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcy1jb21waWxhdGlvbjogYXNzdW1pbmcgZW50cm9weSBzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIiA+JjI7fQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmF1bHQgZ3JvdXAiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZhdWx0IGdyb3VwIiA+JjY7fQorREVGQVVMVF9HUk9VUD1ub2JvZHkKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgICAgZ3JlcCAnXm5vZ3JvdXA6JyAvZXRjL2dyb3VwID4vZGV2L251bGwgJiYgREVGQVVMVF9HUk9VUD1ub2dyb3VwCitlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcy1jb21waWxhdGlvbjogYXNzdW1pbmcgbm9ncm91cCBpcyBub3QgYXZhaWxhYmxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzLWNvbXBpbGF0aW9uOiBhc3N1bWluZyBub2dyb3VwIGlzIG5vdCBhdmFpbGFibGUiID4mMjt9CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVmYXVsdCBncm91cCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmYXVsdCBncm91cC4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERUZBVUxUX0dST1VQIiA+JjUKKyRhc19lY2hvICIkREVGQVVMVF9HUk9VUCIgPiY2OyB9CisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGhlYWRlciBmaWxlcyIgPiY2O30KKyMgQUNfSEVBREVSX0RJUkVOVAorIyBBQ19IRUFERVJfU1REQworIyBBQ19IRUFERVJfU1lTX1dBSVQKK2ZvciBhY19oZWFkZXIgaW4gc3RkaW50LmggaW50dHlwZXMuaCBtYWxsb2MuaCB1Y29udGV4dC5oIHB0aHJlYWQuaCBwb2xsLmggdGNwZC5oIHN0cm9wdHMuaCBncnAuaCB1bmlzdGQuaCB1dGlsLmggbGlidXRpbC5oIHB0eS5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3NlbGVjdC5oIHN5cy9wb2xsLmggc3lzL3NvY2tldC5oIHN5cy91bi5oIHN5cy9pb2N0bC5oIHN5cy9maWxpby5oIHN5cy9yZXNvdXJjZS5oIHN5cy91aW8uaCBzeXMvc3lzY2FsbC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvc2NoZWQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvc2NoZWQuaCIgImFjX2N2X2hlYWRlcl9saW51eF9zY2hlZF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9zY2hlZF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfU0NIRURfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBtc2doZHIiICJtc2dfY29udHJvbCIgImFjX2N2X21lbWJlcl9zdHJ1Y3RfbXNnaGRyX21zZ19jb250cm9sIiAiCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X21zZ2hkcl9tc2dfY29udHJvbCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9NU0dIRFJfTVNHX0NPTlRST0wgMQorX0FDRU9GCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NU0dIRFJfTVNHX0NPTlRST0wgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvbmV0ZmlsdGVyX2lwdjQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibGludXgvbmV0ZmlsdGVyX2lwdjQuaCIgImFjX2N2X2hlYWRlcl9saW51eF9uZXRmaWx0ZXJfaXB2NF9oIiAiCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfbmV0ZmlsdGVyX2lwdjRfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX05FVEZJTFRFUl9JUFY0X0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbGlicmFyaWVzIiA+JjY7fQorIyBDaGVja3MgZm9yIHN0YW5kYXJkIGxpYnJhcmllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldGhvc3RieW5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRob3N0YnluYW1lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgbnNsOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWU9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZT1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB5cF9nZXRfZGVmYXVsdF9kb21haW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB5cF9nZXRfZGVmYXVsdF9kb21haW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3lwX2dldF9kZWZhdWx0X2RvbWFpbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBuc2w7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfeXBfZ2V0X2RlZmF1bHRfZG9tYWluPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfeXBfZ2V0X2RlZmF1bHRfZG9tYWluKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF95cF9nZXRfZGVmYXVsdF9kb21haW4rOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF95cF9nZXRfZGVmYXVsdF9kb21haW49bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF95cF9nZXRfZGVmYXVsdF9kb21haW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfeXBfZ2V0X2RlZmF1bHRfZG9tYWluIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3lwX2dldF9kZWZhdWx0X2RvbWFpbgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzb2NrZXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzb2NrZXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgc29ja2V0OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3NvY2tldD0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc29ja2V0PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc29ja2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zb2NrZXQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5wdHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVucHR5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9vcGVucHR5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgb3BlbnB0eSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIG9wZW5wdHkgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgdXRpbDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9vcGVucHR5PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfb3BlbnB0eSs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfb3BlbnB0eSs6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX29wZW5wdHk9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9vcGVucHR5IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX29wZW5wdHkiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfb3BlbnB0eQoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCisjIENoZWNrcyBmb3IgZHluYW1pYyBsb2FkZXIgYW5kIHpsaWIgbmVlZGVkIGJ5IE9wZW5TU0wKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbG9wZW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbG9wZW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBkbDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9kbG9wZW49JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX2Rsb3Blbj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9kbG9wZW4iID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfZGxvcGVuCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzaGxfbG9hZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNobF9sb2FkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNobF9sb2FkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2hsX2xvYWQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgZGxkOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3NobF9sb2FkPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfc2hsX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX3NobF9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc2hsX2xvYWQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zaGxfbG9hZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9zaGxfbG9hZCIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zaGxfbG9hZAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgaW5mbGF0ZUVuZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGluZmxhdGVFbmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX2luZmxhdGVFbmQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBpbmZsYXRlRW5kICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaW5mbGF0ZUVuZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB6OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX2luZmxhdGVFbmQ9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9pbmZsYXRlRW5kKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9pbmZsYXRlRW5kKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfaW5mbGF0ZUVuZD1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2luZmxhdGVFbmQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfaW5mbGF0ZUVuZCIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9pbmZsYXRlRW5kCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKworIyBBZGQgQmVPUyBsaWJyYXJpZXMKK2lmIHRlc3QgIngkaG9zdF9vcyIgPSAieGJlb3MiOyB0aGVuCisgICAgTElCUz0iJExJQlMgLWxiZSAtbHJvb3QgLWxiaW5kIgorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGxpYnJhcnkgZnVuY3Rpb25zIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbGlicmFyeSBmdW5jdGlvbnMiID4mNjt9CisjIHNhZmUgc3RyaW5nIG9wZXJhdGlvbnMKK2ZvciBhY19mdW5jIGluIHNucHJpbnRmIHZzbnByaW50ZgorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKyMgcHNldWRvdGVybWluYWwKK2ZvciBhY19mdW5jIGluIG9wZW5wdHkgX2dldHB0eQorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKyMgVW5peAorZm9yIGFjX2Z1bmMgaW4gZGFlbW9uIHdhaXRwaWQgd2FpdDQgc2V0c2lkIHNldGdyb3VwcyBjaHJvb3QKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisjIGxpbWl0cworZm9yIGFjX2Z1bmMgaW4gc3lzY29uZiBnZXRybGltaXQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisjIHRocmVhZHMvcmVlbnRyYW50IGZ1bmN0aW9ucworZm9yIGFjX2Z1bmMgaW4gcHRocmVhZF9zaWdtYXNrIGxvY2FsdGltZV9yCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworIyB0aHJlYWRzCitmb3IgYWNfZnVuYyBpbiBnZXRjb250ZXh0IF9fbWFrZWNvbnRleHRfdjIKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisjIHNvY2tldHMKK2ZvciBhY19mdW5jIGluIHBvbGwgZ2V0aG9zdGJ5bmFtZTIgZW5kaG9zdGVudCBnZXRuYW1laW5mbworZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRhZGRyaW5mby4uLiAiID4mNjsgfQorY2FzZSAiJGhvc3Rfb3MiIGluCisqYW5kcm9pZGVhYmkqKQorICAgICMgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODE4MjQ2L3NlZ21lbnRhdGlvbi1mYXVsdC1pbi1nZXRhZGRyaW5mbworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyAoYnVnZ3kgQW5kcm9pZCBpbXBsZW1lbnRhdGlvbikiID4mNQorJGFzX2VjaG8gIm5vIChidWdneSBBbmRyb2lkIGltcGxlbWVudGF0aW9uKSIgPiY2OyB9CisgICAgOzsKKyopCisgICAgIyBUcnU2NCBVTklYIGhhcyBnZXRhZGRyaW5mbygpIGJ1dCBoYXMgaXQgcmVuYW1lZCBpbiBsaWJjIGFzCisgICAgIyBzb21ldGhpbmcgZWxzZSBzbyB3ZSBtdXN0IGluY2x1ZGUgPG5ldGRiLmg+IHRvIGdldCB0aGUKKyAgICAjIHJlZGVmaW5pdGlvbi4KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKK2ludAorbWFpbiAoKQoreworCitnZXRhZGRyaW5mbyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9OworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRBRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIDs7Citlc2FjCisjIHBvbGwoKSBpcyBub3QgcmVjb21tZW5kZWQgb24gTWFjIE9TIFggPD0gMTAuMyBhbmQgYnJva2VuIG9uIE1hYyBPUyBYIDEwLjQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGJyb2tlbiBwb2xsKCkgaW1wbGVtZW50YXRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBwb2xsKCkgaW1wbGVtZW50YXRpb24uLi4gIiA+JjY7IH0KK2Nhc2UgIiRob3N0X29zIiBpbgorZGFyd2luMC04LiopCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyAocG9sbCgpIGRpc2FibGVkKSIgPiY1CiskYXNfZWNobyAieWVzIChwb2xsKCkgZGlzYWJsZWQpIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1BPTEwgMSIgPj5jb25mZGVmcy5oCisKKyAgICA7OworKikKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICA7OworZXNhYworIyBHTlUgZXh0ZW5zaW9ucworZm9yIGFjX2Z1bmMgaW4gcGlwZTIgYWNjZXB0NAorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wdGlvbmFsIGZlYXR1cmVzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogb3B0aW9uYWwgZmVhdHVyZXMiID4mNjt9CisjIFVzZSBJUHY2PworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgSVB2NiBzdXBwb3J0Li4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaXB2NiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9pcHY2K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfaXB2NjsKKyAgICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KKyAgICAgICAgICAgIHllcykgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0lQdjYgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG5vKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBlcnJvciIgPiY1CiskYXNfZWNobyAiZXJyb3IiID4mNjsgfQorICAgICAgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiYmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCIiICIkTElORU5PIiA1CisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworZWxzZQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMgKGRlZmF1bHQpIiA+JjUKKyRhc19lY2hvICJ5ZXMgKGRlZmF1bHQpIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0lQdjYgMSIgPj5jb25mZGVmcy5oCisKKworZmkKKworCisjIEZJUFMgTW9kZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBGSVBTIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgRklQUyBzdXBwb3J0Li4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmlwcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9maXBzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZmlwczsKKyAgICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KKyAgICAgICAgICAgIHllcykgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgICAgICAgICAgIHVzZV9maXBzPSJ5ZXMiCisKKyRhc19lY2hvICIjZGVmaW5lIFVTRV9GSVBTIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBubykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICAgICAgICAgICB1c2VfZmlwcz0ibm8iCisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBlcnJvciIgPiY1CiskYXNfZWNobyAiZXJyb3IiID4mNjsgfQorICAgICAgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiYmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCIiICIkTElORU5PIiA1CisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworZWxzZQorCisgICAgICAgIHVzZV9maXBzPSJhdXRvIgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogYXV0b2RldGVjdGluZyIgPiY1CiskYXNfZWNobyAiYXV0b2RldGVjdGluZyIgPiY2OyB9CisKKworZmkKKworCisjIERpc2FibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbiBzdXBwb3J0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHN5c3RlbWQgc29ja2V0IGFjdGl2YXRpb24gc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBzeXN0ZW1kIHNvY2tldCBhY3RpdmF0aW9uIHN1cHBvcnQuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zeXN0ZW1kIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N5c3RlbWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zeXN0ZW1kOworICAgICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgorICAgICAgICAgICAgeWVzKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2RfbGlzdGVuX2ZkcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNkX2xpc3Rlbl9mZHMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZF9saXN0ZW5fZmRzICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2RfbGlzdGVuX2ZkcyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBzeXN0ZW1kIHN5c3RlbWQtZGFlbW9uOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHM9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc2RfbGlzdGVuX2Zkcz1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfc2RfbGlzdGVuX2ZkcyIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1NZU1RFTUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG5vKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBlcnJvciIgPiY1CiskYXNfZWNobyAiZXJyb3IiID4mNjsgfQorICAgICAgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiQmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCIiICIkTElORU5PIiA1CisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworZWxzZQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBhdXRvZGV0ZWN0aW5nIiA+JjUKKyRhc19lY2hvICJhdXRvZGV0ZWN0aW5nIiA+JjY7IH0KKyAgICAgICAgIyB0aGUgbGlicmFyeSBuYW1lIGhhcyBjaGFuZ2VkIHRvIC1sc3lzdGVtZCBpbiBzeXN0ZW1kIDIwOQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2RfbGlzdGVuX2ZkcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNkX2xpc3Rlbl9mZHMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZF9saXN0ZW5fZmRzICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2RfbGlzdGVuX2ZkcyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBzeXN0ZW1kIHN5c3RlbWQtZGFlbW9uOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHM9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc2RfbGlzdGVuX2Zkcz1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3NkX2xpc3Rlbl9mZHMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfc2RfbGlzdGVuX2ZkcyIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zZF9saXN0ZW5fZmRzCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisgICBmb3IgYWNfaGVhZGVyIGluIHN5c3RlbWQvc2QtZGFlbW9uLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5c3RlbWQvc2QtZGFlbW9uLmgiICJhY19jdl9oZWFkZXJfc3lzdGVtZF9zZF9kYWVtb25faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzdGVtZF9zZF9kYWVtb25faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NZU1RFTURfU0RfREFFTU9OX0ggMQorX0FDRU9GCisKKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1NZU1RFTUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHN5c3RlbWQgc3VwcG9ydCBlbmFibGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHN5c3RlbWQgc3VwcG9ydCBlbmFibGVkIiA+JjY7fQorCitlbHNlCisKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHN5c3RlbWQgaGVhZGVyIG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBzeXN0ZW1kIGhlYWRlciBub3QgZm91bmQiID4mNjt9CisKK2ZpCisKK2RvbmUKKworZWxzZQorCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBzeXN0ZW1kIGxpYnJhcnkgbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHN5c3RlbWQgbGlicmFyeSBub3QgZm91bmQiID4mNjt9CisKK2ZpCisKKworCitmaQorCisKKyMgRGlzYWJsZSB1c2Ugb2YgbGlid3JhcCAoVENQIHdyYXBwZXJzKQorIyBpdCBzaG91bGQgYmUgdGhlIGxhc3QgY2hlY2shCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIFRDUCB3cmFwcGVycyBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIFRDUCB3cmFwcGVycyBzdXBwb3J0Li4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlid3JhcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ3cmFwK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlid3JhcDsKKyAgICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KKyAgICAgICAgICAgIHllcykgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0xJQldSQVAgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgICAgICAgICAgTElCUz0iJExJQlMgLWx3cmFwIgorICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgbm8pICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGVycm9yIiA+JjUKKyRhc19lY2hvICJlcnJvciIgPiY2OyB9CisgICAgICAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJCYWQgdmFsdWUgXCIke2VuYWJsZXZhbH1cIiIgIiRMSU5FTk8iIDUKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCitlbHNlCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGF1dG9kZXRlY3RpbmciID4mNQorJGFzX2VjaG8gImF1dG9kZXRlY3RpbmciID4mNjsgfQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBob3N0c19hY2Nlc3MgaW4gLWx3cmFwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBob3N0c19hY2Nlc3MgaW4gLWx3cmFwLi4uICIgPiY2OyB9CisgICAgICAgIHZhbGlkX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkdmFsaWRfTElCUyAtbHdyYXAiCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAgICAgICAgIGludCBob3N0c19hY2Nlc3MoKTsgaW50IGFsbG93X3NldmVyaXR5LCBkZW55X3NldmVyaXR5OworaW50CittYWluICgpCit7Citob3N0c19hY2Nlc3MoKQorICA7CisgIHJldHVybiAwOworfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9OworCiskYXNfZWNobyAiI2RlZmluZSBVU0VfTElCV1JBUCAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbGlid3JhcCBzdXBwb3J0IGVuYWJsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbGlid3JhcCBzdXBwb3J0IGVuYWJsZWQiID4mNjt9CisKK2Vsc2UKKworICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICAgICAgICAgIExJQlM9IiR2YWxpZF9MSUJTIgorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbGlid3JhcCBsaWJyYXJ5IG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsaWJ3cmFwIGxpYnJhcnkgbm90IGZvdW5kIiA+JjY7fQorCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNTTCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNTTCIgPiY2O30KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY29tcGlsZXIgc3lzcm9vdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY29tcGlsZXIgc3lzcm9vdC4uLiAiID4mNjsgfQoraWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICAgc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKK2ZpCitpZiB0ZXN0IC16ICIkc3lzcm9vdCIgLW8gIngkc3lzcm9vdCIgPSAieC8iOyB0aGVuCisgICAgc3lzcm9vdD0iIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAvIiA+JjUKKyRhc19lY2hvICIvIiA+JjY7IH0KK2Vsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN5c3Jvb3QiID4mNQorJGFzX2VjaG8gIiRzeXNyb290IiA+JjY7IH0KK2ZpCisKK2NoZWNrX3NzbF9kaXIoKSB7IDoKKyAgICB0ZXN0IC1uICIkMSIgLWEgLWYgIiQxL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCIgJiYgU1NMRElSPSIkMSIKK30KKworZmluZF9zc2xfZGlyKCkgeyA6CisgICAgc3R1bm5lbF9wcmVmaXg9IiRwcmVmaXgiCisgICAgdGVzdCAieCRzdHVubmVsX3ByZWZpeCIgPSAieE5PTkUiICYmIHN0dW5uZWxfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgIGZvciBtYWluX2RpciBpbiAiJHN0dW5uZWxfcHJlZml4IiAiL3Vzci9sb2NhbCIgIi91c3IvbGliIiAiL3Vzci9wa2ciICIvb3B0L2xvY2FsIiAiL29wdCIgIi91c3IiICIiOyBkbworICAgICAgICBmb3Igc3ViX2RpciBpbiAiL3NzbCIgIi9vcGVuc3NsIiAiL29zc2wiICIiOyBkbworICAgICAgICAgICAgY2hlY2tfc3NsX2RpciAiJHN5c3Jvb3QkbWFpbl9kaXIkc3ViX2RpciIKKyAgICAgICAgICAgIHRlc3QgLW4gIiRTU0xESVIiICYmIHJldHVybgorICAgICAgICBkb25lCisgICAgZG9uZQorICAgIGlmIHRlc3QgLXggIi91c3IvYmluL3hjcnVuIjsgdGhlbgorICAgICAgICBzZGtfcGF0aD1gL3Vzci9iaW4veGNydW4gLS1zZGsgbWFjb3N4IC0tc2hvdy1zZGstcGF0aGAKKyAgICAgICAgY2hlY2tfc3NsX2RpciAiJHNka19wYXRoL3VzciIKKyAgICBmaQorfQorCitTU0xESVI9IiIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFNTTCBkaXJlY3RvcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNTTCBkaXJlY3RvcnkuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zc2wgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3NzbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3NsOyBjaGVja19zc2xfZGlyICIkd2l0aHZhbCIKK2Vsc2UKKyAgZmluZF9zc2xfZGlyCisKK2ZpCisKK2lmIHRlc3QgLXogIiRTU0xESVIiOyB0aGVuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICJub3QgZm91bmQiID4mNjsgfQorYXNfZm5fZXJyb3IgJD8gIgorQ291bGQgbm90IGZpbmQgeW91ciBTU0wgbGlicmFyeSBpbnN0YWxsYXRpb24gZGlyCitVc2UgLS13aXRoLXNzbCBvcHRpb24gdG8gZml4IHRoaXMgcHJvYmxlbQorIiAiJExJTkVOTyIgNQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1NMRElSIiA+JjUKKyRhc19lY2hvICIkU1NMRElSIiA+JjY7IH0KKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNTTERJUiAiJFNTTERJUiIKK19BQ0VPRgorCisKK3ZhbGlkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiOyBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJFNTTERJUi9pbmNsdWRlIgordmFsaWRfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAtTCRTU0xESVIvbGliNjQgLUwkU1NMRElSL2xpYiAtbHNzbCAtbGNyeXB0byIKKworYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRTU0xESVIvaW5jbHVkZS9vcGVuc3NsL2VuZ2luZS5oIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkU1NMRElSL2luY2x1ZGUvb3BlbnNzbC9lbmdpbmUuaCIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PU1NMX0VOR0lORV9IIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogT3BlblNTTCBlbmdpbmUgaGVhZGVyIG5vdCBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBPcGVuU1NMIGVuZ2luZSBoZWFkZXIgbm90IGZvdW5kIiA+JjI7fQorZmkKKworCisKK2FzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kU1NMRElSL2luY2x1ZGUvb3BlbnNzbC9vY3NwLmgiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRTU0xESVIvaW5jbHVkZS9vcGVuc3NsL29jc3AuaCIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PU1NMX09DU1BfSCAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IE9wZW5TU0wgb2NzcCBoZWFkZXIgbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IE9wZW5TU0wgb2NzcCBoZWFkZXIgbm90IGZvdW5kIiA+JjI7fQorZmkKKworCisKK2lmIHRlc3QgIngkdXNlX2ZpcHMiID0gInhhdXRvIjsgdGhlbgorICAgIGZvciBhY19mdW5jIGluIEZJUFNfbW9kZV9zZXQKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiRklQU19tb2RlX3NldCIgImFjX2N2X2Z1bmNfRklQU19tb2RlX3NldCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19GSVBTX21vZGVfc2V0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfRklQU19NT0RFX1NFVCAxCitfQUNFT0YKKworCiskYXNfZWNobyAiI2RlZmluZSBVU0VfRklQUyAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZJUFMgc3VwcG9ydCBlbmFibGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZJUFMgc3VwcG9ydCBlbmFibGVkIiA+JjY7fQorCitlbHNlCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGSVBTIHN1cHBvcnQgbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZJUFMgc3VwcG9ydCBub3QgZm91bmQiID4mNjt9CisKK2ZpCitkb25lCisKK2ZpCisKK0NQUEZMQUdTPSIkdmFsaWRfQ1BQRkxBR1MiCitMSUJTPSIkdmFsaWRfTElCUyIKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHdyaXRlIHRoZSByZXN1bHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogd3JpdGUgdGhlIHJlc3VsdHMiID4mNjt9CithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgc3JjL01ha2VmaWxlIGRvYy9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKKyAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisgICAgIHQgY2xlYXIKKyAgICAgOmNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDplbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCisJY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgorICAgICAgZWxzZQorICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCisgICAgICAgICovKiB8ID86KikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKKwkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCisgICAgICAgICopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCitERUZTPS1ESEFWRV9DT05GSUdfSAorCithY19saWJvYmpzPQorYWNfbHRsaWJvYmpzPQorVT0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYXNfZm5fYXBwZW5kIGFjX2xpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYXNfZm5fYXBwZW5kIGFjX2x0bGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGF0IGdlbmVyYXRlZCBmaWxlcyBhcmUgbmV3ZXIgdGhhbiBjb25maWd1cmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIG5ld2VyIHRoYW4gY29uZmlndXJlLi4uICIgPiY2OyB9CisgICBpZiB0ZXN0IC1uICIkYW1fc2xlZXBfcGlkIjsgdGhlbgorICAgICAjIEhpZGUgd2FybmluZ3MgYWJvdXQgcmV1c2VkIFBJRHMuCisgICAgIHdhaXQgJGFtX3NsZWVwX3BpZCAyPi9kZXYvbnVsbAorICAgZmkKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBkb25lIiA+JjUKKyRhc19lY2hvICJkb25lIiA+JjY7IH0KKyBpZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgorICBhbV9fRVhFRVhUX1RSVUU9CisgIGFtX19FWEVFWFRfRkFMU0U9JyMnCitlbHNlCisgIGFtX19FWEVFWFRfVFJVRT0nIycKKyAgYW1fX0VYRUVYVF9GQUxTRT0KK2ZpCisKK2lmIHRlc3QgLXogIiR7QVVUSE9SX1RFU1RTX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FVVEhPUl9URVNUU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFVVEhPUl9URVNUU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKworOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCithY193cml0ZV9mYWlsPTAKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2FzX3dyaXRlX2ZhaWw9MAorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKKworU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAorLW4qKQorICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CisgIGVzYWM7OworKikKKyAgRUNIT19OPSctbic7OworZXNhYworCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCitmaQoraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPSdsbiAtcycKKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXBSJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZmkKK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXBSJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCisKKyMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgorYXNfZm5fZXhlY3V0YWJsZV9wICgpCit7CisgIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKK30gIyBhc19mbl9leGVjdXRhYmxlX3AKK2FzX3Rlc3RfeD0ndGVzdCAteCcKK2FzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBzdHVubmVsICRhc19tZSA1LjIyLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgorYWNfY3NfdmVyc2lvbj0iXFwKK3N0dW5uZWwgY29uZmlnLnN0YXR1cyA1LjIyCitjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCisgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgorCitDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisKK2FjX3B3ZD0nJGFjX3B3ZCcKK3NyY2Rpcj0nJHNyY2RpcicKK0lOU1RBTEw9JyRJTlNUQUxMJworTUtESVJfUD0nJE1LRElSX1AnCitBV0s9JyRBV0snCit0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0/KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCisgICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJFNIRUxMICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2hpZnQKKyAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKKyAgQ09ORklHX1NIRUxMPSckU0hFTEwnCisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgZXhlYyAiXCRAIgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgJGFzX2VjaG8gIiRhY19sb2ciCit9ID4mNQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIworIyBJTklULUNPTU1BTkRTCisjCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCisKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JworZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKK21hY3JvX3ZlcnNpb249J2AkRUNITyAiJG1hY3JvX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWFjcm9fcmV2aXNpb249J2AkRUNITyAiJG1hY3JvX3JldmlzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3NoYXJlZD0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwaWNfbW9kZT0nYCRFQ0hPICIkcGljX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Zhc3RfaW5zdGFsbD0nYCRFQ0hPICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTSEVMTD0nYCRFQ0hPICIkU0hFTEwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUNITz0nYCRFQ0hPICIkRUNITyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitQQVRIX1NFUEFSQVRPUj0nYCRFQ0hPICIkUEFUSF9TRVBBUkFUT1IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdF9hbGlhcz0nYCRFQ0hPICIkaG9zdF9hbGlhcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0PSdgJEVDSE8gIiRob3N0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3Rfb3M9J2AkRUNITyAiJGhvc3Rfb3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGRfYWxpYXM9J2AkRUNITyAiJGJ1aWxkX2FsaWFzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkPSdgJEVDSE8gIiRidWlsZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZF9vcz0nYCRFQ0hPICIkYnVpbGRfb3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU0VEPSdgJEVDSE8gIiRTRUQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworWHNlZD0nYCRFQ0hPICIkWHNlZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitHUkVQPSdgJEVDSE8gIiRHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0VHUkVQPSdgJEVDSE8gIiRFR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitGR1JFUD0nYCRFQ0hPICIkRkdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTEQ9J2AkRUNITyAiJExEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK05NPSdgJEVDSE8gIiROTSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMTl9TPSdgJEVDSE8gIiRMTl9TIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21heF9jbWRfbGVuPSdgJEVDSE8gIiRtYXhfY21kX2xlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithY19vYmpleHQ9J2AkRUNITyAiJGFjX29iamV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGVleHQ9J2AkRUNITyAiJGV4ZWV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF91bnNldD0nYCRFQ0hPICIkbHRfdW5zZXQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfU1AyTkw9J2AkRUNITyAiJGx0X1NQMk5MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X05MMlNQPSdgJEVDSE8gIiRsdF9OTDJTUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl90b19ob3N0X2ZpbGVfY21kPSdgJEVDSE8gIiRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9J2AkRUNITyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2ZsYWc9J2AkRUNITyAiJHJlbG9hZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9jbWRzPSdgJEVDSE8gIiRyZWxvYWRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPQkpEVU1QPSdgJEVDSE8gIiRPQkpEVU1QIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdgJEVDSE8gIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaWxlX21hZ2ljX2NtZD0nYCRFQ0hPICIkZmlsZV9tYWdpY19jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9tYWdpY19nbG9iPSdgJEVDSE8gIiRmaWxlX21hZ2ljX2dsb2IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2FudF9ub2Nhc2VnbG9iPSdgJEVDSE8gIiR3YW50X25vY2FzZWdsb2IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRExMVE9PTD0nYCRFQ0hPICIkRExMVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0nYCRFQ0hPICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQVI9J2AkRUNITyAiJEFSIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0FSX0ZMQUdTPSdgJEVDSE8gIiRBUl9GTEFHUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlcl9saXN0X3NwZWM9J2AkRUNITyAiJGFyY2hpdmVyX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTVFJJUD0nYCRFQ0hPICIkU1RSSVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworUkFOTElCPSdgJEVDSE8gIiRSQU5MSUIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9J2AkRUNITyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249J2AkRUNITyAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitDQz0nYCRFQ0hPICIkQ0MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQ0ZMQUdTPSdgJEVDSE8gIiRDRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXI9J2AkRUNITyAiJGNvbXBpbGVyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQz0nYCRFQ0hPICIkR0NDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25tX2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRubV9maWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9zeXNyb290PSdgJEVDSE8gIiRsdF9zeXNyb290IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29iamRpcj0nYCRFQ0hPICIkb2JqZGlyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK01BR0lDX0NNRD0nYCRFQ0hPICIkTUFHSUNfQ01EIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3BpYz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9waWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl93bCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfcHJvZ19jb21waWxlcl9jX289J2AkRUNITyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25lZWRfbG9ja3M9J2AkRUNITyAiJG5lZWRfbG9ja3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTUFOSUZFU1RfVE9PTD0nYCRFQ0hPICIkTUFOSUZFU1RfVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitEU1lNVVRJTD0nYCRFQ0hPICIkRFNZTVVUSUwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTk1FRElUPSdgJEVDSE8gIiROTUVESVQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTElQTz0nYCRFQ0hPICIkTElQTyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPVE9PTD0nYCRFQ0hPICIkT1RPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT1RPT0w2ND0nYCRFQ0hPICIkT1RPT0w2NCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJleHQ9J2AkRUNITyAiJGxpYmV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaHJleHRfY21kcz0nYCRFQ0hPICIkc2hyZXh0X2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXh0cmFjdF9leHBzeW1zX2NtZHM9J2AkRUNITyAiJGV4dHJhY3RfZXhwc3ltc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nYCRFQ0hPICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSdgJEVDSE8gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9uZWVkc19vYmplY3Q9J2AkRUNITyAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHM9J2AkRUNITyAiJGFyY2hpdmVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2V4cHN5bV9jbWRzPSdgJEVDSE8gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzPSdgJEVDSE8gIiRtb2R1bGVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfZXhwc3ltX2NtZHM9J2AkRUNITyAiJG1vZHVsZV9leHBzeW1fY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3aXRoX2dudV9sZD0nYCRFQ0hPICIkd2l0aF9nbnVfbGQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWxsb3dfdW5kZWZpbmVkX2ZsYWc9J2AkRUNITyAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25vX3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0PSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTD0nYCRFQ0hPICIkaGFyZGNvZGVfbWludXNfTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSdgJEVDSE8gIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2F1dG9tYXRpYz0nYCRFQ0hPICIkaGFyZGNvZGVfYXV0b21hdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGg9J2AkRUNITyAiJGluaGVyaXRfcnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlua19hbGxfZGVwbGlicz0nYCRFQ0hPICIkbGlua19hbGxfZGVwbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbHdheXNfZXhwb3J0X3N5bWJvbHM9J2AkRUNITyAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfc3ltYm9sc19jbWRzPSdgJEVDSE8gIiRleHBvcnRfc3ltYm9sc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4Y2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luY2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kcz0nYCRFQ0hPICIkcHJlbGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RsaW5rX2NtZHM9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9saXN0X3NwZWM9J2AkRUNITyAiJGZpbGVfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSdgJEVDSE8gIiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX2xpYl9wcmVmaXg9J2AkRUNITyAiJG5lZWRfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX3ZlcnNpb249J2AkRUNITyAiJG5lZWRfdmVyc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2ZXJzaW9uX3R5cGU9J2AkRUNITyAiJHZlcnNpb25fdHlwZSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitydW5wYXRoX3Zhcj0nYCRFQ0hPICIkcnVucGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9J2AkRUNITyAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJuYW1lX3NwZWM9J2AkRUNITyAiJGxpYm5hbWVfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJyYXJ5X25hbWVzX3NwZWM9J2AkRUNITyAiJGxpYnJhcnlfbmFtZXNfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzb25hbWVfc3BlYz0nYCRFQ0hPICIkc29uYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaW5zdGFsbF9vdmVycmlkZV9tb2RlPSdgJEVDSE8gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGluc3RhbGxfY21kcz0nYCRFQ0hPICIkcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0dW5pbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3R1bmluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaW5pc2hfY21kcz0nYCRFQ0hPICIkZmluaXNoX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2V2YWw9J2AkRUNITyAiJGZpbmlzaF9ldmFsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2ludG9fbGlicz0nYCRFQ0hPICIkaGFyZGNvZGVfaW50b19saWJzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSdgJEVDSE8gIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hY3Rpb249J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9kbG9wZW5fc2VsZj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3Blbl9zZWxmIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3N0cmlwbGliPSdgJEVDSE8gIiRvbGRfc3RyaXBsaWIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc3RyaXBsaWI9J2AkRUNITyAiJHN0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKKworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIFNIRUxMIFwKK0VDSE8gXAorUEFUSF9TRVBBUkFUT1IgXAorU0VEIFwKK0dSRVAgXAorRUdSRVAgXAorRkdSRVAgXAorTEQgXAorTk0gXAorTE5fUyBcCitsdF9TUDJOTCBcCitsdF9OTDJTUCBcCityZWxvYWRfZmxhZyBcCitPQkpEVU1QIFwKK2RlcGxpYnNfY2hlY2tfbWV0aG9kIFwKK2ZpbGVfbWFnaWNfY21kIFwKK2ZpbGVfbWFnaWNfZ2xvYiBcCit3YW50X25vY2FzZWdsb2IgXAorRExMVE9PTCBcCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCBcCitBUiBcCitBUl9GTEFHUyBcCithcmNoaXZlcl9saXN0X3NwZWMgXAorU1RSSVAgXAorUkFOTElCIFwKK0NDIFwKK0NGTEFHUyBcCitjb21waWxlciBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXggXAorbm1fZmlsZV9saXN0X3NwZWMgXAorbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAorbHRfcHJvZ19jb21waWxlcl9waWMgXAorbHRfcHJvZ19jb21waWxlcl93bCBcCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCitsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCituZWVkX2xvY2tzIFwKK01BTklGRVNUX1RPT0wgXAorRFNZTVVUSUwgXAorTk1FRElUIFwKK0xJUE8gXAorT1RPT0wgXAorT1RPT0w2NCBcCitzaHJleHRfY21kcyBcCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAorY29tcGlsZXJfbmVlZHNfb2JqZWN0IFwKK3dpdGhfZ251X2xkIFwKK2FsbG93X3VuZGVmaW5lZF9mbGFnIFwKK25vX3VuZGVmaW5lZF9mbGFnIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYjsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAorb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCitvbGRfYXJjaGl2ZV9jbWRzIFwKK2V4dHJhY3RfZXhwc3ltc19jbWRzIFwKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorYXJjaGl2ZV9jbWRzIFwKK2FyY2hpdmVfZXhwc3ltX2NtZHMgXAorbW9kdWxlX2NtZHMgXAorbW9kdWxlX2V4cHN5bV9jbWRzIFwKK2V4cG9ydF9zeW1ib2xzX2NtZHMgXAorcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAorcG9zdGluc3RhbGxfY21kcyBcCitwb3N0dW5pbnN0YWxsX2NtZHMgXAorZmluaXNoX2NtZHMgXAorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorCisjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgorICAgICJzcmMvY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIHNyYy9jb25maWcuaCIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgImxpYnRvb2wiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgbGlidG9vbCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgInNyYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzcmMvTWFrZWZpbGUiIDs7CisgICAgImRvYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkb2MvTWFrZWZpbGUiIDs7CisgICAgInRvb2xzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL01ha2VmaWxlIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OworICBlc2FjCitkb25lCisKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKyAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiskZGVidWcgfHwKK3sKKyAgdG1wPSBhY190bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIDogIiR7YWNfdG1wOj0kdG1wfSIKKyAgeyB0ZXN0ICEgLWQgIiRhY190bXAiIHx8IHJtIC1mciAiJGFjX3RtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CithY190bXA9JHRtcAorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXFxyJworZWxzZQorICBhY19jc19hd2tfY3I9JGFjX2NyCitmaQorCitlY2hvICdCRUdJTiB7JyA+IiRhY190bXAvc3ViczEuYXdrIiAmJgorX0FDRU9GCisKKworeworICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgorICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisgIGVjaG8gIl9BQ0VPRiIKK30gPmNvbmYkJHN1YnMuc2ggfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICdeJ2AKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKyAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCitybSAtZiBjb25mJCRzdWJzLnNoCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorX0FDRU9GCitzZWQgLW4gJworaAorcy9eL1NbIi87IHMvIS4qLyJdPS8KK3AKK2cKK3MvXlteIV0qIS8vCis6cmVwbAordCByZXBsCitzLyciJGFjX2RlbGltIickLy8KK3QgZGVsaW0KKzpubAoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBlbnRyaWVzIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9WwkgXSoveworaAorcy8vLworcy9eLzovCitzL1sJIF0qJC86Lworcy86XCQoc3JjZGlyKTovOi9nCitzLzpcJHtzcmNkaXJ9Oi86L2cKK3MvOkBzcmNkaXJAOi86L2cKK3MvXjoqLy8KK3MvOiokLy8KK3gKK3MvXCg9WwkgXSpcKS4qL1wxLworRworcy9cbi8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorQkVHSU4geworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCisjIGhlcmUtZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisKKyMgQ3JlYXRlIGEgZGVsaW1pdGVyIHN0cmluZyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGNvbmZkZWZzLmgsIHRvIGVhc2UKKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KKyAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUyIKK3NoaWZ0Citmb3IgYWNfdGFnCitkbworICBjYXNlICRhY190YWcgaW4KKyAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7CisgIGVzYWMKKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKyAgOltGSExdKjoqKTs7CisgIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisgICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgorICAgIGRvbmUKKworICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCisJYCcgYnkgY29uZmlndXJlLicKKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgZmkKKyAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAorICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8CisgICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCisgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisgICAgZXNhYworCisgICAgY2FzZSAkYWNfdGFnIGluCisgICAgKjotOiogfCAqOi0pIGNhdCA+IiRhY190bXAvc3RkaW4iIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisKKyAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCisgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKworICBjYXNlICRhY19tb2RlIGluCisgIDpGKQorICAjCisgICMgQ09ORklHX0ZJTEUKKyAgIworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKKyAgZXNhYworICBhY19NS0RJUl9QPSRNS0RJUl9QCisgIGNhc2UgJE1LRElSX1AgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKKyAgZXNhYworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKyMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgorYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49CithY19zZWRfZGF0YXJvb3Q9JworL2RhdGFyb290ZGlyLyB7CisgIHAKKyAgcQorfQorL0BkYXRhZGlyQC9wCisvQGRvY2RpckAvcAorL0BpbmZvZGlyQC9wCisvQGxvY2FsZWRpckAvcAorL0BtYW5kaXJAL3AnCitjYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCisqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CisqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCisgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKyAgcyZAaW5mb2RpckAmJGluZm9kaXImZworICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworICBzJkBtYW5kaXJAJiRtYW5kaXImZworICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworZXNhYworX0FDRU9GCisKKyMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KKyMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgorIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19zZWRfZXh0cmE9IiRhY192cHN1YgorJGV4dHJhc3ViCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0CitzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKK3MmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKK3MmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0CitzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CitzJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0CitzJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKK3MmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKK3MmQE1LRElSX1BAJiRhY19NS0RJUl9QJjt0IHQKKyRhY19kYXRhcm9vdGRpcl9oYWNrCisiCitldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiBcCisgID4kYWNfdG1wL291dCB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKwordGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJGFjX3RtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgXAorICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mMjt9CisKKyAgcm0gLWYgIiRhY190bXAvc3RkaW4iCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSkgY2F0ICIkYWNfdG1wL291dCIgJiYgcm0gLWYgIiRhY190bXAvb3V0Ijs7CisgICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiRhY190bXAvb3V0IiAiJGFjX2ZpbGUiOzsKKyAgZXNhYyBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorIDs7CisgIDpIKQorICAjCisgICMgQ09ORklHX0hFQURFUgorICAjCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7CisgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorICAgIH0gPiIkYWNfdG1wL2NvbmZpZy5oIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKwl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgLSIgIiRMSU5FTk8iIDUKKyAgZmkKKyMgQ29tcHV0ZSAiJGFjX2ZpbGUiJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX2FyZz0iJGFjX2ZpbGUiCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmAkYXNfZGlybmFtZSAtLSAiJF9hbV9hcmciIHx8CiskYXNfZXhwciBYIiRfYW1fYXJnIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRfYW1fYXJnIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJF9hbV9hcmciIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYC9zdGFtcC1oJF9hbV9zdGFtcF9jb3VudAorIDs7CisKKyAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9CisgOzsKKyAgZXNhYworCisKKyAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCisgICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCB7CisgICMgT2xkZXIgQXV0b2NvbmYgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcworICAjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCisgICMgaWYgd2UgZGV0ZWN0IHRoZSBxdW90aW5nLgorICBjYXNlICRDT05GSUdfRklMRVMgaW4KKyAgKlwnKikgZXZhbCBzZXQgeCAiJENPTkZJR19GSUxFUyIgOzsKKyAgKikgICBzZXQgeCAkQ09ORklHX0ZJTEVTIDs7CisgIGVzYWMKKyAgc2hpZnQKKyAgZm9yIG1mCisgIGRvCisgICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCisgICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkICdNYWtlZmlsZS5pbicsIGJ1dAorICAgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCisgICAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQorICAgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgorICAgIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8CiskYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRtZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgJ21ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICIkYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJ2A7IGRvCisgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAorJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRmaWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAorICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICAgIGRvbmUKKyAgZG9uZQorfQorIDs7CisgICAgImxpYnRvb2wiOkMpCisKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQorIyAgICAgICAgICAgICAgICAgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbC4KKyMKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwgb3IKKyMgb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworCisjIFRoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2F2YWlsYWJsZV90YWdzPSIiCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkPworbWFjcm9fdmVyc2lvbj0kbWFjcm9fdmVyc2lvbgorbWFjcm9fcmV2aXNpb249JG1hY3JvX3JldmlzaW9uCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkLgorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzLgorRUNITz0kbHRfRUNITworCisjIFRoZSBQQVRIIHNlcGFyYXRvciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KK1BBVEhfU0VQQVJBVE9SPSRsdF9QQVRIX1NFUEFSQVRPUgorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iXCRTRUQgLWUgMXMvXlgvLyIKKworIyBBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcy4KK0dSRVA9JGx0X0dSRVAKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIEEgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlci4KK0ZHUkVQPSRsdF9GR1JFUAorCisjIEEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyLgorTk09JGx0X05NCisKKyMgV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbWF4X2NtZF9sZW4KKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9JGFjX29iamV4dAorCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0kZXhlZXh0CisKKyMgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Ii4KK2x0X3Vuc2V0PSRsdF91bnNldAorCisjIHR1cm4gc3BhY2VzIGludG8gbmV3bGluZXMuCitTUDJOTD0kbHRfbHRfU1AyTkwKKworIyB0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzLgorTkwyU1A9JGx0X2x0X05MMlNQCisKKyMgY29udmVydCBcJGJ1aWxkIGZpbGUgbmFtZXMgdG8gXCRob3N0IGZvcm1hdC4KK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4KK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKKworIyBBbiBvYmplY3Qgc3ltYm9sIGR1bXBlci4KK09CSkRVTVA9JGx0X09CSkRVTVAKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfZ2xvYj0kbHRfZmlsZV9tYWdpY19nbG9iCisKKyMgRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgord2FudF9ub2Nhc2VnbG9iPSRsdF93YW50X25vY2FzZWdsb2IKKworIyBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9JGx0X0RMTFRPT0wKKworIyBDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzLgorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCisKKyMgRmxhZ3MgdG8gY3JlYXRlIGFuIGFyY2hpdmUuCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXIuCithcmNoaXZlcl9saXN0X3NwZWM9JGx0X2FyY2hpdmVyX2xpc3Rfc3BlYworCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtLgorU1RSSVA9JGx0X1NUUklQCisKKyMgQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIFdoZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbi4KK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0kbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0NGTEFHUworCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkLgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4CisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciBcJE5NLgorbm1fZmlsZV9saXN0X3NwZWM9JGx0X25tX2ZpbGVfbGlzdF9zcGVjCisKKyMgVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzLGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuCitsdF9zeXNyb290PSRsdF9zeXNyb290CisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiLgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBNYW5pZmVzdCB0b29sLgorTUFOSUZFU1RfVE9PTD0kbHRfTUFOSUZFU1RfVE9PTAorCisjIFRvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFguCitEU1lNVVRJTD0kbHRfRFNZTVVUSUwKKworIyBUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWC4KK05NRURJVD0kbHRfTk1FRElUCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWC4KK0xJUE89JGx0X0xJUE8KKworIyBsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWC4KK09UT09MPSRsdF9PVE9PTAorCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40LgorT1RPT0w2ND0kbHRfT1RPT0w2NAorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0kbGliZXh0CisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0kbHRfc2hyZXh0X2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IGxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSRsdF92YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaworCisjIERvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIFNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRQorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIFBlcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCitpbnN0YWxsX292ZXJyaWRlX21vZGU9JGx0X2luc3RhbGxfb3ZlcnJpZGVfbW9kZQorCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlLgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIEFzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorIyBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzLgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYy4KK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5LgorY29tcGlsZXJfbmVlZHNfb2JqZWN0PSRsdF9jb21waWxlcl9uZWVkc19vYmplY3QKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZQorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicworCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHMKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kcworCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlYworCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAorICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIGlmIHRlc3QgeCIkeHNpX3NoZWxsIiA9IHh5ZXM7IHRoZW4KKyAgc2VkIC1lICcvXmZ1bmNfZGlybmFtZSAoKSQvLC9efSAjIGZ1bmNfZGlybmFtZSAvY1wKK2Z1bmNfZGlybmFtZSAoKVwKK3tcCitcICAgIGNhc2UgJHsxfSBpblwKK1wgICAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7O1wKK1wgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7XAorXCAgICBlc2FjXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfZGlybmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYmFzZW5hbWUgKCkkLywvXn0gIyBmdW5jX2Jhc2VuYW1lIC9jXAorZnVuY19iYXNlbmFtZSAoKVwKK3tcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkkLywvXn0gIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIC9jXAorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKVwKK3tcCitcICAgIGNhc2UgJHsxfSBpblwKK1wgICAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7O1wKK1wgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7XAorXCAgICBlc2FjXAorXCAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3N0cmlwbmFtZSAoKSQvLC9efSAjIGZ1bmNfc3RyaXBuYW1lIC9jXAorZnVuY19zdHJpcG5hbWUgKClcCit7XAorXCAgICAjIHBka3NoIDUuMi4xNCBkb2VzIG5vdCBkbyAke1glJFl9IGNvcnJlY3RseSBpZiBib3RoIFggYW5kIFkgYXJlXAorXCAgICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuXAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0IyIkezF9In1cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3RyaXBuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19zcGxpdF9sb25nX29wdCAoKSQvLC9efSAjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgL2NcCitmdW5jX3NwbGl0X2xvbmdfb3B0ICgpXAore1wKK1wgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz0kezEjKj19XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfbG9uZ19vcHQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X3Nob3J0X29wdCAoKSQvLC9efSAjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IC9jXAorZnVuY19zcGxpdF9zaG9ydF9vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9JHsxIz8/fVwKK1wgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT0kezElIiRmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcifVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX3NwbGl0X3Nob3J0X29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfbG8ybyAoKSQvLC9efSAjIGZ1bmNfbG8ybyAvY1wKK2Z1bmNfbG8ybyAoKVwKK3tcCitcICAgIGNhc2UgJHsxfSBpblwKK1wgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7O1wKK1wgICAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19sbzJvIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY194Zm9ybSAoKSQvLC9efSAjIGZ1bmNfeGZvcm0gL2NcCitmdW5jX3hmb3JtICgpXAore1wKKyAgICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfeGZvcm0gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FyaXRoICgpJC8sL159ICMgZnVuY19hcml0aCAvY1wKK2Z1bmNfYXJpdGggKClcCit7XAorICAgIGZ1bmNfYXJpdGhfcmVzdWx0PSQoKCAkKiApKVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2FyaXRoIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sZW4gKCkkLywvXn0gIyBmdW5jX2xlbiAvY1wKK2Z1bmNfbGVuICgpXAore1wKKyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19sZW4gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19hcHBlbmQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZCAvY1wKK2Z1bmNfYXBwZW5kICgpXAore1wKKyAgICBldmFsICIkezF9Kz1cXCR7Mn0iXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXBwZW5kIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19hcHBlbmRfcXVvdGVkICgpJC8sL159ICMgZnVuY19hcHBlbmRfcXVvdGVkIC9jXAorZnVuY19hcHBlbmRfcXVvdGVkICgpXAore1wKK1wgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSJcCitcICAgIGV2YWwgIiR7MX0rPVxcXFwgXFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXBwZW5kX3F1b3RlZCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbYS16QS1aX11cezEsXH1cKSAiJVwxKz0iJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitlbHNlCisgICMgU2F2ZSBhIGBmdW5jX2FwcGVuZCcgZnVuY3Rpb24gY2FsbCBldmVuIHdoZW4gJys9JyBpcyBub3QgYXZhaWxhYmxlCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDE9IiRcMSVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZmkKKworaWYgdGVzdCB4IiRfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsIiA9IHgiOiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mMjt9CitmaQorCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorCisgOzsKKworICBlc2FjCitkb25lICMgZm9yIGFjX3RhZworCisKK2FzX2ZuX2V4aXQgMAorX0FDRU9GCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzdWNjZXNzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc3VjY2VzcyIgPiY2O30KKyMgRW5kIG9mIGNvbmZpZ3VyZS5hYworIyB2aW06ZnQ9YXV0b21ha2UKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2I3NTQwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsNDU1IEBACisjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX0lOSVQoW3N0dW5uZWxdLFs1LjIyXSkKK0FDX01TR19OT1RJQ0UoWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb25dKQorQUNfQ09ORklHX0FVWF9ESVIoYXV0bykKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX0NPTkZJR19IRUFERVJTKFtzcmMvY29uZmlnLmhdKQorQUNfQ09ORklHX1NSQ0RJUihbc3JjL3N0dW5uZWwuY10pCitBTV9JTklUX0FVVE9NQUtFCitBQ19ERUZJTkUoW19HTlVfU09VUkNFXSwgWzFdLCBbVXNlIEdOVSBzb3VyY2VdKQorCitBTV9DT05ESVRJT05BTChbQVVUSE9SX1RFU1RTXSwgW3Rlc3QgLWQgIi5naXQiXSkKK0FDX0NBTk9OSUNBTF9IT1NUCitBQ19TVUJTVChbaG9zdF0pCitBQ19ERUZJTkVfVU5RVU9URUQoW0hPU1RdLCBbIiRob3N0Il0sIFtIb3N0IGRlc2NyaXB0aW9uXSkKK2RlZmluZShbZXNjXSwgW2BlY2hvIF0kMVsgfCB0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4tIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX18gfCB0ciAtZGMgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwX2BdKQorQUNfREVGSU5FX1VOUVVPVEVEKGVzYyhDUFVfJGhvc3RfY3B1KSkKK0FDX0RFRklORV9VTlFVT1RFRChlc2MoVkVORE9SXyRob3N0X3ZlbmRvcikpCitBQ19ERUZJTkVfVU5RVU9URUQoZXNjKE9TXyRob3N0X29zKSkKKworQUNfUFJPR19DQworQU1fUFJPR19DQ19DX08KK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19NQUtFX1NFVAorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRocmVhZCBtb2RlbF0pCisjIHRocmVhZCBkZXRlY3Rpb24gc2hvdWxkIGJlIGRvbmUgZmlyc3QsIGFzIGl0IG1heSBjaGFuZ2UgdGhlIENDIHZhcmlhYmxlCisKK0FDX0FSR19XSVRIKHRocmVhZHMsCitbICAtLXdpdGgtdGhyZWFkcz1tb2RlbCAgICBzZWxlY3QgdGhyZWFkaW5nIG1vZGVsICh1Y29udGV4dC9wdGhyZWFkL2ZvcmspXSwKK1sKKyAgICBjYXNlICIkd2l0aHZhbCIgaW4KKyAgICAgICAgdWNvbnRleHQpCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtVQ09OVEVYVCBtb2RlIHNlbGVjdGVkXSkKKyAgICAgICAgICAgIEFDX0RFRklORShbVVNFX1VDT05URVhUXSwgWzFdLCBbRGVmaW5lIHRvIDEgdG8gc2VsZWN0IFVDT05URVhUIG1vZGVdKQorICAgICAgICAgICAgOzsKKyAgICAgICAgcHRocmVhZCkKKyAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1BUSFJFQUQgbW9kZSBzZWxlY3RlZF0pCisgICAgICAgICAgICBBWF9QVEhSRUFEKCkKKyAgICAgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICAgICAgQ0M9IiRQVEhSRUFEX0NDIgorICAgICAgICAgICAgQUNfREVGSU5FKFtVU0VfUFRIUkVBRF0sIFsxXSwgW0RlZmluZSB0byAxIHRvIHNlbGVjdCBQVEhSRUFEIG1vZGVdKQorICAgICAgICAgICAgOzsKKyAgICAgICAgZm9yaykKKyAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW0ZPUksgbW9kZSBzZWxlY3RlZF0pCisgICAgICAgICAgICBBQ19ERUZJTkUoW1VTRV9GT1JLXSwgWzFdLCBbRGVmaW5lIHRvIDEgdG8gc2VsZWN0IEZPUksgbW9kZV0pCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtVbmtub3duIHRocmVhZCBtb2RlbCBcIiR7d2l0aHZhbH1cIl0pCisgICAgICAgICAgICA7OworICAgIGVzYWMKK10sIFsKKyAgICAjIGRvIG5vdCBhdHRlbXB0IHRvIGF1dG9kZXRlY3QgVUNPTlRFWFQgdGhyZWFkaW5nCisgICAgQVhfUFRIUkVBRChbCisgICAgICAgIEFDX01TR19OT1RJQ0UoW1BUSFJFQUQgdGhyZWFkIG1vZGVsIGRldGVjdGVkXSkKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgQ0M9IiRQVEhSRUFEX0NDIgorICAgICAgICBBQ19ERUZJTkUoW1VTRV9QVEhSRUFEXSwgWzFdLCBbRGVmaW5lIHRvIDEgdG8gc2VsZWN0IFBUSFJFQUQgbW9kZV0pCisgICAgXSwgWworICAgICAgICBBQ19NU0dfTk9USUNFKFtGT1JLIHRocmVhZCBtb2RlbCBkZXRlY3RlZF0pCisgICAgICAgIEFDX0RFRklORShbVVNFX0ZPUktdLCBbMV0sIFtEZWZpbmUgdG8gMSB0byBzZWxlY3QgRk9SSyBtb2RlXSkKKyAgICBdKQorXSkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjb21waWxlci9saW5rZXIgZmxhZ3NdKQorQVhfQVBQRU5EX0NPTVBJTEVfRkxBR1MoWy1XYWxsXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstV2V4dHJhXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstV3BlZGFudGljXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstV2Zvcm1hdD0yXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstV2NvbnZlcnNpb25dKQorQVhfQVBQRU5EX0NPTVBJTEVfRkxBR1MoWy1Xbm8tbG9uZy1sb25nXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXSkKK0FYX0FQUEVORF9DT01QSUxFX0ZMQUdTKFstZnN0YWNrLXByb3RlY3Rvcl0pCitBWF9BUFBFTkRfQ09NUElMRV9GTEFHUyhbLWZQSUVdKQorQVhfQVBQRU5EX0NPTVBJTEVfRkxBR1MoWy1EX0ZPUlRJRllfU09VUkNFPTJdKQorQVhfQVBQRU5EX0xJTktfRkxBR1MoWy1mUElFIC1waWVdKQorQVhfQVBQRU5EX0xJTktfRkxBR1MoWy1XbCwteixyZWxyb10pCitBWF9BUFBFTkRfTElOS19GTEFHUyhbLVdsLC16LG5vd10pCitBWF9BUFBFTkRfTElOS19GTEFHUyhbLVdsLC16LG5vZXhlY3N0YWNrXSkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsaWJ0b29sXSkKK0xUX0lOSVQoW2Rpc2FibGUtc3RhdGljXSkKK0FDX1NVQlNUKFtMSUJUT09MX0RFUFNdKQorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVzXSkKK0FDX1RZUEVfSU5UOF9UCitBQ19UWVBFX0lOVDE2X1QKK0FDX1RZUEVfSU5UMzJfVAorQUNfVFlQRV9JTlQ2NF9UCitBQ19UWVBFX1VJTlQ4X1QKK0FDX1RZUEVfVUlOVDE2X1QKK0FDX1RZUEVfVUlOVDMyX1QKK0FDX1RZUEVfVUlOVDY0X1QKK0FDX1RZUEVfU0laRV9UCitBQ19UWVBFX1NTSVpFX1QKK0FDX1RZUEVfVUlEX1QKK0FDX01TR19DSEVDS0lORyhbZm9yIHNvY2tsZW5fdF0pCitBQ19FR1JFUF9IRUFERVIoc29ja2xlbl90LCBzeXMvc29ja2V0LmgsCisgICAgQUNfTVNHX1JFU1VMVChbeWVzXSksCisgICAgQUNfTVNHX1JFU1VMVChbbm8gKGRlZmluZWQgYXMgaW50KV0pCisgICAgQUNfREVGSU5FKFtzb2NrbGVuX3RdLCBbaW50XSwgW1R5cGUgb2Ygc29ja2xlbl90XSkpCitBQ19DSEVDS19UWVBFUyhbc3RydWN0IHNvY2thZGRyX3VuXSwgW10sIFtdLCBbI2luY2x1ZGUgPHN5cy91bi5oPl0pCitBQ19DSEVDS19UWVBFUyhbc3RydWN0IGFkZHJpbmZvXSwgW10sIFtdLCBbI2luY2x1ZGUgPG5ldGRiLmg+XSkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQVFkgZGV2aWNlIGZpbGVzXSkKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgICAgQUNfQ0hFQ0tfRklMRSgiL2Rldi9wdG14IiwgQUNfREVGSU5FKFtIQVZFX0RFVl9QVE1YXSwgWzFdLAorICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgJy9kZXYvcHRteCcgZGV2aWNlLl0pKQorICAgIEFDX0NIRUNLX0ZJTEUoIi9kZXYvcHRjIiwgQUNfREVGSU5FKFtIQVZFX0RFVl9QVFNfQU5EX1BUQ10sIFsxXSwKKyAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlICcvZGV2L3B0YycgZGV2aWNlLl0pKQorZWxzZQorICAgIEFDX01TR19XQVJOKFtjcm9zcy1jb21waWxhdGlvbjogYXNzdW1pbmcgL2Rldi9wdG14IGFuZCAvZGV2L3B0YyBhcmUgbm90IGF2YWlsYWJsZV0pCitmaQorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVudHJvcHkgc291cmNlc10pCisKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgICAgQUNfQVJHX1dJVEgoZWdkLXNvY2tldCwKKyAgICAgICAgWyAgLS13aXRoLWVnZC1zb2NrZXQ9RklMRSAgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCBwYXRoXSwKKyAgICAgICAgW0VHRF9TT0NLRVQ9IiR3aXRodmFsIl0KKyAgICApCisgICAgaWYgdGVzdCAtbiAiJEVHRF9TT0NLRVQiOyB0aGVuCisgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChbRUdEX1NPQ0tFVF0sIFsiJEVHRF9TT0NLRVQiXSwKKyAgICAgICAgICAgIFtFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24gc29ja2V0IHBhdGhdKQorICAgIGZpCisKKyAgICAjIENoZWNrIGZvciB1c2VyLXNwZWNpZmllZCByYW5kb20gZGV2aWNlCisgICAgQUNfQVJHX1dJVEgocmFuZG9tLAorICAgIFsgIC0td2l0aC1yYW5kb209RklMRSAgICAgIHJlYWQgcmFuZG9tbmVzcyBmcm9tIGZpbGUgKGRlZmF1bHQ9L2Rldi91cmFuZG9tKV0sCisgICAgICAgIFtSQU5ET01fRklMRT0iJHdpdGh2YWwiXSwKKyAgICAgICAgWworICAgICAgICAgICAgIyBDaGVjayBmb3IgcmFuZG9tIGRldmljZQorICAgICAgICAgICAgQUNfQ0hFQ0tfRklMRSgiL2Rldi91cmFuZG9tIiwgUkFORE9NX0ZJTEU9Ii9kZXYvdXJhbmRvbSIpCisgICAgICAgIF0KKyAgICApCisgICAgaWYgdGVzdCAtbiAiJFJBTkRPTV9GSUxFIjsgdGhlbgorICAgICAgICBBQ19TVUJTVChbUkFORE9NX0ZJTEVdKQorICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW1JBTkRPTV9GSUxFXSwgWyIkUkFORE9NX0ZJTEUiXSwgW1JhbmRvbSBmaWxlIHBhdGhdKQorICAgIGZpCitlbHNlCisgICAgQUNfTVNHX1dBUk4oW2Nyb3NzLWNvbXBpbGF0aW9uOiBhc3N1bWluZyBlbnRyb3B5IHNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGVdKQorZmkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZhdWx0IGdyb3VwXSkKK0RFRkFVTFRfR1JPVVA9bm9ib2R5CitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICAgIGdyZXAgJ15ub2dyb3VwOicgL2V0Yy9ncm91cCA+L2Rldi9udWxsICYmIERFRkFVTFRfR1JPVVA9bm9ncm91cAorZWxzZQorICAgIEFDX01TR19XQVJOKFtjcm9zcy1jb21waWxhdGlvbjogYXNzdW1pbmcgbm9ncm91cCBpcyBub3QgYXZhaWxhYmxlXSkKK2ZpCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBkZWZhdWx0IGdyb3VwXSkKK0FDX01TR19SRVNVTFQoWyRERUZBVUxUX0dST1VQXSkKK0FDX1NVQlNUKFtERUZBVUxUX0dST1VQXSkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBoZWFkZXIgZmlsZXNdKQorIyBBQ19IRUFERVJfRElSRU5UCisjIEFDX0hFQURFUl9TVERDCisjIEFDX0hFQURFUl9TWVNfV0FJVAorQUNfQ0hFQ0tfSEVBREVSUyhbc3RkaW50LmggaW50dHlwZXMuaCBtYWxsb2MuaCB1Y29udGV4dC5oIHB0aHJlYWQuaCBwb2xsLmggdGNwZC5oIHN0cm9wdHMuaCBncnAuaCB1bmlzdGQuaCB1dGlsLmggbGlidXRpbC5oIHB0eS5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy90eXBlcy5oIHN5cy9zZWxlY3QuaCBzeXMvcG9sbC5oIHN5cy9zb2NrZXQuaCBzeXMvdW4uaCBzeXMvaW9jdGwuaCBzeXMvZmlsaW8uaCBzeXMvcmVzb3VyY2UuaCBzeXMvdWlvLmggc3lzL3N5c2NhbGwuaF0pCitBQ19DSEVDS19IRUFERVJTKFtsaW51eC9zY2hlZC5oXSkKK0FDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBtc2doZHIubXNnX2NvbnRyb2xdLAorICAgIFtBQ19ERUZJTkUoW0hBVkVfTVNHSERSX01TR19DT05UUk9MXSwgWzFdLAorICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSAnbXNnaGRyLm1zZ19jb250cm9sJyBzdHJ1Y3R1cmUuXSldLCBbXSwgWworQUNfSU5DTFVERVNfREVGQVVMVAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyAgICBdKQorQUNfQ0hFQ0tfSEVBREVSUyhbbGludXgvbmV0ZmlsdGVyX2lwdjQuaF0sICwgLCAKKyAgICBbCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyAgICBdKQorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGxpYnJhcmllc10pCisjIENoZWNrcyBmb3Igc3RhbmRhcmQgbGlicmFyaWVzCitBQ19TRUFSQ0hfTElCUyhbZ2V0aG9zdGJ5bmFtZV0sIFtuc2xdKQorQUNfU0VBUkNIX0xJQlMoW3lwX2dldF9kZWZhdWx0X2RvbWFpbl0sIFtuc2xdKQorQUNfU0VBUkNIX0xJQlMoW3NvY2tldF0sIFtzb2NrZXRdKQorQUNfU0VBUkNIX0xJQlMoW29wZW5wdHldLCBbdXRpbF0pCisjIENoZWNrcyBmb3IgZHluYW1pYyBsb2FkZXIgYW5kIHpsaWIgbmVlZGVkIGJ5IE9wZW5TU0wKK0FDX1NFQVJDSF9MSUJTKFtkbG9wZW5dLCBbZGxdKQorQUNfU0VBUkNIX0xJQlMoW3NobF9sb2FkXSwgW2RsZF0pCitBQ19TRUFSQ0hfTElCUyhbaW5mbGF0ZUVuZF0sIFt6XSkKKworIyBBZGQgQmVPUyBsaWJyYXJpZXMKK2lmIHRlc3QgIngkaG9zdF9vcyIgPSAieGJlb3MiOyB0aGVuCisgICAgTElCUz0iJExJQlMgLWxiZSAtbHJvb3QgLWxiaW5kIgorZmkKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsaWJyYXJ5IGZ1bmN0aW9uc10pCisjIHNhZmUgc3RyaW5nIG9wZXJhdGlvbnMKK0FDX0NIRUNLX0ZVTkNTKHNucHJpbnRmIHZzbnByaW50ZikKKyMgcHNldWRvdGVybWluYWwKK0FDX0NIRUNLX0ZVTkNTKG9wZW5wdHkgX2dldHB0eSkKKyMgVW5peAorQUNfQ0hFQ0tfRlVOQ1MoZGFlbW9uIHdhaXRwaWQgd2FpdDQgc2V0c2lkIHNldGdyb3VwcyBjaHJvb3QpCisjIGxpbWl0cworQUNfQ0hFQ0tfRlVOQ1Moc3lzY29uZiBnZXRybGltaXQpCisjIHRocmVhZHMvcmVlbnRyYW50IGZ1bmN0aW9ucworQUNfQ0hFQ0tfRlVOQ1MocHRocmVhZF9zaWdtYXNrIGxvY2FsdGltZV9yKQorIyB0aHJlYWRzCitBQ19DSEVDS19GVU5DUyhnZXRjb250ZXh0IF9fbWFrZWNvbnRleHRfdjIpCisjIHNvY2tldHMKK0FDX0NIRUNLX0ZVTkNTKHBvbGwgZ2V0aG9zdGJ5bmFtZTIgZW5kaG9zdGVudCBnZXRuYW1laW5mbykKK0FDX01TR19DSEVDS0lORyhbZm9yIGdldGFkZHJpbmZvXSkKK2Nhc2UgIiRob3N0X29zIiBpbgorKmFuZHJvaWRlYWJpKikKKyAgICAjIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzgxODI0Ni9zZWdtZW50YXRpb24tZmF1bHQtaW4tZ2V0YWRkcmluZm8KKyAgICBBQ19NU0dfUkVTVUxUKFtubyAoYnVnZ3kgQW5kcm9pZCBpbXBsZW1lbnRhdGlvbildKQorICAgIDs7CisqKQorICAgICMgVHJ1NjQgVU5JWCBoYXMgZ2V0YWRkcmluZm8oKSBidXQgaGFzIGl0IHJlbmFtZWQgaW4gbGliYyBhcworICAgICMgc29tZXRoaW5nIGVsc2Ugc28gd2UgbXVzdCBpbmNsdWRlIDxuZXRkYi5oPiB0byBnZXQgdGhlCisgICAgIyByZWRlZmluaXRpb24uCisgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCisgICAgICAgICAgICBbCitBQ19JTkNMVURFU19ERUZBVUxUCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgWworZ2V0YWRkcmluZm8oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBdLCldLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSk7IEFDX0RFRklORShbSEFWRV9HRVRBRERSSU5GT10sIFsxXSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlICdnZXRhZGRyaW5mbycgZnVuY3Rpb24uXSldLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgOzsKK2VzYWMKKyMgcG9sbCgpIGlzIG5vdCByZWNvbW1lbmRlZCBvbiBNYWMgT1MgWCA8PSAxMC4zIGFuZCBicm9rZW4gb24gTWFjIE9TIFggMTAuNAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgYnJva2VuIHBvbGwoKSBpbXBsZW1lbnRhdGlvbl0pCitjYXNlICIkaG9zdF9vcyIgaW4KK2RhcndpblswLThdLiopCisgICAgQUNfTVNHX1JFU1VMVChbeWVzIChwb2xsKCkgZGlzYWJsZWQpXSkKKyAgICBBQ19ERUZJTkUoW0JST0tFTl9QT0xMXSwgWzFdLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSBicm9rZW4gJ3BvbGwnIGltcGxlbWVudGF0aW9uLl0pCisgICAgOzsKKyopCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIDs7Citlc2FjCisjIEdOVSBleHRlbnNpb25zCitBQ19DSEVDS19GVU5DUyhwaXBlMiBhY2NlcHQ0KQorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wdGlvbmFsIGZlYXR1cmVzXSkKKyMgVXNlIElQdjY/CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIElQdjYgc3VwcG9ydF0pCitBQ19BUkdfRU5BQkxFKGlwdjYsCitbICAtLWRpc2FibGUtaXB2NiAgICAgICAgICBkaXNhYmxlIElQdjYgc3VwcG9ydF0sCisgICAgWworICAgICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgorICAgICAgICAgICAgeWVzKSBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoW1VTRV9JUHY2XSwgWzFdLAorICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgdG8gZW5hYmxlIElQdjYgc3VwcG9ydF0pCisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBubykgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopICAgQUNfTVNHX1JFU1VMVChbZXJyb3JdKQorICAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSBcIiR7ZW5hYmxldmFsfVwiXSkKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgIF0sIFsKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzIChkZWZhdWx0KV0pCisgICAgICAgIEFDX0RFRklORShbVVNFX0lQdjZdLCBbMV0sIFtEZWZpbmUgdG8gMSB0byBlbmFibGUgSVB2NiBzdXBwb3J0XSkKKyAgICBdLCBbCisgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBdCispCisKKyMgRklQUyBNb2RlCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIEZJUFMgc3VwcG9ydF0pCitBQ19BUkdfRU5BQkxFKGZpcHMsCitbICAtLWRpc2FibGUtZmlwcyAgICAgICAgICBkaXNhYmxlIE9wZW5TU0wgRklQUyBzdXBwb3J0XSwKKyAgICBbCisgICAgICAgIGNhc2UgIiRlbmFibGV2YWwiIGluCisgICAgICAgICAgICB5ZXMpIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAgdXNlX2ZpcHM9InllcyIKKyAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFtVU0VfRklQU10sIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBPcGVuU1NMIEZJUFMgc3VwcG9ydF0pCisgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBubykgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAgdXNlX2ZpcHM9Im5vIgorICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgICBBQ19NU0dfUkVTVUxUKFtlcnJvcl0pCisgICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCJdKQorICAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgXSwKKyAgICBbCisgICAgICAgIHVzZV9maXBzPSJhdXRvIgorICAgICAgICBBQ19NU0dfUkVTVUxUKFthdXRvZGV0ZWN0aW5nXSkKKyAgICBdCispCisKKyMgRGlzYWJsZSBzeXN0ZW1kIHNvY2tldCBhY3RpdmF0aW9uIHN1cHBvcnQKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbiBzdXBwb3J0XSkKK0FDX0FSR19FTkFCTEUoc3lzdGVtZCwKK1sgIC0tZGlzYWJsZS1zeXN0ZW1kICAgICAgIGRpc2FibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbiBzdXBwb3J0XSwKKyAgICBbCisgICAgICAgIGNhc2UgIiRlbmFibGV2YWwiIGluCisgICAgICAgICAgICB5ZXMpIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgIEFDX1NFQVJDSF9MSUJTKFtzZF9saXN0ZW5fZmRzXSwgW3N5c3RlbWQgc3lzdGVtZC1kYWVtb25dKQorICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoW1VTRV9TWVNURU1EXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBzeXN0ZW1kIHNvY2tldCBhY3RpdmF0aW9uXSkKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG5vKSAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgICBBQ19NU0dfUkVTVUxUKFtlcnJvcl0pCisgICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbQmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCJdKQorICAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgXSwKKyAgICBbCisgICAgICAgIEFDX01TR19SRVNVTFQoW2F1dG9kZXRlY3RpbmddKQorICAgICAgICAjIHRoZSBsaWJyYXJ5IG5hbWUgaGFzIGNoYW5nZWQgdG8gLWxzeXN0ZW1kIGluIHN5c3RlbWQgMjA5CisgICAgICAgIEFDX1NFQVJDSF9MSUJTKFtzZF9saXN0ZW5fZmRzXSwgW3N5c3RlbWQgc3lzdGVtZC1kYWVtb25dLAorICAgICAgICAgICAgWyBBQ19DSEVDS19IRUFERVJTKFtzeXN0ZW1kL3NkLWRhZW1vbi5oXSwgWworICAgICAgICAgICAgICAgIEFDX0RFRklORShbVVNFX1NZU1RFTURdLCBbMV0sCisgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gMSB0byBlbmFibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbl0pCisgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShbc3lzdGVtZCBzdXBwb3J0IGVuYWJsZWRdKQorICAgICAgICAgICAgXSwgWworICAgICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW3N5c3RlbWQgaGVhZGVyIG5vdCBmb3VuZF0pCisgICAgICAgICAgICBdKSBdLCBbCisgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShbc3lzdGVtZCBsaWJyYXJ5IG5vdCBmb3VuZF0pCisgICAgICAgICAgICBdKQorICAgIF0KKykKKworIyBEaXNhYmxlIHVzZSBvZiBsaWJ3cmFwIChUQ1Agd3JhcHBlcnMpCisjIGl0IHNob3VsZCBiZSB0aGUgbGFzdCBjaGVjayEKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgVENQIHdyYXBwZXJzIHN1cHBvcnRdKQorQUNfQVJHX0VOQUJMRShsaWJ3cmFwLAorWyAgLS1kaXNhYmxlLWxpYndyYXAgICAgICAgZGlzYWJsZSBUQ1Agd3JhcHBlcnMgc3VwcG9ydF0sCisgICAgWworICAgICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgorICAgICAgICAgICAgeWVzKSBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoW1VTRV9MSUJXUkFQXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBUQ1Agd3JhcHBlcnMgc3VwcG9ydF0pCisgICAgICAgICAgICAgICAgIExJQlM9IiRMSUJTIC1sd3JhcCIKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG5vKSAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgICBBQ19NU0dfUkVTVUxUKFtlcnJvcl0pCisgICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbQmFkIHZhbHVlIFwiJHtlbmFibGV2YWx9XCJdKQorICAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgXSwKKyAgICBbCisgICAgICAgIEFDX01TR19SRVNVTFQoW2F1dG9kZXRlY3RpbmddKQorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBob3N0c19hY2Nlc3MgaW4gLWx3cmFwXSkKKyAgICAgICAgdmFsaWRfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiR2YWxpZF9MSUJTIC1sd3JhcCIKKyAgICAgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgQUNfTEFOR19QUk9HUkFNKAorICAgICAgICAgICAgICAgICAgICBbaW50IGhvc3RzX2FjY2VzcygpOyBpbnQgYWxsb3dfc2V2ZXJpdHksIGRlbnlfc2V2ZXJpdHk7XSwKKyAgICAgICAgICAgICAgICAgICAgW2hvc3RzX2FjY2VzcygpXSkKKyAgICAgICAgICAgIF0sIFsKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKTsKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoW1VTRV9MSUJXUkFQXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgdG8gZW5hYmxlIFRDUCB3cmFwcGVycyBzdXBwb3J0XSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtsaWJ3cmFwIHN1cHBvcnQgZW5hYmxlZF0pCisgICAgICAgICAgICBdLCBbCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICAgIExJQlM9IiR2YWxpZF9MSUJTIgorICAgICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW2xpYndyYXAgbGlicmFyeSBub3QgZm91bmRdKQorICAgICAgICAgICAgXQorICAgICAgICApCisgICAgXQorKQorCitBQ19NU0dfTk9USUNFKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNTTF0pCisKK0FDX01TR19DSEVDS0lORyhbZm9yIGNvbXBpbGVyIHN5c3Jvb3RdKQoraWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICAgc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKK2ZpCitpZiB0ZXN0IC16ICIkc3lzcm9vdCIgLW8gIngkc3lzcm9vdCIgPSAieC8iOyB0aGVuCisgICAgc3lzcm9vdD0iIgorICAgIEFDX01TR19SRVNVTFQoWy9dKQorZWxzZQorICAgIEFDX01TR19SRVNVTFQoWyRzeXNyb290XSkKK2ZpCisKK2NoZWNrX3NzbF9kaXIoKSB7IDoKKyAgICB0ZXN0IC1uICIkMSIgLWEgLWYgIiQxL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCIgJiYgU1NMRElSPSIkMSIKK30KKworZmluZF9zc2xfZGlyKCkgeyA6CisgICAgc3R1bm5lbF9wcmVmaXg9IiRwcmVmaXgiCisgICAgdGVzdCAieCRzdHVubmVsX3ByZWZpeCIgPSAieE5PTkUiICYmIHN0dW5uZWxfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgIGZvciBtYWluX2RpciBpbiAiJHN0dW5uZWxfcHJlZml4IiAiL3Vzci9sb2NhbCIgIi91c3IvbGliIiAiL3Vzci9wa2ciICIvb3B0L2xvY2FsIiAiL29wdCIgIi91c3IiICIiOyBkbworICAgICAgICBmb3Igc3ViX2RpciBpbiAiL3NzbCIgIi9vcGVuc3NsIiAiL29zc2wiICIiOyBkbworICAgICAgICAgICAgY2hlY2tfc3NsX2RpciAiJHN5c3Jvb3QkbWFpbl9kaXIkc3ViX2RpciIKKyAgICAgICAgICAgIHRlc3QgLW4gIiRTU0xESVIiICYmIHJldHVybgorICAgICAgICBkb25lCisgICAgZG9uZQorICAgIGlmIHRlc3QgLXggIi91c3IvYmluL3hjcnVuIjsgdGhlbgorICAgICAgICBzZGtfcGF0aD1gL3Vzci9iaW4veGNydW4gLS1zZGsgbWFjb3N4IC0tc2hvdy1zZGstcGF0aGAKKyAgICAgICAgY2hlY2tfc3NsX2RpciAiJHNka19wYXRoL3VzciIKKyAgICBmaQorfQorCitTU0xESVI9IiIKK0FDX01TR19DSEVDS0lORyhbZm9yIFNTTCBkaXJlY3RvcnldKQorQUNfQVJHX1dJVEgoc3NsLAorWyAgLS13aXRoLXNzbD1ESVIgICAgICAgICAgbG9jYXRpb24gb2YgaW5zdGFsbGVkIFNTTCBsaWJyYXJpZXMvaW5jbHVkZSBmaWxlc10sCisgICAgW2NoZWNrX3NzbF9kaXIgIiR3aXRodmFsIl0sCisgICAgW2ZpbmRfc3NsX2Rpcl0KKykKK2lmIHRlc3QgLXogIiRTU0xESVIiOyB0aGVuCitBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorQUNfTVNHX0VSUk9SKFsKK0NvdWxkIG5vdCBmaW5kIHlvdXIgU1NMIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGRpcgorVXNlIC0td2l0aC1zc2wgb3B0aW9uIHRvIGZpeCB0aGlzIHByb2JsZW0KK10pIAorZmkKK0FDX01TR19SRVNVTFQoWyRTU0xESVJdKQorQUNfU1VCU1QoW1NTTERJUl0pCitBQ19ERUZJTkVfVU5RVU9URUQoW1NTTERJUl0sIFsiJFNTTERJUiJdLCBbU1NMIGRpcmVjdG9yeV0pCisKK3ZhbGlkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiOyBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJFNTTERJUi9pbmNsdWRlIgordmFsaWRfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAtTCRTU0xESVIvbGliNjQgLUwkU1NMRElSL2xpYiAtbHNzbCAtbGNyeXB0byIKKworQUNfQ0hFQ0tfSEVBREVSKFskU1NMRElSL2luY2x1ZGUvb3BlbnNzbC9lbmdpbmUuaF0sCisgICAgW0FDX0RFRklORShbSEFWRV9PU1NMX0VOR0lORV9IXSwgWzFdLAorICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8ZW5naW5lLmg+IGhlYWRlciBmaWxlLl0pXSwKKyAgICBbQUNfTVNHX1dBUk4oW09wZW5TU0wgZW5naW5lIGhlYWRlciBub3QgZm91bmRdKV0pCisKK0FDX0NIRUNLX0hFQURFUihbJFNTTERJUi9pbmNsdWRlL29wZW5zc2wvb2NzcC5oXSwKKyAgICBbQUNfREVGSU5FKFtIQVZFX09TU0xfT0NTUF9IXSwgWzFdLAorICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8b2NzcC5oPiBoZWFkZXIgZmlsZS5dKV0sCisgICAgW0FDX01TR19XQVJOKFtPcGVuU1NMIG9jc3AgaGVhZGVyIG5vdCBmb3VuZF0pXSkKKworaWYgdGVzdCAieCR1c2VfZmlwcyIgPSAieGF1dG8iOyB0aGVuCisgICAgQUNfQ0hFQ0tfRlVOQ1MoRklQU19tb2RlX3NldCwgWworICAgICAgICBBQ19ERUZJTkUoW1VTRV9GSVBTXSwgWzFdLCBbRGVmaW5lIHRvIDEgdG8gZW5hYmxlIE9wZW5TU0wgRklQUyBzdXBwb3J0XSkKKyAgICAgICAgQUNfTVNHX05PVElDRShbRklQUyBzdXBwb3J0IGVuYWJsZWRdKQorICAgIF0sIFsKKyAgICAgICAgQUNfTVNHX05PVElDRShbRklQUyBzdXBwb3J0IG5vdCBmb3VuZF0pCisgICAgXSkKK2ZpCisKK0NQUEZMQUdTPSIkdmFsaWRfQ1BQRkxBR1MiCitMSUJTPSIkdmFsaWRfTElCUyIKKworQUNfTVNHX05PVElDRShbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3cml0ZSB0aGUgcmVzdWx0c10pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIHNyYy9NYWtlZmlsZSBkb2MvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGVdKQorQUNfT1VUUFVUCisKK0FDX01TR19OT1RJQ0UoWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc3VjY2Vzc10pCisjIEVuZCBvZiBjb25maWd1cmUuYWMKKyMgdmltOmZ0PWF1dG9tYWtlCmRpZmYgLS1naXQgYS9kb2MvTWFrZWZpbGUuYW0gYi9kb2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MGZiYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM0IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworRVhUUkFfRElTVCA9IHN0dW5uZWwucG9kLmluIHN0dW5uZWwuOC5pbiBzdHVubmVsLmh0bWwuaW4gZW4KK0VYVFJBX0RJU1QgKz0gc3R1bm5lbC5wbC5wb2QuaW4gc3R1bm5lbC5wbC44LmluIHN0dW5uZWwucGwuaHRtbC5pbiBwbAorCittYW5fTUFOUyA9IHN0dW5uZWwuOCBzdHVubmVsLnBsLjgKKworZG9jZGlyID0gJChkYXRhZGlyKS9kb2Mvc3R1bm5lbAorZG9jX0RBVEEgPSBzdHVubmVsLmh0bWwgc3R1bm5lbC5wbC5odG1sCisKK0NMRUFORklMRVMgPSAkKG1hbl9NQU5TKSAkKGRvY19EQVRBKQorCitTVUZGSVhFUyA9IC5wb2QuaW4gLjguaW4gLmh0bWwuaW4KKworLnBvZC5pbi44LmluOgorCXBvZDJtYW4gLXUgLW4gc3R1bm5lbCAtcyA4IC1yICQoVkVSU0lPTikgXAorCQktYyAic3R1bm5lbCBUTFMgUHJveHkiIC1kIGBkYXRlICslWS4lbS4lZGAgJDwgJEAKKworLnBvZC5pbi5odG1sLmluOgorCXBvZDJodG1sIC0taW5kZXggLS1iYWNrbGluayAtLWhlYWRlciBcCisJCS0tdGl0bGUgInN0dW5uZWwgVExTIFByb3h5IiAtLWluZmlsZT0kPCAtLW91dGZpbGU9JEAKKwlybSAtZiBwb2QyaHRtZC50bXAgcG9kMmh0bWkudG1wCisKK2VkaXQgPSBzZWQgXAorCS1lICdzfEBiaW5kaXJbQF18JChiaW5kaXIpfGcnIFwKKwktZSAnc3xAc3lzY29uZmRpcltAXXwkKHN5c2NvbmZkaXIpfGcnCisKKyQobWFuX01BTlMpICQoZG9jX0RBVEEpOiBNYWtlZmlsZQorCSQoZWRpdCkgJyQoc3JjZGlyKS8kQC5pbicgPiRACisKK3N0dW5uZWwuODogJChzcmNkaXIpL3N0dW5uZWwuOC5pbgorc3R1bm5lbC5odG1sOiAkKHNyY2Rpcikvc3R1bm5lbC5odG1sLmluCitzdHVubmVsLnBsLjg6ICQoc3JjZGlyKS9zdHVubmVsLnBsLjguaW4KK3N0dW5uZWwucGwuaHRtbDogJChzcmNkaXIpL3N0dW5uZWwucGwuaHRtbC5pbgpkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlLmluIGIvZG9jL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTk0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1NjcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTQuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK2FtX19pc19nbnVfbWFrZSA9IHRlc3QgLW4gJyQoTUFLRUZJTEVfTElTVCknICYmIHRlc3QgLW4gJyQoTUFLRUxFVkVMKScKK2FtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24gPSBcCisgIGNhc2UgJCR7dGFyZ2V0X29wdGlvbi19IGluIFwKKyAgICAgID8pIDs7IFwKKyAgICAgICopIGVjaG8gImFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb246IGludGVybmFsIGVycm9yOiBpbnZhbGlkIiBcCisgICAgICAgICAgICAgICJ0YXJnZXQgb3B0aW9uICckJHt0YXJnZXRfb3B0aW9uLX0nIHNwZWNpZmllZCIgPiYyOyBcCisgICAgICAgICBleGl0IDE7OyBcCisgIGVzYWM7IFwKKyAgaGFzX29wdD1ubzsgXAorICBzYW5lX21ha2VmbGFncz0kJE1BS0VGTEFHUzsgXAorICBpZiAkKGFtX19pc19nbnVfbWFrZSk7IHRoZW4gXAorICAgIHNhbmVfbWFrZWZsYWdzPSQkTUZMQUdTOyBcCisgIGVsc2UgXAorICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAorICAgICAgKlxcW1wgXAldKikgXAorICAgICAgICBicz1cXDsgXAorICAgICAgICBzYW5lX21ha2VmbGFncz1gcHJpbnRmICclc1xuJyAiJCRNQUtFRkxBR1MiIFwKKyAgICAgICAgICB8IHNlZCAicy8kJGJzJCRic1skJGJzICQkYnMJXSovL2ciYDs7IFwKKyAgICBlc2FjOyBcCisgIGZpOyBcCisgIHNraXBfbmV4dD1ubzsgXAorICBzdHJpcF90cmFpbG9wdCAoKSBcCisgIHsgXAorICAgIGZsZz1gcHJpbnRmICclc1xuJyAiJCRmbGciIHwgc2VkICJzLyQkMS4qJCQvLyJgOyBcCisgIH07IFwKKyAgZm9yIGZsZyBpbiAkJHNhbmVfbWFrZWZsYWdzOyBkbyBcCisgICAgdGVzdCAkJHNraXBfbmV4dCA9IHllcyAmJiB7IHNraXBfbmV4dD1ubzsgY29udGludWU7IH07IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICo9KnwtLSopIGNvbnRpbnVlOzsgXAorICAgICAgICAtKkkpIHN0cmlwX3RyYWlsb3B0ICdJJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qST8qKSBzdHJpcF90cmFpbG9wdCAnSSc7OyBcCisgICAgICAgIC0qTykgc3RyaXBfdHJhaWxvcHQgJ08nOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpPPyopIHN0cmlwX3RyYWlsb3B0ICdPJzs7IFwKKyAgICAgICAgLSpsKSBzdHJpcF90cmFpbG9wdCAnbCc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKmw/Kikgc3RyaXBfdHJhaWxvcHQgJ2wnOzsgXAorICAgICAgLVtkRURtXSkgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC1bSlRdKSBza2lwX25leHQ9eWVzOzsgXAorICAgIGVzYWM7IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICokJHRhcmdldF9vcHRpb24qKSBoYXNfb3B0PXllczsgYnJlYWs7OyBcCisgICAgZXNhYzsgXAorICBkb25lOyBcCisgIHRlc3QgJCRoYXNfb3B0ID0geWVzCithbV9fbWFrZV9kcnlydW4gPSAodGFyZ2V0X29wdGlvbj1uOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorYW1fX21ha2Vfa2VlcGdvaW5nID0gKHRhcmdldF9vcHRpb249azsgJChhbV9fbWFrZV9ydW5uaW5nX3dpdGhfb3B0aW9uKSkKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IGRvYworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmFtCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfY29tcGlsZV9mbGFncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfbGlua19mbGFncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jaGVja19jb21waWxlX2ZsYWcubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2hlY2tfbGlua19mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X3B0aHJlYWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcmVxdWlyZV9kZWZpbmVkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCAkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zcmMvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorQU1fVl9QID0gJChhbV9fdl9QX0BBTV9WQCkKK2FtX192X1BfID0gJChhbV9fdl9QX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfUF8wID0gZmFsc2UKK2FtX192X1BfMSA9IDoKK0FNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAgICIgJEA7CithbV9fdl9HRU5fMSA9IAorQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQorYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKK2FtX192X2F0XzAgPSBACithbV9fdl9hdF8xID0gCitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYworYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChtYW44ZGlyKSIgIiQoREVTVERJUikkKGRvY2RpcikiCitOUk9GRiA9IG5yb2ZmCitNQU5TID0gJChtYW5fTUFOUykKK0RBVEEgPSAkKGRvY19EQVRBKQorYW1fX3RhZ2dlZF9maWxlcyA9ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKFRBR1NfRklMRVMpICQoTElTUCkKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGQVVMVF9HUk9VUCA9IEBERUZBVUxUX0dST1VQQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkFORE9NX0ZJTEUgPSBAUkFORE9NX0ZJTEVACitSQU5MSUIgPSBAUkFOTElCQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTU0xESVIgPSBAU1NMRElSQAorU1RSSVAgPSBAU1RSSVBACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9wdGhyZWFkX2NvbmZpZyA9IEBheF9wdGhyZWFkX2NvbmZpZ0AKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSAkKGRhdGFkaXIpL2RvYy9zdHVubmVsCitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorRVhUUkFfRElTVCA9IHN0dW5uZWwucG9kLmluIHN0dW5uZWwuOC5pbiBzdHVubmVsLmh0bWwuaW4gZW4gXAorCXN0dW5uZWwucGwucG9kLmluIHN0dW5uZWwucGwuOC5pbiBzdHVubmVsLnBsLmh0bWwuaW4gcGwKK21hbl9NQU5TID0gc3R1bm5lbC44IHN0dW5uZWwucGwuOAorZG9jX0RBVEEgPSBzdHVubmVsLmh0bWwgc3R1bm5lbC5wbC5odG1sCitDTEVBTkZJTEVTID0gJChtYW5fTUFOUykgJChkb2NfREFUQSkKK1NVRkZJWEVTID0gLnBvZC5pbiAuOC5pbiAuaHRtbC5pbgorZWRpdCA9IHNlZCBcCisJLWUgJ3N8QGJpbmRpcltAXXwkKGJpbmRpcil8ZycgXAorCS1lICdzfEBzeXNjb25mZGlyW0BdfCQoc3lzY29uZmRpcil8ZycKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucG9kLmluIC44LmluIC5odG1sLmluCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGRvYy9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBkb2MvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1tYW44OiAkKG1hbl9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCUBsaXN0MT0nJzsgXAorCWxpc3QyPSckKG1hbl9NQU5TKSc7IFwKKwl0ZXN0IC1uICIkKG1hbjhkaXIpIiBcCisJICAmJiB0ZXN0IC1uICJgZWNobyAkJGxpc3QxJCRsaXN0MmAiIFwKKwkgIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChtYW44ZGlyKSciOyBcCisJJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuOGRpcikiIHx8IGV4aXQgMTsgXAorCXsgZm9yIGkgaW4gJCRsaXN0MTsgZG8gZWNobyAiJCRpIjsgZG9uZTsgIFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QyIjsgdGhlbiBcCisJICBmb3IgaSBpbiAkJGxpc3QyOyBkbyBlY2hvICIkJGkiOyBkb25lIFwKKwkgICAgfCBzZWQgLW4gJy9cLjhbYS16XSokJC9wJzsgXAorCWZpOyBcCisJfSB8IHdoaWxlIHJlYWQgcDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ247cywuKi8sLDtwO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCcgfCBcCisJc2VkICdOO047cyxcbiwgLGcnIHwgeyBcCisJbGlzdD07IHdoaWxlIHJlYWQgZmlsZSBiYXNlIGluc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkYmFzZSIgPSAiJCRpbnN0IjsgdGhlbiBsaXN0PSIkJGxpc3QgJCRmaWxlIjsgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0IiB8fCBleGl0ICQkPzsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtYW44ZGlyKSciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtYW44ZGlyKSIgfHwgZXhpdCAkJD87IH07IFwKKwlkb25lOyB9CisKK3VuaW5zdGFsbC1tYW44OgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9Jyc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWB7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCBcCisJICBzZWQgLW4gJy9cLjhbYS16XSokJC9wJzsgXAorCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKKwlkaXI9JyQoREVTVERJUikkKG1hbjhkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQoraW5zdGFsbC1kb2NEQVRBOiAkKGRvY19EQVRBKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCUBsaXN0PSckKGRvY19EQVRBKSc7IHRlc3QgLW4gIiQoZG9jZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChkb2NkaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGRvY2RpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoZG9jZGlyKSciOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQoZG9jZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lCisKK3VuaW5zdGFsbC1kb2NEQVRBOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoZG9jX0RBVEEpJzsgdGVzdCAtbiAiJChkb2NkaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJZGlyPSckKERFU1RESVIpJChkb2NkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQordGFncyBUQUdTOgorCitjdGFncyBDVEFHUzoKKworY3Njb3BlIGNzY29wZWxpc3Q6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChNQU5TKSAkKERBVEEpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChtYW44ZGlyKSIgIiQoREVTVERJUikkKGRvY2RpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWRvY0RBVEEgaW5zdGFsbC1tYW4KKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW44CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWRvY0RBVEEgdW5pbnN0YWxsLW1hbgorCit1bmluc3RhbGwtbWFuOiB1bmluc3RhbGwtbWFuOAorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWNzY29wZWxpc3QtYW0gY3RhZ3MtYW0gZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCisJaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZG9jREFUQSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtbWFuOCBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzLWFtIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1kb2NEQVRBIHVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbjgKKworCisucG9kLmluLjguaW46CisJcG9kMm1hbiAtdSAtbiBzdHVubmVsIC1zIDggLXIgJChWRVJTSU9OKSBcCisJCS1jICJzdHVubmVsIFRMUyBQcm94eSIgLWQgYGRhdGUgKyVZLiVtLiVkYCAkPCAkQAorCisucG9kLmluLmh0bWwuaW46CisJcG9kMmh0bWwgLS1pbmRleCAtLWJhY2tsaW5rIC0taGVhZGVyIFwKKwkJLS10aXRsZSAic3R1bm5lbCBUTFMgUHJveHkiIC0taW5maWxlPSQ8IC0tb3V0ZmlsZT0kQAorCXJtIC1mIHBvZDJodG1kLnRtcCBwb2QyaHRtaS50bXAKKworJChtYW5fTUFOUykgJChkb2NfREFUQSk6IE1ha2VmaWxlCisJJChlZGl0KSAnJChzcmNkaXIpLyRALmluJyA+JEAKKworc3R1bm5lbC44OiAkKHNyY2Rpcikvc3R1bm5lbC44LmluCitzdHVubmVsLmh0bWw6ICQoc3JjZGlyKS9zdHVubmVsLmh0bWwuaW4KK3N0dW5uZWwucGwuODogJChzcmNkaXIpL3N0dW5uZWwucGwuOC5pbgorc3R1bm5lbC5wbC5odG1sOiAkKHNyY2Rpcikvc3R1bm5lbC5wbC5odG1sLmluCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RvYy9lbi9WTkNfU3R1bm5lbEhPV1RPLmh0bWwgYi9kb2MvZW4vVk5DX1N0dW5uZWxIT1dUTy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTY1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZW4vVk5DX1N0dW5uZWxIT1dUTy5odG1sCkBAIC0wLDAgKzEsMTkwIEBACis8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDIyKWh0dHA6Ly9pbnRlcm5ldC5lLW1haWwgLS0+DQorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPg0KKzxIVE1MPg0KKzxIRUFEPg0KKwk8TUVUQSBIVFRQLUVRVUlWPSJDT05URU5ULVRZUEUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCisJPFRJVExFPjwvVElUTEU+DQorCTxNRVRBIE5BTUU9IkdFTkVSQVRPUiIgQ09OVEVOVD0iU3Rhck9mZmljZS81LjIgKFdpbjMyKSI+DQorCTxNRVRBIE5BTUU9IkNSRUFURUQiIENPTlRFTlQ9IjIwMDEwMjIwOzc1MDE3ODQiPg0KKwk8TUVUQSBOQU1FPSJDSEFOR0VEIiBDT05URU5UPSIxNjAxMDEwMTswIj4NCisJPFNUWUxFPg0KKwk8IS0tDQorCQlAcGFnZSB7IG1hcmdpbjogMmNtIH0NCisJLS0+DQorCTwvU1RZTEU+DQorPC9IRUFEPg0KKzxCT0RZPg0KKzxQIEFMSUdOPUNFTlRFUiBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48Rk9OVCBTSVpFPTQgU1RZTEU9ImZvbnQtc2l6ZTogMTZwdCI+PFU+PEI+Vk5DDQorb3ZlciBTVFVOTkVMIHdpdGggYSBMaW51eCBzZXJ2ZXIgYW5kIFdpbmRvd3MgMjAwMCBjbGllbnQgSE9XVE88L0I+PC9VPjwvRk9OVD48L1A+DQorPFAgQUxJR049Q0VOVEVSIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxCUj4NCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+MTkgRmVicnVhcnkgMjAwMTwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj52ZXIgMS4wPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPmJ5IENyYWlnIEZ1cnRlciBhbmQgQXJubyB2YW4gZGVyIFdhbHQ8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+Y29udGFjdCB1cyBhdCA8QSBIUkVGPSJtYWlsdG86Y2Z1cnRlckB2ZXhlbi5jby56YSI+Y2Z1cnRlckB2ZXhlbi5jby56YTwvQT4NCithbmQgPEEgSFJFRj0ibWFpbHRvOmFybm92ZHdAbXljb21heC5jb20iPmFybm92ZHdAbXljb21heC5jb208L0E+PC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxCUj4NCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5XZSBhc3N1bWUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5DQorZG93bmxvYWRlZCBWTkNTZXJ2ZXIgYW5kIFZOQ1ZpZXdlci48L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5GaXJzdCBvZiBhbGwgdGhlcmUgaXMgYSBzdGVwIGJ5IHN0ZXANCitIT1dUTyBhbmQgdGhlbiB3ZSdsbCBsb29rIGF0IHRoZSB0aGVvcnkgYmVoaW5kIGFsbCB0aGlzLjwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxPTD4NCisJPExJPjxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPkRvd25sb2FkIGFuZCBpbnN0YWxsIE9wZW5TU0wsDQorCVNTTGVheSwgYW5kIFN0dW5uZWwgb24gdGhlIExpbnV4L1VuaXggYm94LiBEb3dubG9hZCB0aGUgbW9kdWxlcy48L1A+DQorPC9PTD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPmEpDQorW3Jvb3RAYW50aHJheCRdZ3VuemlwIG9wZW5zc2wteC54eC50YXIuZ3ogKHJlcGVhdCBmb3IgYWxsIDMgdGhlDQorbW9kdWxlcyk8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj5iKQ0KK1tyb290QGFudGhyYXgkXXRhciAmIzE1MDsgeHZmIG9wZW5zc2wteC54eC50YXIgKHJlcGVhdCBmb3IgYWxsIDMgdGhlDQorbW9kdWxlcyk8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxPTD4NCisJPExJPjxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPkNvcHkgdGhlIGZvbGxvd2luZyB0byBOb3RlcGFkIGFuZA0KKwlzYXZlIHRoZSBmaWxlIGFzIFZOQ1JlZ0VkaXQuUkVHIG9uIHRoZSBXaW5kb3dzIDIwMDAgYm94PC9QPg0KKzwvT0w+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj4tLWN1dCBoZXJlIGFuZCBjb3B5DQordG8gVk5DUmVnRWRpdC5SRUcgdGhlbiBkb3VibGUgY2xpY2sgdGhlIGZpbGUgdG8NCitpbXBvcnQtLTxCUj5SRUdFRElUNDxCUj48QlI+W0hLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxPUkxcV2luVk5DM108QlI+QWxsb3dMb29wYmFjaz1kd29yZDowMDAwMDAwMTxCUj48QlI+W0hLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxPUkxcV2luVk5DM1xEZWZhdWx0XTxCUj5BbGxvd0xvb3BiYWNrPWR3b3JkOjAwMDAwMDAxPEJSPi0tc3RvcA0KK2hlcmUtLTxCUj48QlI+DQorPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tbGVmdDogMC41Y207IG1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8T0w+DQorCTxMST48UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5JbnN0YWxsIFN0dW5uZWwgb24gdGhlIFdpbmRvd3MNCisJMjAwMCBtYWNoaW5lIGJ5IGNvcHlpbmcgdGhlIGZvbGxvd2luZyBmaWxlcyB0byB5b3VyIFxXSU5OVFxTWVNURU0zMlwNCisJZGlyZWN0b3J5PC9QPg0KKzwvT0w+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj5hKWxpYmVheTMyLmRsbDwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPmIpbGlic3NsLmRsbDwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPmMpc3R1bm5lbC5wZW08L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxPTD4NCisJPExJPjxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPk9uIHRoZSBMaW51eCBib3ggZXhlY3V0ZSB0aGUNCisJZm9sbG93aW5nIGNvbW1hbmQgYXMgcm9vdCBhbmQgbGV0IGl0IHJ1biBpbiBpdHMgb3duIHRlcm1pbmFsLjwvUD4NCis8L09MPg0KKzxQIFNUWUxFPSJtYXJnaW4tbGVmdDogMC41Y207IG1hcmdpbi1ib3R0b206IDBjbSI+Li9zdHVubmVsIC1kIDU5MDANCistciA1OTAxPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tbGVmdDogMC41Y207IG1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8T0w+DQorCTxMST48UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5FeGVjdXRlIHZuY3NlcnZlciAoaXQgc2hvdWxkIHJ1bg0KKwlhcyBkaXNwbGF5OjEgd2hlbiB5b3UgZXhlY3V0ZSB0aGUgcHMgYXV4IHxncmVwIHZuYyBjb21tYW5kKTwvUD4NCis8L09MPg0KKzxQIFNUWUxFPSJtYXJnaW4tbGVmdDogMC41Y207IG1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8T0w+DQorCTxMST48UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5Ob3cgb24gdGhlIFdpbmRvd3MgMjAwMCBtYWNoaW5lDQorCWV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kIGFuZCBsZXQgaXQgcnVuIGluIGl0cyBvd24gdGVybWluYWwuPC9QPg0KKzwvT0w+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj5zdHVubmVsIC1kIDU5MDAgLXINCit1bml4LmlwLmFkZHJlc3M6NTkwMCAtYzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPi48L1A+DQorPE9MPg0KKwk8TEk+PFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+QW5kIG9uIHRoZSBXaW5kb3dzIDIwMDAgbWFjaGluZQ0KKwlvcGVuIFZOQ3ZpZXdlciBhbmQgY29ubmVjdCB0byBsb2NhbGhvc3Qgc3BlY2lmeWluZyBubyBkaXNwbGF5PC9QPg0KKzwvT0w+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj5pZS4gMTAuMTAuMS41MyBpbg0KK3RoZSB3aW5kb3c8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxPTD4NCisJPExJPjxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPkZvciBlYWNoIGFkZGl0aW9uYWwgZGlzcGxheSByZXBlYXQNCisJc3RlcHMgNCAmIzE1MDsgNiBhbmQgaW5jcmVtZW50IHRoZSBzcGVjaWZpZWQgcG9ydHMgd2l0aCAyICBpZS4gVGhlDQorCUxpbnV4IGNvbW1hbmQgd2lsbCBsb29rIGFzIGZvbGxvd3M6PC9QPg0KKzwvT0w+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj4gLi9zdHVubmVsIC1kIDU5MDINCistciA1OTAzIA0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPmFuZCB0aGUgV2luZG93cw0KKzIwMDAgY29tbWFuZCBhcyBmb2xsb3dzOiANCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1sZWZ0OiAwLjVjbTsgbWFyZ2luLWJvdHRvbTogMGNtIj5zdHVubmVsIC1kIDU5MDIgLXINCit1bml4LmlwLmFkZHJlc3M6NTkwMjwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPmFuZCByZW1lbWJlciB0bw0KK3N0YXJ0IGFub3RoZXIgdm5jc2VydmVyIG9uIHRoZSBMaW51eCBib3ggZm9yIGVhY2ggVk5DIGRpc3BsYXk8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxPTD4NCisJPExJPjxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPlRoZSBkaXNwbGF5IG51bWJlciBvbiB0aGUNCisJdm5jdmlld2VyIG11c3QgYWxzbyBiZSBpbmNyZW1lbnRlZCB3aXRoIHR3byBpZTo8L1A+DQorPC9PTD4NCis8UCBTVFlMRT0ibWFyZ2luLWxlZnQ6IDAuNWNtOyBtYXJnaW4tYm90dG9tOiAwY20iPjEwLjEwLjEuNTM6MiBldGMuPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxCUj4NCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEZPTlQgU0laRT00PjxVPlRoZSBUSEVPUlk8L1U+PC9GT05UPjwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxVPlR1bm5lbGluZzo8L1U+PC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxCUj4NCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+V2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgc29mdHdhcmUNCisoZGFlbW9uKSAgcnVucyBvbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWFjaGluZS4gSW4gdGhpcyBjYXNlLCB0aGUNCitXaW5kb3dzIDIwMDAgbWFjaGluZSBpcyB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIGlzIHRoZSAqTklYDQorbWFjaGluZS4gU3R1bm5lbCB3aWxsIHRoZW4gcnVuIGFzIGNsaWVudCBvbiBXaW5kb3dzIDIwMDAgYW5kIHNlcnZlcg0KK21vZGUgb24gdGhlIFVOSVggYm94LjxCUj48QlI+ZWc6PEJSPldpbmRvd3M6PEJSPnN0dW5uZWwgLWQgNTkwMCAtcg0KK3VuaXguaXAuYWRkcmVzczo1OTAwIC1jPEJSPjxCUj5VTklYPEJSPnN0dW5uZWwgLWQgNTkwMCAtciA1OTAxPEJSPjxCUj5UaGlzDQorbWVhbnMgdGhhdCBjb25uZWN0aW5nIHRvIFZOQyBkaXNwbGF5IDAgaW4gdGhlIGxvY2FsaG9zdCB3aWxsIHRyYW5zZmVyDQorYWxsIHRoZSBjYWxscyB0byB0aGUgKk5JWCBtYWNoaW5lIG9uIGRpc3BsYXkgMS4gU28gdGhlIFZOQyBzZXJ2ZXIgb24NCit0aGUgKk5JWCBtYWNoaW5lIG11c3QgYmUgcnVubmluZyBvbiBkaXNwbGF5IDEuIE5vdCBkaXNwbGF5IDAuIElmIHlvdQ0KK3J1biBzdHVubmVsIGJlZm9yZSBWTkMsIFZOQyB3aWxsIGF1dG9tYXRpY2FsbHkgbW92ZSB0byBkaXNwbGF5IDENCitub3RpY2luZyB0aGF0IHBvcnQgNTkwMCAoJnF1b3Q7ZGlzcGxheSZxdW90OyAwKSBpcyBhbHJlYWR5IGluDQordXNlKS48QlI+PEJSPldoYXQgaGFwcGVucyBub3cgaXMgdGhhdCB3aGVuIHlvdSBjb25uZWN0IHRvIHBvcnQgNTkwMA0KK29uIHRoZSBXaW5kb3dzIG1hY2hpbmUgdmlhIGFuICZxdW90O3Vuc2VjdXJlZCZxdW90OyBjb25uZWN0aW9uLCBhDQorc2VjdXJlICZxdW90O3R1bm5lbCZxdW90OyBpcyBvcGVuZWQgZnJvbSBXaW5kb3dzIDIwMDAgdG8gdGhlICpOSVgNCittYWNoaW5lIG9uIHBvcnQgNTkwMC4gVGhlICpOSVggbWFjaGluZSB0aGVuIG9wZW5zIGEgJnF1b3Q7dW5zZWN1cmVkJnF1b3Q7DQorY29ubmVjdGlvbiB0byBpdHNlbGYgb24gcG9ydCA1OTAxLiBXZSBub3cgaGF2ZSBhIHNlY3VyZSB0dW5uZWwNCithdmFpbGFibGUuPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPjxCUj4NCis8L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PFU+QSBiaXQgYWJvdXQgVk5DIGFuZCBkaXNwbGF5czwvVT48L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5UaGUgLWQgaXMgdGhlIGxpc3RlbmluZyBJUGFkZHJlc3M6cG9ydA0KK2FuZCB0aGUgLXIgaXMgdGhlIHJlbW90ZSBJUGFkZHJlc3M6cG9ydC4gVk5DIHVzZXMgcG9ydCA1OTAwIGZvcg0KK2Rpc3BsYXkgMC4gVGhhdCBtZWFucyB0aGF0IGRpc3BsYXkgMSB3aWxsIGJlIDU5MDEuIElmIHlvdSB3YW50IFZOQw0KK3NlcnZlciB0byBsaXN0ZW4gZm9yIGEgY29ubmVjdGlvbiBvbiBwb3J0IDgwIHRoZW4gdGhlIGRpc3BsYXkgbnVtYmVyDQord2lsbCBiZSA4MCAtIDU5MDAgPSAtNTgyMC4gSWYgeW91IHdhbnQgVk5DIHNlcnZlciB0bzxCUj5saXN0ZW4gb24NCitwb3J0IDE0MDAwIHRoZW4gdGhlIGRpc3BsYXkgbnVtYmVyIGlzIDE0MDAwIC0gNTkwMCA9IDgxMDAuPEJSPjxCUj5Tbw0KK2FsbCB5b3UgaGF2ZSB0byBkbyBpcyBydW4gc3R1bm5lbCBvbiB0aGUgVU5JWCBtYWNoaW5lIGFuZCBWTkMgb24gdGhlDQorZGVzaXJlZCAmcXVvdDtkaXNwbGF5JnF1b3Q7IG51bWJlci48L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48VT5WTkMgb24gdGhlIFdpbmRvd3MgMjAwMCBtYWNoaW5lPC9VPjwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48QlI+DQorPC9QPg0KKzxQIFNUWUxFPSJtYXJnaW4tYm90dG9tOiAwY20iPlRvIGNvbm5lY3QgZnJvbSB0aGUgY2xpZW50IG1hY2hpbmUgeW91DQorbmVlZCB0byBlbnRlciB0aGUgY2xpZW50IG1hY2hpbmUncyBJUCBhZGRyZXNzIGFuZCB0aGUgJnF1b3Q7ZGlzcGxheSZxdW90Ow0KKyhmcm9tIHRoZSBwb3J0IGNvbnZlcnNpb24pLiBCdXQgVk5DIHdpbGwgdGhpbmsgdGhhdCB5b3UgYXJlIHRyeWluZyB0bw0KK2Nvbm5lY3QgdG8gdGhlIGxvY2FsIG1hY2hpbmUgYW5kIGRvZXMgbm90IGFsbG93IHRoaXMuIFRvIG92ZXJyaWRlDQordGhpcyBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIHJlZ2lzdHJ5LjxCUj48QlI+LS1jdXQgaGVyZSBhbmQgY29weSB0bw0KK2FueXRoaW5nLnJlZy4gdGhlbiBkb3VibGUgY2xpY2sgdGhlIGZpbGUgdG8NCitpbXBvcnQtLTxCUj5SRUdFRElUNDxCUj48QlI+W0hLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxPUkxcV2luVk5DM108QlI+QWxsb3dMb29wYmFjaz1kd29yZDowMDAwMDAwMTxCUj48QlI+W0hLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxPUkxcV2luVk5DM1xEZWZhdWx0XTxCUj5BbGxvd0xvb3BiYWNrPWR3b3JkOjAwMDAwMDAxPEJSPi0tc3RvcA0KK2hlcmUtLTxCUj48QlI+Tm93IFZOQyB3aWxsIG5vdCBjb21wbGFpbi4gU28geW91IG5lZWQgdG8gYWx3YXlzIHJ1bg0KK3N0dW5uZWwgaW4gY2xpZW50IG1vZGUgb24gdGhlIFdpbmRvd3MgbWFjaGluZSBhbmQgdGhlbiBjb25uZWN0IHdpdGgNCitWTkNWaWV3ZXIgdG8gdGhlIGxvY2FsaG9zdCBvbiB0aGUgY29ycmVjdCAmcXVvdDtkaXNwbGF5JnF1b3Q7LiBCeSB0aGUNCit3YXksICpOSVggZG9lc24ndCBjb21wbGFpbiBhYm91dCB0aGlzLiBUaGVyZSBpcyBubyBzZXR0aW5nIG5lZWRlZCBpZg0KKypOSVggdG8gKk5JWC48L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj48VT5WTkMncyBKYXZhIGNsaWVudDwvVT48L1A+DQorPFAgU1RZTEU9Im1hcmdpbi1ib3R0b206IDBjbSI+PEJSPg0KKzwvUD4NCis8UCBTVFlMRT0ibWFyZ2luLWJvdHRvbTogMGNtIj5VbmZvcnR1bmF0ZWx5IHRoaXMgd2lsbCBub3Qgd29yayB3ZWxsDQord2l0aCB0aGUgYnVpbHQtaW4gd2ViIHZlcnNpb24uIElmIHlvdSBkaWQgbm90IGtub3duIGFib3V0IGl0LCB0cnkNCitodHRwJ2luZyBpbnRvIGEgbWFjaGluZSBydW5uaW5nIFZOQyBzZXJ2ZXIgb24gaXQsIHRvIHBvcnQgNThYWCAod2hlcmUNCitYWCBpcyB0aGUgZGlzcGxheSBudW1iZXIpLCBhbmQgdGhlIEphdmEgY2xpZW50IHdpbGwgYmUgbG9hZGVkLjxCUj48QlI+DQorPC9QPg0KKzwvQk9EWT4NCis8L0hUTUw+DQpkaWZmIC0tZ2l0IGEvZG9jL3BsL2ZhcS5zdHVubmVsLTIuaHRtbCBiL2RvYy9wbC9mYXEuc3R1bm5lbC0yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1ZjQwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wbC9mYXEuc3R1bm5lbC0yLmh0bWwKQEAgLTAsMCArMSwxNDMgQEAKKzxIVE1MPgorPEhFQUQ+CisgICA8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIj4KKyAgIDxUSVRMRT5HZHkgcG9qYXdpYWqxIHNp6iBrs29wb3R5PC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IiMwMDAwMDAiIEJHQ09MT1I9IiNGRkZGRkYiIExJTks9IiMwMDAwRUYiIFZMSU5LPSIjNTExODhFIiBBTElOSz0iI0ZGMDAwMCI+Cis8Qj5ROiA8L0I+UHLzYnVqZSBrb21waWxvd2HmIHN0dW5uZWwgamVkbmFrIGRvc3RhamUKK25hc3TqcHVqsWNlIGtvbXVuaWthdHk6Cis8QlI+c3R1bm5lbC5jOjY5OiBzc2wuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorPEJSPnN0dW5uZWwuYzo3MTogYmlvLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzxCUj5zdHVubmVsLmM6NzI6IHBlbS5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Cis8QlI+bWFrZTogKioqIFtzdHVubmVsLm9dIEVycm9yIDEKKworPFA+PEI+QTo8L0I+IFOxIGR3aWUgcHJhd2RvcG9kb2JuZSBwcnp5Y3p5bnk6IG5pZSBtYXN6IHphaW5zdGFsb3dhbmVnbwordyBzeXN0ZW1pZSBwYWtpZXR1IFNTTGVheSBsdWIgcGFraWV0IG5pZSB6bmFqZHVqZSBzaWUgdyBtaWVqc2N1IGRvbXm2bG55bQorY3p5bGk8Qj4gL3Vzci9sb2NhbC9zc2wuIDwvQj5OYWxlv3kgemFpbnN0YWxvd2HmIFNTTGVheSBsdWIgdGW/IHBvcHJhd2nmCitNYWtlZmlsZSB0YWsgYnkgtmNpZb9rYSBiebNhIHByYXdpZLNvd2EuCis8QlI+Cis8SFIgV0lEVEg9IjEwMCUiPgorPEJSPjxCPlE6PC9CPiZuYnNwOyBQcvNidWplIHVydWNob21p5iBzdHVubmVsIGpha28gd3JhcHBlciBkbGEgaHR0cGQuIFBvCit3eWRhbml1IGtvbWVuZHk6IDxCPnN0dW5uZWwgNDQzIEBsb2NhbGhvc3Q6ODA8L0I+IGRlbW9uIHNp6iBuaWUgdXJ1Y2hhbWlhCithIHcgc3lzbG9ndSBwb2phd2lhIHNp6iBrb211bmlrYXQgIjxCPnN0dW5uZWxbMjQ4MV06IGdldHBlZXJuYW1lOiBTb2NrZXQKK29wZXJhdGlvbiBvbiBub24tc29ja2V0ICg4OCkiPC9CPjxCPjwvQj4KKworPFA+PEI+QTwvQj46IEplc3QgdG8gYrOxZCBjaGFyYWt0ZXJ5c3R5Y3pueSBkbGEgTGludXhhLiBOYWxlv3kgdyBwbGlrdQorc3R1bm5lbC5jIHptaWVuaeYgbGluaeo8Qj4gI2RlZmluZSBJTkVUX1NPQ0tFVF9QQUlSIDE8L0I+IG5hCis8QlI+PEI+I2RlZmluZSBJTkVUX1NPQ0tFVF9QQUlSIDA8L0I+IGkgenJla29tcGlsb3dh5iBwcm9ncmFtIHBvbm93bmllLgorPEJSPgorPEhSIFdJRFRIPSIxMDAlIj4KKzxCUj48Qj5ROjwvQj4gU3R1bm5lbCBuYWRhbCBzaeogbmllIHVydWNoYW1pYSBhIHcgc3lzbG9ndSBwb2phd2lhIHNp6iBrb211bmlrYXQKKyI8Qj5zdHVubmVsWzI1MjVdOiAvdXNyL2xvY2FsL3NzbC9jZXJ0cy9sb2NhbGhvc3Q6ODAucGVtOiBObyBzdWNoIGZpbGUKK29yIGRpcmVjdG9yeSAoMik8L0I+IjxCPjwvQj4KKworPFA+PEI+QTo8L0I+IE5pZSBwb3NpYWRhc3ogb2Rwb3dpZWRuaWVnbyBjZXJ0eWZpa2F0dSBkbGEgZGVtb25hLiBTdHVubmVsCit3IGNlbHUgcG9wcmF3bmVnbyBkemlhs2FuaWEgPEI+TVVTSTwvQj4gcG9zaWFkYeYgY2VydHlmaWthdC4gVyBjZWx1IHd5Z2VuZXJvd2FuaWEKK29kcG93aWVkbmllZ28gY2VydHlmaWthdHUgbmFsZb95IHd5ZGHmIGtvbWVuZGU6IDxCPi91c3IvbG9jYWwvc3NsL2Jpbi9zc2xlYXkKK3JlcSAtbmV3IC14NTA5IC1ub2RlcyAtb3V0IHNlcnZlci5wZW0gLWRheXMgMzY1IC1rZXlvdXQgc2VydmVyLnBlbTwvQj4mbmJzcDsKK2KxZLwgdGW/IHW/eeYgPEI+TWFrZWZpbGU8L0I+IGRvs7Fjem9uZWdvIGRvIHByb2dyYW11IHN0dW5uZWwgaSBwcnp5IHBvbW9jeQora29tZW5keSA8Qj5tYWtlIGNlcnQgPC9CPnN0d29yennmIGNlcnR5ZmlrYXQuIFRhayB1dHdvcnpvbnkgY2VydHlmaWthdCAoc2VydmVyLnBlbSkKK25hbGW/eSB1bWlltmNp5iB3IGthdGFsb2d1IDxCPi91c3IvbG9jYWwvc3NsL2NlcnRzPC9CPiBpIHV0d29yennmIGRv8SBvZHBvd2llZG5pZQorbGlua2kgbHViIHptaWXmIG5henfqIGNlcnR5ZmlrYXR1IG5hIHd5bWFnYW6xIHByemV6IHN0dW5uZWwuCis8QlI+Cis8SFIgV0lEVEg9IjEwMCUiPgorPEJSPjxCPlE6PC9CPiBXeWdlbmVyb3dhs2VtIG9kcG93aWVkbmkgY2VydHlmaWthdCBwcnp5IHBvbW9jeSBza3J5cHR1IENBLnNoLAorYSBzdHVubmVsIDxCPnByenkgc3RhcmNpZSBwcm9zaSBvIHBvZGFuaWUgaGFzs2E8L0I+LiBKYWsgbW+/bmEgcHJ6ZWthemHmCitoYXOzbyB6YWJlenBpZWN6YWqxY2UgY2VydHlmaWthdCBkbyBwcm9ncmFtdSA/PEI+PC9CPgorCis8UD48Qj5BOjwvQj4gVyBjaHdpbGkgb2JlY25laiBqZXN0IHRvIG5pZW1vv2xpd2UuIENlcnR5ZmlrYXR5IGt083J5bWkgcG9zs3VndWplCitzaWUgc3R1bm5lbCBuaWUgbW9nsSBieeYgemFiZXpwaWVjemFuZSBoYXOzZW0uIFByenkgdHdvcnplbml1IGNlcnR5ZmlrYXR1CituYWxlv3kgdb955iBvcGNqaSAtbm9kZXMgKGx1YiB1dHdvcnp55iBjZXJ0eWZpa2F0IHByenkgcG9tb2N5IG1ha2VmaWxlCitvZHN0YXJjem9uZWdvIHogcHJvZ3JhbWVtKS4KKzxCUj4KKzxIUiBXSURUSD0iMTAwJSI+Cis8QlI+PEI+UTo8L0I+IFBvIHVydWNob21pZW5pdSBwcm9ncmFtdSBzdHVubmVsIHcgc3lzbG9ndSBwb2phd2lhIHNp6iBrb211bmlrYXQ6CisiPEI+c3R1bm5lbFsyODA1XTogV0FSTklORzogV3JvbmcgcGVybWlzc2lvbnMgb24gL3Vzci9sb2NhbC9zc2wvY2VydHMvbG9jYWxob3N0OjgwLnBlbTwvQj4iLgorQ28gamVzdCBuaWUgdGFrID88Qj48L0I+CisKKzxQPjxCPkE6PC9CPiBUbyB0eWxrbyBvc3RyemW/ZW5pZSAhIENlcnR5ZmlrYXQgbmllIHBvd2llbiBkYeYgc2nqIG9kY3p5dGHmCitwcnpleiBpbm55Y2ggdb95dGtvd25pa/N3IHN5c3RlbXUuIFByYXdpZLNvd2UgcHJhd2EgZG9zdOpwdSBwb3dpbm55IGJ55gorbmFzdOpwdWqxY2U6IDxCPi1ydy0tLS0tLSZuYnNwOyZuYnNwOyAxIHJvb3QmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcm9vdCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworMTM3MCBOb3YgOCAxOTk3Jm5ic3A7IHNlcnZlci5wZW0gPC9CPihqZbZsaSB1cnVjaGFtaWFqsWN5bSBzdHVubmVsIGplc3QKK3Jvb3QpLgorPEJSPgorPEhSIFdJRFRIPSIxMDAlIj4KKzxCUj48Qj5ROjwvQj4gUHJvYm93YbNlbSB6cm9iaeYgdHVuZWxvd2FuaWUgcG+zsWN6ZW5pYSBkbyBkZW1vbmEgPEI+cG9wMzwvQj4uCitQb21pbW8genJvYmllbmlhIHByYXdpZLNvd2VnbyB3cGlzdSBkbyBpbmV0ZC5jb25mCis8QlI+InNwb3AzJm5ic3A7IHN0cmVhbSZuYnNwOyB0Y3AmbmJzcDsgbm93YWl0Jm5ic3A7IHJvb3QmbmJzcDsgL3Vzci9zYmluL3N0dW5uZWwmbmJzcDsKK3Fwb3BwZXIgLXMiIHN0dW5uZWwgbmllIGR6aWGzYSBhIHcgc3lzbG9ndSBwb2phd2lhIHNp6iBrb211bmlrYXQ6Cis8QlI+PEI+aW5ldGRbMjk0OV06IHNwb3AzL3RjcDogdW5rbm93biBzZXJ2aWNlLjwvQj48Qj48L0I+CisKKzxQPjxCPkE6IDwvQj5OaWUgenJvYmmzZbYgZG9kYXRrb3d5Y2ggd3Bpc/N3IGRvIHBsaWt1IDxCPi9ldGMvc2VydmljZXMuPC9CPgorWmdvZG5pZSB6IHJmYz8/Pz8gcHJhd2lks293eW1pIHBvcnRhbWkgbmEga3TzcnljaCBkemlhs2FqsSBkZW1vbnkgcG9zs3VndWqxY2UKK3Np6iBTU0wgc7E6Cis8VEFCTEU+Cis8VFI+Cis8VEQ+aHR0cHM8L1REPgorCis8VEQ+NDQzL3RjcDwvVEQ+CisKKzxURD4jIEhUVFAgb3ZlciBTU0wmbmJzcDs8L1REPgorPC9UUj4KKworPFRSPgorPFREPnNzbXRwPC9URD4KKworPFREPjQ2NS90Y3A8L1REPgorCis8VEQ+IyBTTVRQIG92ZXIgU1NMJm5ic3A7PC9URD4KKzwvVFI+CisKKzxUUj4KKzxURD5zbmV3czwvVEQ+CisKKzxURD41NjMvdGNwPC9URD4KKworPFREPiMgTk5UUCBvdmVyIFNTTCZuYnNwOzwvVEQ+Cis8L1RSPgorCis8VFI+Cis8VEQ+c3NsLWxkYXA8L1REPgorCis8VEQ+NjM2L3RjcDwvVEQ+CisKKzxURD4jIExEQVAgb3ZlciBTU0wmbmJzcDs8L1REPgorPC9UUj4KKworPFRSPgorPFREPnNpbWFwPC9URD4KKworPFREPjk5My90Y3A8L1REPgorCis8VEQ+IyBJTUFQIG92ZXIgU1NMJm5ic3A7PC9URD4KKzwvVFI+CisKKzxUUj4KKzxURD5zcG9wMzwvVEQ+CisKKzxURD45OTUvdGNwPC9URD4KKworPFREPiMgUE9QLTMgb3ZlciBTU0wmbmJzcDs8L1REPgorPC9UUj4KKzwvVEFCTEU+CitKZbZsaSBuaWUgY2hlc3ogcm9iaeYgcG9wcmF3ZWsgemFtaWFzdCBuYXp3eSBzZXJ3aXN1IHW/eWogbnVtZXJ1IHBvcnR1CituYSBrdPNyeW0gb24gZHppYbNhLgorPEJSPgorPEhSIFdJRFRIPSIxMDAlIj4KKzxCUj48Qj5ROjwvQj4gRG9icnplLCB6cm9iabNlbSB3eW1hZ2FueSB3cGlzIGxlY3ogdyBkYWxzenltIGNpYWd1IHN0dW5uZWwKK25pZSBkemlhs2EsIG5hdG9taWFzdCB3IHN5c2xvZ3UgcG9qYXdpYSBzaWUgd3BpczoKKzxCUj4mbmJzcDs8Qj5zdHVubmVsWzMwMTVdOiBleGVjdnA6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKDIpLiA8L0I+Q28KK2plc3pjemUgamVzdCBuaWUgdGFrID88Qj48L0I+CisKKzxQPjxCPkE6PC9CPiZuYnNwOyBQcmF3ZG9wb2RvbmUgc7EgZHdpZSBwcnp5Y3p5bnk6IHBpZXJ3c3phIHcgdHdvaW0gc3lzdGVtaWUKK25pZSBtYSBkZW1vbmEgZGxhIGt0b3JlZ28genJvYmmzZbYgd3BpcyB3IGluZXRkLmNvbmYsCis8QlI+KHNwb3AzJm5ic3A7IHN0cmVhbSZuYnNwOyB0Y3AmbmJzcDsgbm93YWl0Jm5ic3A7IHJvb3QmbmJzcDsgL3Vzci9zYmluL3N0dW5uZWwmbmJzcDsKK3Fwb3BwZXIgLXMpIGx1YiB0Zb8gZGFueSBwcm9ncmFtIGplc3QgdyBzeXN0ZW1pZSwgamVkbmFrILZjaWW/a2EgZG9zdOpwdQorZG8gbmllZ28gbmllIGplc3Qgd3ltaWVuaW9uYSB3IHptaWVubmVqIHN5c3RlbW93ZWogPEI+JFBBVEg8L0I+LiBOYWxlv3kKK3dp6mMgcG9wcmF3aeYgemFwaXMgdyBpbmV0ZC5jb25mIHV6dXBls25pYWqxYyBvIHBls25hILZjaWW/a2UgZG9zdOpwdSBkbworZGVtb25hIG5wLiZuYnNwOyA8Qj5zcG9wMyZuYnNwOyBzdHJlYW0mbmJzcDsgdGNwJm5ic3A7IG5vd2FpdCZuYnNwOyByb290Jm5ic3A7CisvdXNyL3NiaW4vc3R1bm5lbCZuYnNwOyAvdXNyL3NiaW4vcXBvcHBlciAtczwvQj4KKzxCUj4mbmJzcDsKKzxCUj4mbmJzcDsKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9wbC90d29yemVuaWVfY2VydHlmaWthdG93Lmh0bWwgYi9kb2MvcGwvdHdvcnplbmllX2NlcnR5ZmlrYXRvdy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWJmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGwvdHdvcnplbmllX2NlcnR5ZmlrYXRvdy5odG1sCkBAIC0wLDAgKzEsNzQ0IEBACis8SFRNTD4KKzxIRUFEPgorICAgPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiI+CisgICA8TUVUQSBOQU1FPSJBdXRob3IiIENPTlRFTlQ9IkFkYW0gSGVybmlrIj4KKyAgIDxUSVRMRT5Xc3p5c3RrbyBjbyBwb3dpbmllbmW2IHdpZWR6aWXmIG8gdHdvcnplbml1IGNlcnR5ZmlrYXTzdyBhbGUgbmllIGNoY2UgQ2kgc2nqIHBvc3p1a2HmIHcgZG9rdW1lbnRhY2ppPC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IiMwMDAwMDAiIEJHQ09MT1I9IiNDQ0NDQ0MiIExJTks9IiMwMDAwRUYiIFZMSU5LPSIjNTExODhFIiBBTElOSz0iI0ZGMDAwMCI+CisKKzxDRU5URVI+Cis8SDE+Cis8Rk9OVCBTSVpFPSsyPldzenlzdGtvIGNvIHBvd2luaWVuZbYgd2llZHppZeYgbyB0d29yemVuaXUgY2VydHlmaWthdPN3CithbGUgbmllIGNoY2UgQ2kgc2nqPC9GT05UPjwvSDE+PC9DRU5URVI+CisKKzxDRU5URVI+Cis8SDE+Cis8Rk9OVCBTSVpFPSsyPnBvc3p1a2HmIHcgZG9rdW1lbnRhY2ppLjwvRk9OVD48L0gxPjwvQ0VOVEVSPgorJm5ic3A7CisKKzxQPjxCPjxGT05UIFNJWkU9KzE+Q28gcG93aW5ubyB6bmFqZG93YeYgc2nqIG5hIFR3b2ltIGR5c2t1IHphbWluIHpvc3Rhbmllc3oKKyJDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyIuPC9GT05UPjwvQj4KKworPFA+UG9kc3Rhd293eW0gb3Byb2dyYW1vd2FuaWVtIGplc3Qgb2N6eXdptmNpZSA8QSBIUkVGPSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnIj5vcGVuc3NsPC9BPi4KK1cgdHltIG1pZWpzY3UgbmFsZb95IHphY2hvd2HmIGN6dWpub7bmCis8QlI+Ym8gb3BlbnNzbCA8Qj5NVVNJPC9CPiBieeYgY28gbmFqbW5pZWogdyB3ZXJzamkgMC45LjJiIGR6aepraSBjemVtdQorb21pbmllIENp6iBjeuq25iBrYXJrb7NvbW55Y2gKKzxCUj5vcGVyYWNqaSBwcnp5IHBvbW9jeSA8QSBIUkVGPSJodHRwOi8vd3d3LmRyaC1jb25zdWx0YW5jeS5kZW1vbi5jby51ayI+cGNrczEyPC9BPgora3RvcnkgdGFrv2UgbXVzaXN6IHBvc2lhZGHmIHcgc3dvaWNoIHphc29iYWNoIGR5c2tvd3ljaC4KKzxCUj5KZbZsaSBtYXN6IGp1vyB6YWluc3RhbG93YW5lIHBvd3m/c3plIG9wcm9ncmFtb3dhbmllIG1vv2VzeiB6YWN6seYKK3R3b3J6eeYgY2VydHlmaWthdHkuCisKKzxQPjxCPjxGT05UIFNJWkU9KzE+S29uZmlndXJhY2phIG9wZW5zc2wuPC9GT05UPjwvQj4KKworPFA+WmFrs2FkYW0gemUgb3BlbnNzbCBqZXN0IHphaW5zdGFsb3dhbnkgc3RhbmRhcmRvd28gY3p5bGkgdyA8Qj4vdXNyL2xvY2FsL3NzbDwvQj4uCitQaWVyd3N6eW0ga3Jva2llbSBqZXN0Cis8QlI+cHJ6ZWpyemVuaWUgaSAiZG9rb25maWd1cm93YW5pZSIgPEI+L3Vzci9sb2NhbC9zc2wvbGliL29wZW5zc2wuY25mPC9CPi4KK03zaiBkb21vd3kga29uZmlnIHd5Z2yxZGEgbmFzdOpwdWqxY28KKzxCUj4oa29sb3JlbSBjemVyd29ueW0gemF6bmFjenlsZW0gb3BjamUga3TzcmUgcmFjemVqIHBvd2luaWVuZbYgem1pZW5p5ikKKzoKKzxCUj48Rk9OVCBTSVpFPS0yPjxBIEhSRUY9IiNrb25pZWMgb3BlbnNzbC5jbmYiPmpltmxpIG5pZSBjaGNlIENpIHNp6iB0ZWdvCitjenl0YeYgdG8gc2tvY3ogbmEga29uaWVjIGtvbmZpZ2E8L0E+PC9GT05UPgorCis8UD48ST4jPC9JPgorPEJSPjxJPiMgT3BlblNTTCBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZS48L0k+Cis8QlI+PEk+IyBUaGlzIGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW9uIG9mIGNlcnRpZmljYXRlIHJlcXVlc3RzLjwvST4KKzxCUj48ST4jPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5SQU5ERklMRSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSAkRU5WOjpIT01FLy5ybmQ8L0k+Cis8QlI+PEk+b2lkX2ZpbGUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gJEVOVjo6SE9NRS8ub2lkPC9JPgorPEJSPjxJPm9pZF9zZWN0aW9uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IG5ld19vaWRzPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5bIG5ld19vaWRzIF08L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgV2UgY2FuIGFkZCBuZXcgT0lEcyBpbiBoZXJlIGZvciB1c2UgYnkgJ2NhJyBhbmQgJ3JlcScuPC9JPgorPEJSPjxJPiMgQWRkIGEgc2ltcGxlIE9JRCBsaWtlIHRoaXM6PC9JPgorPEJSPjxJPiMgdGVzdG9pZDE9MS4yLjMuNDwvST4KKzxCUj48ST4jIE9yIHVzZSBjb25maWcgZmlsZSBzdWJzdGl0dXRpb24gbGlrZSB0aGlzOjwvST4KKzxCUj48ST4jIHRlc3RvaWQyPSR7dGVzdG9pZDF9LjUuNjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8L0k+Cis8QlI+PEk+WyBjYSBdPC9JPgorPEJSPjxJPmRlZmF1bHRfY2EmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSBDQV9kZWZhdWx0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisjIFRoZSBkZWZhdWx0IGNhIHNlY3Rpb248L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPC9JPgorPEJSPjxJPlsgQ0FfZGVmYXVsdCBdPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5kaXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gLi9kZW1vQ0EmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgV2hlcmUgZXZlcnl0aGluZyBpcyBrZXB0PC9JPgorPEJSPjxJPmNlcnRzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9ICRkaXIvY2VydHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgV2hlcmUgdGhlIGlzc3VlZCBjZXJ0cyBhcmUga2VwdDwvST4KKzxCUj48ST5jcmxfZGlyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gJGRpci9jcmwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHQ8L0k+Cis8QlI+PEk+ZGF0YWJhc2UmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSAkZGlyL2luZGV4LnR4dCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyBkYXRhYmFzZSBpbmRleCBmaWxlLjwvST4KKzxCUj48ST5uZXdfY2VydHNfZGlyJm5ic3A7Jm5ic3A7ID0gJGRpci9uZXdjZXJ0cyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyBkZWZhdWx0IHBsYWNlIGZvciBuZXcgY2VydHMuPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5jZXJ0aWZpY2F0ZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9ICRkaXIvY2FjZXJ0LnBlbSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyBUaGUgQ0EgY2VydGlmaWNhdGU8L0k+Cis8QlI+PEk+c2VyaWFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gJGRpci9zZXJpYWwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgVGhlIGN1cnJlbnQgc2VyaWFsIG51bWJlcjwvST4KKzxCUj48ST5jcmwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gJGRpci9jcmwucGVtJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICMKK1RoZSBjdXJyZW50IENSTDwvST4KKzxCUj48ST5wcml2YXRlX2tleSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9ICRkaXIvcHJpdmF0ZS9jYWtleS5wZW0jIFRoZQorcHJpdmF0ZSBrZXk8L0k+Cis8QlI+PEk+UkFOREZJTEUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSAkZGlyL3ByaXZhdGUvLnJhbmQmbmJzcDsmbmJzcDsmbmJzcDsKKyMgcHJpdmF0ZSByYW5kb20gbnVtYmVyIGZpbGU8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPng1MDlfZXh0ZW5zaW9ucyA9IHVzcl9jZXJ0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisjIFRoZSBleHRlbnNpb25zIHRvIGFkZCB0byB0aGUgY2VydDwvST4KKzxCUj48ST5jcmxfZXh0ZW5zaW9ucyZuYnNwOyA9IGNybF9leHQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgRXh0ZW5zaW9ucyB0byBhZGQgdG8gQ1JMPC9JPgorPEJSPjxJPmRlZmF1bHRfZGF5cyZuYnNwOyZuYnNwOyZuYnNwOyA9IDM2NSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyBob3cgbG9uZyB0byBjZXJ0aWZ5IGZvcjwvST4KKzxCUj48ST5kZWZhdWx0X2NybF9kYXlzPSAzMCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyBob3cgbG9uZyBiZWZvcmUgbmV4dCBDUkw8L0k+Cis8QlI+PEk+ZGVmYXVsdF9tZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IG1kNSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworIyB3aGljaCBtZCB0byB1c2UuPC9JPgorPEJSPjxJPnByZXNlcnZlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gbm8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMga2VlcCBwYXNzZWQgRE4gb3JkZXJpbmc8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgQSBmZXcgZGlmZmVyZW5jZSB3YXkgb2Ygc3BlY2lmeWluZyBob3cgc2ltaWxhciB0aGUgcmVxdWVzdCBzaG91bGQKK2xvb2s8L0k+Cis8QlI+PEk+IyBGb3IgdHlwZSBDQSwgdGhlIGxpc3RlZCBhdHRyaWJ1dGVzIG11c3QgYmUgdGhlIHNhbWUsIGFuZCB0aGUgb3B0aW9uYWw8L0k+Cis8QlI+PEk+IyBhbmQgc3VwcGxpZWQgZmllbGRzIGFyZSBqdXN0IHRoYXQgOi0pPC9JPgorPEJSPjxJPnBvbGljeSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IHBvbGljeV9tYXRjaDwvST4KKzxCUj48ST4jIEZvciB0aGUgQ0EgcG9saWN5PC9JPgorPEJSPjxJPlsgcG9saWN5X21hdGNoIF08L0k+Cis8QlI+PEk+Y291bnRyeU5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gbWF0Y2g8L0k+Cis8QlI+PEk+c3RhdGVPclByb3ZpbmNlTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IG1hdGNoPC9JPgorPEJSPjxJPm9yZ2FuaXphdGlvbk5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSBtYXRjaDwvST4KKzxCUj48ST5vcmdhbml6YXRpb25hbFVuaXROYW1lJm5ic3A7ID0gb3B0aW9uYWw8L0k+Cis8QlI+PEk+Y29tbW9uTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBzdXBwbGllZDwvST4KKzxCUj48ST5lbWFpbEFkZHJlc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gb3B0aW9uYWw8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgRm9yIHRoZSAnYW55dGhpbmcnIHBvbGljeTwvST4KKzxCUj48ST4jIEF0IHRoaXMgcG9pbnQgaW4gdGltZSwgeW91IG11c3QgbGlzdCBhbGwgYWNjZXB0YWJsZSAnb2JqZWN0JzwvST4KKzxCUj48ST4jIHR5cGVzLjwvST4KKzxCUj48ST5bIHBvbGljeV9hbnl0aGluZyBdPC9JPgorPEJSPjxJPmNvdW50cnlOYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IG9wdGlvbmFsPC9JPgorPEJSPjxJPnN0YXRlT3JQcm92aW5jZU5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSBvcHRpb25hbDwvST4KKzxCUj48ST5sb2NhbGl0eU5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gb3B0aW9uYWw8L0k+Cis8QlI+PEk+b3JnYW5pemF0aW9uTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IG9wdGlvbmFsPC9JPgorPEJSPjxJPm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUmbmJzcDsgPSBvcHRpb25hbDwvST4KKzxCUj48ST5jb21tb25OYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IHN1cHBsaWVkPC9JPgorPEJSPjxJPmVtYWlsQWRkcmVzcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBvcHRpb25hbDwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8L0k+Cis8QlI+PEEgTkFNRT0icmVxIj48L0E+PEk+WyByZXEgXTwvST4KKzxCUj48ST5kZWZhdWx0X2JpdHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gPEZPTlQgQ09MT1I9IiNGRjAwMDAiPjEwMjQ8L0ZPTlQ+PC9JPgorPEJSPjxJPmRlZmF1bHRfa2V5ZmlsZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBwcml2a2V5LnBlbTwvST4KKzxCUj48ST5kaXN0aW5ndWlzaGVkX25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lPC9JPgorPEJSPjxJPmF0dHJpYnV0ZXMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gcmVxX2F0dHJpYnV0ZXM8L0k+Cis8QlI+PEk+eDUwOV9leHRlbnNpb25zID0gdjNfY2EgIyBUaGUgZXh0ZW5zaW9ucyB0byBhZGQgdG8gdGhlIHNlbGYgc2lnbmVkCitjZXJ0PC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5bIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXTwvST4KKzxCUj48ST5jb3VudHJ5TmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBDb3VudHJ5IE5hbWUgKDIgbGV0dGVyIGNvZGUpPC9JPgorPEJSPjxJPmNvdW50cnlOYW1lX2RlZmF1bHQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gPEZPTlQgQ09MT1I9IiNGRjAwMDAiPlBMPC9GT05UPjwvST4KKzxCUj48ST5jb3VudHJ5TmFtZV9taW4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gMjwvST4KKzxCUj48ST5jb3VudHJ5TmFtZV9tYXgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gMjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+c3RhdGVPclByb3ZpbmNlTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBTdGF0ZSBpIFByb3dpbmNqYTwvST4KKzxCUj48ST5zdGF0ZU9yUHJvdmluY2VOYW1lX2RlZmF1bHQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSA8Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+U3RhdGUtUHJvd2luY2phCitkb215c2xuYTwvRk9OVD48L0k+Cis8QlI+PEk+bG9jYWxpdHlOYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IExvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KTwvST4KKzxCUj48ST5sb2NhbGl0eU5hbWVfZGVmYXVsdCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSA8Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+TG9kejwvRk9OVD48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPjAub3JnYW5pemF0aW9uTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBPcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpPC9JPgorPEJSPjxJPjAub3JnYW5pemF0aW9uTmFtZV9kZWZhdWx0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gPEZPTlQgQ09MT1I9IiNGRjAwMDAiPk5hd3phCitPcmdhbml6YWNqaTwvRk9OVD48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgd2UgY2FuIGRvIHRoaXMgYnV0IGl0IGlzIG5vdCBuZWVkZWQgbm9ybWFsbHkgOi0pPC9JPgorPEJSPjxJPiMxLm9yZ2FuaXphdGlvbk5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gU2Vjb25kIE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSk8L0k+Cis8QlI+PEk+IzEub3JnYW5pemF0aW9uTmFtZV9kZWZhdWx0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gV29ybGQgV2lkZQorV2ViIFB0eSBMdGQ8L0k+Cis8QlI+PEk+b3JnYW5pemF0aW9uYWxVbml0TmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSBPcmdhbml6YXRpb25hbCBVbml0IE5hbWUgKGVnLCBzZWN0aW9uKTwvST4KKzxCUj48ST5vcmdhbml6YXRpb25hbFVuaXROYW1lX2RlZmF1bHQmbmJzcDsgPSA8Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+VW5pdAorbmFtZSBkb215c2xueTwvRk9OVD48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPmNvbW1vbk5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gQ29tbW9uIE5hbWUgKGVnLCBZT1VSIG5hbWUpPC9JPgorPEJSPjxJPmNvbW1vbk5hbWVfbWF4Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IDY0PC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5lbWFpbEFkZHJlc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gRW1haWwgQWRkcmVzczwvST4KKzxCUj48ST5lbWFpbEFkZHJlc3NfbWF4Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IDQwPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST4jIFNFVC1leDMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gU0VUIGV4dGVuc2lvbiBudW1iZXIgMzwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+WyByZXFfYXR0cmlidXRlcyBdPC9JPgorPEJSPjxJPmNoYWxsZW5nZVBhc3N3b3JkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IEEgY2hhbGxlbmdlIHBhc3N3b3JkPC9JPgorPEJSPjxJPmNoYWxsZW5nZVBhc3N3b3JkX21pbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IDQ8L0k+Cis8QlI+PEk+Y2hhbGxlbmdlUGFzc3dvcmRfbWF4Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gMjA8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPnVuc3RydWN0dXJlZE5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gQW4gb3B0aW9uYWwgY29tcGFueSBuYW1lPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48QSBOQU1FPSJ1c3JfY2VydCI+PC9BPjxJPlsgdXNyX2NlcnQgXTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBUaGVzZSBleHRlbnNpb25zIGFyZSBhZGRlZCB3aGVuICdjYScgc2lnbnMgYSByZXF1ZXN0LjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBUaGlzIGdvZXMgYWdhaW5zdCBQS0lYIGd1aWRlbGluZXMgYnV0IHNvbWUgQ0FzIGRvIGl0IGFuZCBzb21lCitzb2Z0d2FyZTwvST4KKzxCUj48ST4jIHJlcXVpcmVzIHRoaXMgdG8gYXZvaWQgaW50ZXJwcmV0aW5nIGFuIGVuZCB1c2VyIGNlcnRpZmljYXRlIGFzCithIENBLjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+YmFzaWNDb25zdHJhaW50cz1DQTpGQUxTRTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSB1c2FnZSBvZiBuc0NlcnRUeXBlLiBJZiBpdCBpcyBvbWl0dGVkPC9JPgorPEJSPjxJPiMgdGhlIGNlcnRpZmljYXRlIGNhbiBiZSB1c2VkIGZvciBhbnl0aGluZyAqZXhjZXB0KiBvYmplY3Qgc2lnbmluZy48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxBIE5BTUU9InNlcnZlciI+PC9BPjxJPiMgVGhpcyBpcyBPSyBmb3IgYW4gU1NMIHNlcnZlci48L0k+Cis8QlI+PEk+PEZPTlQgQ09MT1I9IiMwMDY2MDAiPiNuc0NlcnRUeXBlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IHNlcnZlcjwvRk9OVD48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgRm9yIGFuIG9iamVjdCBzaWduaW5nIGNlcnRpZmljYXRlIHRoaXMgd291bGQgYmUgdXNlZC48L0k+Cis8QlI+PEk+I25zQ2VydFR5cGUgPSBvYmpzaWduPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48QSBOQU1FPSJrbGllbnQiPjwvQT48ST4jIEZvciBub3JtYWwgY2xpZW50IHVzZSB0aGlzIGlzIHR5cGljYWw8L0k+Cis8QlI+PEk+PEZPTlQgQ09MT1I9IiMwMDY2MDAiPm5zQ2VydFR5cGUgPSBjbGllbnQsIGVtYWlsPC9GT05UPjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBUaGlzIGlzIHR5cGljYWwgYWxzbzwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+a2V5VXNhZ2UgPSBub25SZXB1ZGlhdGlvbiwgZGlnaXRhbFNpZ25hdHVyZSwga2V5RW5jaXBoZXJtZW50PC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST5uc0NvbW1lbnQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gIjxGT05UIENPTE9SPSIjRkYwMDAwIj5PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTwvRk9OVD4iPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST4jIFBLSVggcmVjb21tZW5kYXRpb25zPC9JPgorPEJSPjxJPnN1YmplY3RLZXlJZGVudGlmaWVyPWhhc2g8L0k+Cis8QlI+PEk+YXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZCxpc3N1ZXI6YWx3YXlzPC9JPgorPEJSPjxJPiMgSW1wb3J0IHRoZSBlbWFpbCBhZGRyZXNzLjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+c3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBDb3B5IHN1YmplY3QgZGV0YWlsczwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+aXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+I25zQ2FSZXZvY2F0aW9uVXJsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IGh0dHA6Ly93d3cuZG9tYWluLmRvbS9jYS1jcmwucGVtPC9JPgorPEJSPjxJPiNuc0Jhc2VVcmw8L0k+Cis8QlI+PEk+I25zUmV2b2NhdGlvblVybDwvST4KKzxCUj48ST4jbnNSZW5ld2FsVXJsPC9JPgorPEJSPjxJPiNuc0NhUG9saWN5VXJsPC9JPgorPEJSPjxJPiNuc1NzbFNlcnZlck5hbWU8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPlsgdjNfY2FdPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST4jIEV4dGVuc2lvbnMgZm9yIGEgdHlwaWNhbCBDQTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBJdCdzIGEgQ0EgY2VydGlmaWNhdGU8L0k+Cis8QlI+PEk+YmFzaWNDb25zdHJhaW50cyA9IENBOnRydWU8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgUEtJWCByZWNvbW1lbmRhdGlvbi48L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPnN1YmplY3RLZXlJZGVudGlmaWVyPWhhc2g8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPmF1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQ6YWx3YXlzLGlzc3VlcjphbHdheXM8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgVGhpcyBpcyB3aGF0IFBLSVggcmVjb21tZW5kcyBidXQgc29tZSBicm9rZW4gc29mdHdhcmUgY2hva2VzIG9uCitjcml0aWNhbDwvST4KKzxCUj48ST4jIGV4dGVuc2lvbnMuPC9JPgorPEJSPjxJPiNiYXNpY0NvbnN0cmFpbnRzID0gY3JpdGljYWwsQ0E6dHJ1ZTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBLZXkgdXNhZ2U6IGFnYWluIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBjcml0aWNhbC48L0k+Cis8QlI+PEk+a2V5VXNhZ2UgPSBjUkxTaWduLCBrZXlDZXJ0U2lnbjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBTb21lIG1pZ2h0IHdhbnQgdGhpcyBhbHNvPC9JPgorPEJSPjxJPm5zQ2VydFR5cGUgPSBzc2xDQSwgZW1haWxDQSwgb2JqQ0E8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgSW5jbHVkZSBlbWFpbCBhZGRyZXNzIGluIHN1YmplY3QgYWx0IG5hbWU6IGFub3RoZXIgUEtJWCByZWNvbW1lbmRhdGlvbjwvST4KKzxCUj48ST5zdWJqZWN0QWx0TmFtZT1lbWFpbDpjb3B5PC9JPgorPEJSPjxJPiMgQ29weSBpc3N1ZXIgZGV0YWlsczwvST4KKzxCUj48ST5pc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5PC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST4jIFJBVyBERVIgaGV4IGVuY29kaW5nIG9mIGFuIGV4dGVuc2lvbjogYmV3YXJlIGV4cGVydHMgb25seSE8L0k+Cis8QlI+PEk+IyAxLjIuMy41PVJBVzowMjowMzwvST4KKzxCUj48ST4jIFlvdSBjYW4gZXZlbiBvdmVycmlkZSBhIHN1cHBvcnRlZCBleHRlbnNpb246PC9JPgorPEJSPjxJPiMgYmFzaWNDb25zdHJhaW50cz0gY3JpdGljYWwsIFJBVzozMDowMzowMTowMTpGRjwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+WyBjcmxfZXh0IF08L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPiMgQ1JMIGV4dGVuc2lvbnMuPC9JPgorPEJSPjxJPiMgT25seSBpc3N1ZXJBbHROYW1lIGFuZCBhdXRob3JpdHlLZXlJZGVudGlmaWVyIG1ha2UgYW55IHNlbnNlIGluCithIENSTC48L0k+CisKKzxQPjxJPmlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHk8L0k+Cis8QlI+PEk+YXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyOmFsd2F5czwvST4KKzxCUj4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworPEJSPiMjIyMjIyMjIyMga29uaWVjIHBsaWt1IG9wZW5zc2wuY25mCisKKzxQPjxBIE5BTUU9ImtvbmllYyBvcGVuc3NsLmNuZiI+PC9BPkphayB3aWRh5iB6bWlhbnkgc7EgcHJha3R5Y3puaWUga29zbWV0eWN6bmUuJm5ic3A7CitOYWxlv3kgendy82NpYyBqZWR5bmllIHV3YWfqIG5hIG9wY2rqIDxBIEhSRUY9IiNyZXEiPmRlZmF1bHRfYml0czwvQT4gdworc2VrY2ppIHJlcS4KKzxCUj5XIG1vbWVuY2llIGdlbmVyb3dhbmlhIGNlcnR5ZmlrYXR1IENBIHBvd2lubmEgbWll5iBvbmEgd2FydG+25iAxMDI0CitsdWIgd2nqY2VqLCBuYXRvbWlhc3QgdyB0cmFrY2llIHR3b3J6ZW5pYQorPEJSPmNlcnR5ZmlrYXTzdyBrbGllbmNraWNoIHdpbm5vIG1pZeYgc2nqIG5hIHV3YWR6ZSB3cmVkbrEgY2VjaOogcHJvZHVrdPN3CitNJCBkb3N06nBueWNoIHBvemEgZ3JhbmljYW1pIFVTQS4KKzxCUj5OaWUgc7Egb25lIHcgc3RhbmllIHphaW1wb3J0b3dh5iBrbHVjenkgbWFqsWN5Y2ggd2nqY2VqIG5pvyA1MTIgYml083cuCitXIHRha2ltIHByenlwYWRrdSBkZWZhdWx0X2JpdHMgbmFsZb95Cis8QlI+em1uaWVqc3p55iBkbyB0ZWogd2FydG+2Y2kuIEpltmxpIGNob2R6aSBvIE5ldHNjYXBhIGtvbmllY3pub7bmIHRha2EKK25pZSB3eXN06nB1amUsIG5hd2V0IGdkeSBuaWUgamVzdCBvbgorPEJSPnBhdGNob3dhbnkgcHJ6eSBwb21vY3kgPEEgSFJFRj0iaHR0cDovL3d3dy5mb3J0aWZ5Lm5ldC8iPkZvcnRpZnk8L0E+LgorSmVkbmFrv2Uga2x1Y3ogbmllIHBvd2luaWVuIGJ55iB3aeprc3p5IG5pvyAxMDI0IGJpdHkuCisKKzxQPjxCPjxGT05UIFNJWkU9KzE+R2VuZXJvd2FuaWUgY2VydHlmaWthdHUgQ0E8L0ZPTlQ+PC9CPgorCis8UD5QaWVyd3N6ebEgY3p5bm5vtmNpsSBqYWuxIG5hbGW/eSB3eWtvbmHmIGplc3Qgd3lnZW5lcm93YW5pZSBjZXJ0eWZpa2F0dQorQ0EgY3p5bGkgY3plZ2+2IGN6eW0gYupksQorPEJSPnBvZHBpc3dhbmUgY2VydHlmaWthdHkgdWRvc3TqcG5pYW5lIGtsaWVudG9tLiBVcnVjaG9tIHJ4dnQgbHViIGNvtgoraW5uZWdvIGkgd3lrb25haiBwb2xlY2VuaWU6CisKKzxQPjxJPmFkYXM6fiMgPEI+Y2QgL3Vzci9sb2NhbC9zc2wvYmluPC9CPjwvST4KKzxCUj48ST5hZGFzOi91c3IvbG9jYWwvc3NsL2JpbiMgPEI+Li9DQS5wbCAtbmV3Y2E8L0I+PC9JPgorCis8UD48ST5DQSBjZXJ0aWZpY2F0ZSBmaWxlbmFtZSAob3IgZW50ZXIgdG8gY3JlYXRlKTwvST4KKworPFA+PEk+TWFraW5nIENBIGNlcnRpZmljYXRlIC4uLjwvST4KKzxCUj48ST5Vc2luZyBjb25maWd1cmF0aW9uIGZyb20gL3Vzci9sb2NhbC9zc2wvbGliL29wZW5zc2wuY25mPC9JPgorPEJSPjxJPkdlbmVyYXRpbmcgYSAxMDI0IGJpdCBSU0EgcHJpdmF0ZSBrZXk8L0k+Cis8QlI+PEk+Li4rKysrKzwvST4KKzxCUj48ST4uLi4uKysrKys8L0k+Cis8QlI+PEk+d3JpdGluZyBuZXcgcHJpdmF0ZSBrZXkgdG8gJy4vZGVtb0NBL3ByaXZhdGUvY2FrZXkucGVtJzwvST4KKzxCUj48QSBOQU1FPSJwZW1fcGFzcyI+PC9BPjxJPjxGT05UIENPTE9SPSIjMDA5OTAwIj5FbnRlciBQRU0gcGFzcyBwaHJhc2U6PC9GT05UPjwvST4KKzxCUj48ST48Rk9OVCBDT0xPUj0iIzAwOTkwMCI+VmVyaWZ5aW5nIHBhc3N3b3JkIC0gRW50ZXIgUEVNIHBhc3MgcGhyYXNlOjwvRk9OVD48L0k+Cis8QlI+PEk+LS0tLS08L0k+Cis8QlI+PEk+WW91IGFyZSBhYm91dCB0byBiZSBhc2tlZCB0byBlbnRlciBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgaW5jb3Jwb3JhdGVkPC9JPgorPEJSPjxJPmludG8geW91ciBjZXJ0aWZpY2F0ZSByZXF1ZXN0LjwvST4KKzxCUj48ST5XaGF0IHlvdSBhcmUgYWJvdXQgdG8gZW50ZXIgaXMgd2hhdCBpcyBjYWxsZWQgYSBEaXN0aW5ndWlzaGVkIE5hbWUKK29yIGEgRE4uPC9JPgorPEJSPjxJPlRoZXJlIGFyZSBxdWl0ZSBhIGZldyBmaWVsZHMgYnV0IHlvdSBjYW4gbGVhdmUgc29tZSBibGFuazwvST4KKzxCUj48ST5Gb3Igc29tZSBmaWVsZHMgdGhlcmUgd2lsbCBiZSBhIGRlZmF1bHQgdmFsdWUsPC9JPgorPEJSPjxJPklmIHlvdSBlbnRlciAnLicsIHRoZSBmaWVsZCB3aWxsIGJlIGxlZnQgYmxhbmsuPC9JPgorPEJSPjxJPi0tLS0tPC9JPgorPEJSPjxJPkNvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkgW1BMXTo8L0k+Cis8QlI+PEk+U3RhdGUgaSBQcm93aW5jamEgW0tyYWluYSBCZXpyb2JvdG55Y2ggU3p3YWN6ZWtdOjwvST4KKzxCUj48ST5Mb2NhbGl0eSBOYW1lIChlZywgY2l0eSkgW0xvZHpdOjwvST4KKzxCUj48ST5Pcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpIFtJbnN0eXR1dCBCYWRhbiBDemFyb3cgaSBNYWdpaV06PC9JPgorPEJSPjxJPk9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pIFtLb21vcmthIGQvcyBFZ3pvcmN5em1vdworaSBPcGVudGFuXTo8L0k+Cis8QlI+PEk+Q29tbW9uIE5hbWUgKGVnLCBZT1VSIG5hbWUpIFtdOkFkYW0gSGVybmlrPC9JPgorPEJSPjxJPkVtYWlsIEFkZHJlc3MgW106YWRhc0BpbmZvY2VudHJ1bS5jb208L0k+CisKKzxQPjxJPmFkYXM6L3Vzci9sb2NhbC9zc2wvYmluIzwvST4KKworPFA+U2tyeXB0IENBLnBsIHVydWNob21pb255IHBvcmF6IHBpZXJ3c3p5IHR3b3J6eSB3IC91c3IvbG9jYWwvc3NsL2Jpbgora2F0YWxvZyBvIG5hendpZSBkZW1vQ0EgdyBrdPNyeW0gem5hamR1amUgc2nqCis8QlI+d3lnZW5lcm93YW55IHByemVkIGNod2lssSBjZXJ0eWZpa2F0IHB1YmxpY3pueSA8Qj5jYWNlcnQucGVtPC9CPiAoZG+zsWN6YW55Citw879uaWVqIGRvIGNlcnR5ZmlrYXTzdyBrbGllbmNraWNoKSBvcmF6IHRham55Cis8QlI+emFiZXpwaWVjem9ueSA8QSBIUkVGPSIjcGVtX3Bhc3MiPmhhc7NlbTwvQT4ga2x1Y3ogPEI+Y2FrZXkucGVtPC9CPgora3TzcnltIGLqZHppZXN6IHBvZHBpc3l3YbMgY2VydHlmaWthdHkgd3lkYXdhbmUgdb95dGtvd25pa29tLiBLbHVjeiBpIGhhc7NvCis8QlI+b2N6eXdptmNpZSBuYWxlv3kgZG9icnplIGNocm9uaeYgaSBuYWpsZXBpZWogamVzdCBnZHkgem5hamR1amUgc2nqCituYSBzZXJ3ZXJ6ZSB0eWxrbyB3IG1vbWVuY2llIGdlbmVyb3dhbmlhIGNlcnR5ZmlrYXR1LgorPEJSPlBvbm93bmUgdXJ1Y2hvbWllbmllIENBLnBsIHogcGFyYW1ldHJlbSAtbmV3Y2EgbmlzemN6eSB0byBjbyBwcmFjb3dpY2llCitzdHdvcnp5s2W2IGkgZ2VuZXJ1amUgbm93eSBrbHVjeiBpIGNlcnR5ZmlrYXQuCis8QlI+Jm5ic3A7CisKKzxQPjxCPjxGT05UIFNJWkU9KzE+VHdvcnplbmllIGNlcnR5ZmlrYXR1IGRsYSBzdHVubmVsYSBpIGlubnljaCBzZXJ3ZXLzdzwvRk9OVD48L0I+Cis8QlI+Jm5ic3A7CisKKzxQPlphbmltIHNp6iBkbyB0ZWdvIHphYmllcnplc3ogcG93aW5pZW5ltiBsZWtrbyB6bW9keWZpa293YWMgc2tyeXB0IDxCPkNBLnBsPC9CPgorb3JheiBwbGlrIGtvbmZpZ3VyYWN5am55IDxCPm9wZW5zc2wuY25mPC9CPi4KKzxCUj5Ta29waXVqIGplIG9kcG93aWVkbmlvIGRvIHBsaWvzdyA8Qj4vdXNyL2xvY2FsL3NzbC9iaW4vQ0FzZXJ2LnBsPC9CPgoraSA8Qj4vdXNyL2xvY2FsL3NzbC9saWIvb3BlbnNzbF9zZXJ2LmNuZjwvQj4uPEI+PC9CPgorPEJSPkdlbmVyb3dhbmUgY2VydHlmaWthdHkgZG9tebZsbmllIHphYmV6cGllY3pvbmUgc7EgaGFzs2VtLCB3IHRha2ltIHByenlwYWRrdQordyBtb21lbmNpZSBzdGFydHUgc3R1bm5lbGEgemF3c3plCis8QlI+Yupkemllc3ogcHl0YW55IG8gaGFzbG8gemFiZXpwaWVjemFqsWNlLCBjbyBza3V0ZWN6bmllIHVuaWVtb79saXdpCithdXRvbWF0eWN6bmUgdXJ1Y2hhbWlhbmllIHByb2dyYW11IHcgY3phc2llCis8QlI+Ym9vdG93YW5pYSZuYnNwOyBzZXJ3ZXJhLCBjenkgdGW/IHByenkgcHLzYmllIHd5c3RhcnRvd2FuaWEgZ28gcHJ6ZXoKK2luZXRkLiBOYWxlv3kgcG9wcmF3aeYgPEI+bGluaWUgNDA8L0I+IGkgPEI+NDE8L0I+IHNrcnlwdHUKKzxCUj48Qj5DQXNlcnYucGw8L0I+IHoKKworPFA+PEZPTlQgQ09MT1I9IiMwMDY2MDAiPmxpbmlhIDQwOjwvRk9OVD4KKzxCUj48Qj4kUkVRPSJvcGVuc3NsIHJlcSA8ST4kU1NMRUFZX0NPTkZJRzwvST4iOzwvQj4KKzxCUj5uYQorPEJSPjxCPiRSRVE9Im9wZW5zc2wgcmVxIDxGT05UIENPTE9SPSIjRkYwMDAwIj4tbm9kZXMgLWNvbmZpZyAvdXNyL2xvY2FsL3NzbC9saWIvb3BlbnNzbF9zZXJ2LmNuZjwvRk9OVD4iOzwvQj4KKworPFA+PEZPTlQgQ09MT1I9IiMwMDY2MDAiPmxpbmlhIDQxOjwvRk9OVD4KKzxCUj48Qj4kQ0E9Im9wZW5zc2wgY2EgPEk+JFNTTEVBWV9DT05GSUc8L0k+Ijs8L0I+Cis8QlI+bmEKKzxCUj48Qj4kQ0E9Im9wZW5zc2wgY2EgPEZPTlQgQ09MT1I9IiNGRjAwMDAiPi1jb25maWcgL3Vzci9sb2NhbC9zc2wvbGliL29wZW5zc2xfc2Vydi5jbmY8L0ZPTlQ+Ijs8L0I+Cis8QlI+Jm5ic3A7CisKKzxQPk5hdG9taWFzdCB3IHBsaWt1IDxCPi91c3IvbG9jYWwvc3NsL2xpYi9vcGVuc3NsX3NlcnYuY25mIDwvQj5uYWxlenkmbmJzcDsKK3cgc2VrY2ppIDxBIEhSRUY9IiN1c3JfY2VydCI+dXNyX2NlcnQ8L0E+ICJ6YWhhc2hvd2HmIiBsaW5pamvqCis8QlI+PEEgSFJFRj0iI2tsaWVudCI+bnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWw8L0E+Jm5ic3A7IG9yYXogIm9kaGFzaG93YeYiCitsaW5pamvqIDxBIEhSRUY9IiNzZXJ2ZXIiPm5zQ2VydFR5cGUmbmJzcDsmbmJzcDsgPSBzZXJ2ZXI8L0E+IC4gSmW2bGkgdGVnbworbmllIHpyb2Jpc3oga2xpZW50IG5pZSBi6mR6aWUKKzxCUj5wb3ByYXduaWUgcm96cG96bmF3YbMgdHlwdSBjZXJ0eWZpa2F0dS4gQSB0ZXJheiBrb2xlaiBuYSB3eWdlbmVyb3dhbmllCisicmVxdWVzdHUiIHBvc3mzYW5lZ28gemF6d3ljemFqIGRvIENBLgorPEJSPkLqZLFjIHcga2F0YWxvZ3UgL3Vzci9sb2NhbC9zc2wvYmluIHd5a29uYWo6CisKKzxQPjxJPmFkYXM6L3Vzci9sb2NhbC9zc2wvYmluIyAuPEI+L0NBc2Vydi5wbCAtbmV3cmVxPC9CPjwvST4KKzxCUj48ST5Vc2luZyBjb25maWd1cmF0aW9uIGZyb20gL3Vzci9sb2NhbC9zc2wvbGliL29wZW5zc2xfc2Vydi5jbmY8L0k+Cis8QlI+PEk+R2VuZXJhdGluZyBhIDEwMjQgYml0IFJTQSBwcml2YXRlIGtleTwvST4KKzxCUj48ST4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4rKysrKzwvST4KKzxCUj48ST4uLi4uLi4uLi4rKysrKzwvST4KKzxCUj48ST53cml0aW5nIG5ldyBwcml2YXRlIGtleSB0byAnbmV3cmVxLnBlbSc8L0k+Cis8QlI+PEk+LS0tLS08L0k+Cis8QlI+PEk+WW91IGFyZSBhYm91dCB0byBiZSBhc2tlZCB0byBlbnRlciBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgaW5jb3Jwb3JhdGVkPC9JPgorPEJSPjxJPmludG8geW91ciBjZXJ0aWZpY2F0ZSByZXF1ZXN0LjwvST4KKzxCUj48ST5XaGF0IHlvdSBhcmUgYWJvdXQgdG8gZW50ZXIgaXMgd2hhdCBpcyBjYWxsZWQgYSBEaXN0aW5ndWlzaGVkIE5hbWUKK29yIGEgRE4uPC9JPgorPEJSPjxJPlRoZXJlIGFyZSBxdWl0ZSBhIGZldyBmaWVsZHMgYnV0IHlvdSBjYW4gbGVhdmUgc29tZSBibGFuazwvST4KKzxCUj48ST5Gb3Igc29tZSBmaWVsZHMgdGhlcmUgd2lsbCBiZSBhIGRlZmF1bHQgdmFsdWUsPC9JPgorPEJSPjxJPklmIHlvdSBlbnRlciAnLicsIHRoZSBmaWVsZCB3aWxsIGJlIGxlZnQgYmxhbmsuPC9JPgorPEJSPjxJPi0tLS0tPC9JPgorPEJSPjxJPkNvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkgW1BMXTo8L0k+Cis8QlI+PEk+U3RhdGUgaSBQcm93aW5jamEgW0tyYWluYSBCZXpyb2JvdG55Y2ggU3p3YWN6ZWtdOktyYWluYSBsYXRhamFjeWNoCitzY3l6b3J5a293PC9JPgorPEJSPjxJPkxvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KSBbTG9kel06U2llbHBpYTwvST4KKzxCUj48ST5Pcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpIFtJbnN0eXR1dCBCYWRhbiBDemFyb3cgaSBNYWdpaV06QmFyCitTbG9uZWN6a288L0k+Cis8QlI+PEk+T3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikgW0tvbW9ya2EgZC9zIEVnem9yY3l6bW93CitpIE9wZW50YW5dOkt1Zmxvd25pYTwvST4KKzxCUj48ST48Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+Q29tbW9uIE5hbWUgKGVnLCBZT1VSIG5hbWUpIFtdOmFkYXMucGw8L0ZPTlQ+PC9JPgorPEJSPjxJPkVtYWlsIEFkZHJlc3MgW106YWRhc0BhZGFzLnBsPC9JPgorCis8UD48ST5QbGVhc2UgZW50ZXIgdGhlIGZvbGxvd2luZyAnZXh0cmEnIGF0dHJpYnV0ZXM8L0k+Cis8QlI+PEk+dG8gYmUgc2VudCB3aXRoIHlvdXIgY2VydGlmaWNhdGUgcmVxdWVzdDwvST4KKzxCUj48ST5BIGNoYWxsZW5nZSBwYXNzd29yZCBbXTo8L0k+Cis8QlI+PEk+QW4gb3B0aW9uYWwgY29tcGFueSBuYW1lIFtdOjwvST4KKzxCUj48ST5SZXF1ZXN0IChhbmQgcHJpdmF0ZSBrZXkpIGlzIGluIG5ld3JlcS5wZW08L0k+Cis8QlI+PEk+YWRhczovdXNyL2xvY2FsL3NzbC9iaW4jPC9JPgorCis8UD5Qb2xlbSBvIGt083J5bSB3YXJ0byB3c3BvbW5pZeYgamVzdCAiQ29tbW9uIE5hbWUiICh6YXpuYWN6b25lIG5hIGN6ZXJ3b25vKS4KK1cgdHJha2NpZSBnZW5lcm93YW5pYSByZXF1ZXN0dQorPEJSPm5hbGW/eSB3IHR5bSBtaWVqc2N1IHdwaXNh5iA8Qj5GUUROIHNlcndlcmE8L0I+IG5hIGt083J5bSBi6mR6aWUgb24KK3W/eXdhbnkuIFcgcHJ6ZWNpd255bSB3eXBhZGt1IHcgY2h3aWxpCis8QlI+cG+zsWN6ZW5pYSBrbGllbnQgYupkemllIHR3aWVyZHppsywgv2UgY2VydHlmaWthdCBqYWtpbSBwcnplZHN0YXdpYQorc2nqIHNlcndlciBuaWUgbmFsZb95IGRvIG5pZWdvLiBVbmlrbmllbXkgdyB0ZW4KKzxCUj5zcG9z82IgbmllcG90cnplYm5lZ28ga2xpa2FuaWEuIEtvbGVqbrEgY3p5bm5vtmNpsSBqZXN0IHBvZHBpc2FuaWUKK3d5Z2VuZXJvd2FuZWdvIHJlcXVlc3R1LiBXIGthdGFsb2d1Cis8QlI+L3Vzci9sb2NhbC9zc2wvYmluIHd5a29uYWogcG9sZWNlbmllOgorCis8UD48ST5hZGFzOi91c3IvbG9jYWwvc3NsL2JpbiMgLjxCPi9DQXNlcnYucGwgLXNpZ248L0I+PC9JPgorPEJSPjxJPlVzaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAvdXNyL2xvY2FsL3NzbC9saWIvb3BlbnNzbC5jbmY8L0k+Cis8QlI+PEk+PEZPTlQgQ09MT1I9IiMwMDk5MDAiPkVudGVyIFBFTSBwYXNzIHBocmFzZTo8L0ZPTlQ+PC9JPgorPEJSPjxJPkNoZWNrIHRoYXQgdGhlIHJlcXVlc3QgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlPC9JPgorPEJSPjxJPlNpZ25hdHVyZSBvazwvST4KKzxCUj48ST5UaGUgU3ViamVjdHMgRGlzdGluZ3Vpc2hlZCBOYW1lIGlzIGFzIGZvbGxvd3M8L0k+Cis8QlI+PEk+Y291bnRyeU5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzpQUklOVEFCTEU6J1BMJzwvST4KKzxCUj48ST5zdGF0ZU9yUHJvdmluY2VOYW1lJm5ic3A7Jm5ic3A7IDpQUklOVEFCTEU6J0tyYWluYSBsYXRhamFjeWNoIHNjeXpvcnlrb3cnPC9JPgorPEJSPjxJPmxvY2FsaXR5TmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworOlBSSU5UQUJMRTonU2llbHBpYSc8L0k+Cis8QlI+PEk+b3JnYW5pemF0aW9uTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA6UFJJTlRBQkxFOidCYXIgU2xvbmVjemtvJzwvST4KKzxCUj48ST5vcmdhbml6YXRpb25hbFVuaXROYW1lOlBSSU5UQUJMRTonS3VmbG93bmlhJzwvST4KKzxCUj48ST5jb21tb25OYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis6UFJJTlRBQkxFOidhZGFzLnBsJzwvST4KKzxCUj48ST5lbWFpbEFkZHJlc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzpJQTVTVFJJTkc6J2FkYXNAYWRhcy5wbCc8L0k+Cis8QlI+PEk+Q2VydGlmaWNhdGUgaXMgdG8gYmUgY2VydGlmaWVkIHVudGlsIE1hciAyNiAyMTowNjoxMyAyMDAwIEdNVCAoMzY1CitkYXlzKTwvST4KKzxCUj48ST5TaWduIHRoZSBjZXJ0aWZpY2F0ZT8gW3kvbl06eTwvST4KKzxCUj4mbmJzcDsKKworPFA+PEk+MSBvdXQgb2YgMSBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBjZXJ0aWZpZWQsIGNvbW1pdD8gW3kvbl15PC9JPgorPEJSPjxJPldyaXRlIG91dCBkYXRhYmFzZSB3aXRoIDEgbmV3IGVudHJpZXM8L0k+Cis8QlI+PEk+RGF0YSBCYXNlIFVwZGF0ZWQ8L0k+Cis8QlI+PEk+U2lnbmVkIGNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtPC9JPgorPEJSPjxJPmFkYXM6L3Vzci9sb2NhbC9zc2wvYmluIzwvST4KKworPFA+VyB0cmFrY2llIHBvZHBpc3l3YW5pYSBi6mR6aWVzeiBweXRhbnkgbyBoYXOzbyB6YWJlenBpZWN6YWqxY2Uga2x1Y3oKK3ByeXdhdG55IENBICh6YXpuYWN6b25lIG5hIHppZWxvbm8pLgorPEJSPlBvIHRlaiBvcGVyYWNqaSBwb3dpbmllbmW2IHcga2F0YWxvZ3UgL3Vzci9sb2NhbC9zc2wvYmluIG90cnp5bWHmIDIKK3BsaWtpOiA8Qj5uZXdjZXJ0LnBlbTwvQj4gb3JheiA8Qj5uZXdyZXEucGVtPC9CPi4KKzxCUj5aYW5pbSB6YWN6bmllc3ogaWNoIHW/eXdh5iBtdXNpc3ogd3lrb25h5iBqZXN6Y3plIGplZG6xIG9wZXJhY2plLCBhCittaWFub3dpY2llIHqzb3J6eeYgd3N6eXN0a28gZG8ga3VweS4KKzxCUj5XeWtvbnVqZXN6OiA8Qj5jYXQgbmV3Y2VydC5wZW0gbmV3cmVxLnBlbSA+IGh0dHBkcy5wZW08L0I+IGEgbmFzdOpwbmllCitwb2RkYWplc3ogdGFrIHBvd3N0YbN5IGNlcnR5ZmlrYXQgZWR5Y2ppLgorPEJSPk5hbGW/eSB6IHBsaWt1IGh0dHBkcy5wZW0gbmFsZb95IHVzdW6x5iB3c3p5c3RraWUgbmllcG90cnplYm5lIGluZm9ybWFjamUKK3RhayBieSBwb3pvc3RhsyBqZWR5bmllIGNlcnR5ZmlrYXQgb3JhegorPEJSPmtsdWN6IHByeXdhdG55LiBQbyB0ZWogb3BlcmFjamkgcGxpayBodHRwZHMucGVtIHBvd2luaWVuIHd5Z2yxZGHmIG1uaWVqCit3aepjZWogdGFrOgorCis8UD48ST5pc3N1ZXIgOi9DPVBML1NUPUtyYWluYSBCZXpyb2JvdG55Y2ggU3p3YWN6ZWsvTD1Mb2R6L089SW5zdHl0dXQgQmFkYW4KK0N6YXJvdyBpIE1hZ2lpL09VPUtvbW9ya2EgZC9zIEVnem9yY3l6bW93IGkgb3BlbnRhbi9DTj1BZGFtIEhlcm5pay9FbWFpbD1hZGFzQGluZm9jZW50cnVtLmNvbTwvST4KKzxCUj48ST5zdWJqZWN0Oi9DPVBML1NUPUtyYWluYSBsYXRhamFjeWNoIHNjeXpvcnlrb3cvTD1TaWVscGlhL089QmFyIFNsb25lY3prby9PVT1LdWZsb3duaWEvQ049YWRhcy5wbC88L0k+Cis8QlI+PEk+RW1haWw9YWRhc0BhZGFzLnBsPC9JPgorPEJSPjxJPi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLTwvST4KKzxCUj48ST4mbmJzcDtUdSBzsSBtYWdpY3puZSBkYW5lPC9JPgorPEJSPjxJPi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS08L0k+CisKKzxQPjxJPi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS08L0k+Cis8QlI+PEk+Jm5ic3A7IEkgdHUgdGW/IHOxIG1hZ2ljem5lIGRhbmU8L0k+Cis8QlI+PEk+LS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS08L0k+CisKKzxQPlNwcmVwYXJvd2FueSB3IHRlbiBzcG9z82IgcGxpayB1bWllc3pjemFteSB3IGthdGFsb2d1IC91c3IvbG9jYWwvc3NsL2NlcnRzCitpIHpham11amVteSBzaeogZ2VuZXJvd2FuaWVtIGR3dQorPEJSPmNlcnR5ZmlrYXTzdyBrbGllbmNraWNoLgorPEJSPiZuYnNwOworCis8UD48Qj48Rk9OVCBTSVpFPSsxPkdlbmVyb3dhbmllIGkgaW1wb3J0b3dhbmllIGNlcnR5ZmlrYXTzdyBrbGllbmNraWNoCitkbyBOZXRzY2FwZSBDb21tdW5pa2F0b3JhLjwvRk9OVD48L0I+Cis8QlI+Jm5ic3A7Cis8QlI+R2VuZXJhbG5pZSBzsSBkd2llIG1ldG9keSB0d29yemVuaWEgaSBpbXBvcnRvd2FuaWEgY2VydHlmaWthdPN3IGtsaWVuY2tpY2gKK2RvIE5ldHNjYXBhCis8QlI+PEI+U3Bvc/NiIHBpZXJ3c3p5OjwvQj4KKzxCUj5Qcnp5IHBvbW9jeSBrb21lbmR5IDxCPkNBLnBsIC1uZXdyZXE8L0I+IHd5Z2VuZXJ1aiByZXF1ZXN0IGEgbmFzdOpwbmllCitwcnp5IHBvbW9jeSA8Qj5DQS5wbCAtc2lnbjwvQj4gcG9kcGlzeiBnby4KKzxCUj5QeXRhbmllIG8gPEk+Y2hhbGxlbmdlIHBhc3N3b3JkPC9JPiB6aWdub3J1ai4gS29sZWpusSBjenlubm+2Y2mxIGplc3QKK3NjYWxlbmllIGkgcG9kY3p5c3pjemVuaWUgY2VydHlmaWthdHUuCis8QlI+VyBwcnp5cGFka3UgY2VydHlmaWthdHUga2xpZW50YSB3Yb9uZSBqZXN0IHBvZGFuaWUgPEI+cHJhd2lks293ZWdvCithZHJlc3UgZW1haWw8L0I+IDxCPiE8L0I+IEJleiB0ZWdvIG5pZSBi6mR6aWUgbW+/bmEKKzxCUj5wb2RwaXN5d2HmIGkgc3p5ZnJvd2HmIGxpc3Tzdy4mbmJzcDsgU3R383J6IGR3YSBjZXJ0eWZpa2F0eS4gQupksSBvbmUKK3BvdHJ6ZWJuZSBkbyB3eWphtm5pZW5pYSBkemlhs2FuaWEgb3BjamkgLXYgMworPEJSPnByb2dyYW11IHN0dW5uZWwuIFpha7NhZGFtIL9lIHBpZXJ3c3p5IGNlcnR5ZmlrYXQgbmFsZb95IGRvIEphbmEgS293YWxza2llZ28KK2phbkBpYmN6aW0ucGwgemFjaG93YW55IHcKKzxCUj5wbGlrdSBqYW4ucGVtIGEgZHJ1Z2kgZG8gR2Vub3dlZnkgUGlnd3kgcGlnd2FAc2N5em9yeWtpLnBsIHpuYWpkdWqxY3ltCitzaeogdyBwbGlrdSBwaWd3YS5wZW0uJm5ic3A7IFByemVkCis8QlI+emFpbXBvcnRvd2FuaWVtIHBsaWvzdyBkbyBOZXRzY3BlYSBuYWxlv3kgcHJ6ZWtvbndlcnRvd2HmIGplIHogZm9ybWF0dQorUEVNIGRvIFBDS1MxMi4gV3lrb251amUgc2nqIHRvCis8QlI+cHJ6eSBwb21vY3kgd3Nwb21uaWFuZWdvIG5hIHBvY3qxdGt1IHByb2dyYW11IDxCPnBja3MxMjwvQj4uIEFieSBwcnpla29ud2VydG93YeYKK2NlcnR5ZmlrYXQgSmFuIEtvd2Fsc2tpZWdvLAorPEJSPncga2F0YWxvZ3UgdyBrdG9yeW0gem5hamR1amUgc2nqIHBsaWsgamFuLnBlbSB3eWtvbmFqOgorPEJSPiZuYnNwOworCis8UD48Qj5wa2NzMTIgLWV4cG9ydCAtbmFtZSAiSmFuIEtvd2Fsc2tpIGphbkBpYmN6aW0ucGwiIC1pbiBqYW4ucGVtIC1vdXQKK2phbi5wMTIgLWNlcnRmaWxlIC91c3IvbG9jYWwvc3NsL2Jpbi9kZW1vQ0EvY2FjZXJ0LnBlbTwvQj4KKworPFA+KDxGT05UIENPTE9SPSIjOTkwMDAwIj5qZXN0IHRvIGplZG5hIGxpbmlhICEhITwvRk9OVD4pCis8QlI+dyB3eW5pa3UgY3plZ28gcG93c3RhbmllIHBsaWsgamFuLnAxMiBrdPNyeSBtb79uYSB6YWltcG9ydG93YeYgZG8gTmV0c2NhcGVhLgorQmFyZHpvIHdhv26xIG9wY2qxIGplc3QKKzxCUj48Qj48ST4tY2VydGZpbGUgL3Vzci9sb2NhbC9zc2wvYmluL2RlbW9DQS9jYWNlcnQucGVtPC9JPjwvQj4uIEJleiBuaWVqCituaWUgYupkemllIG1vv25hIHcgcHJhd2lks293eSBzcG9z82IgcG9kcGlzeXdh5iBsaXN083cuCis8QlI+UHJ6ZbOxY3puaWsgLWNlcnRmaWxlIHBvd29kdWplIGRvs7FjemVuaWUgcHVibGljem5lZ28gY2VydHlmaWthdHUgQ0EKK2RvIGNlcnR5ZmlrYXR1IGtsaWVudGEgZHpp6mtpIGN6ZW11IE5ldHNjYXBlCis8QlI+amVzdCB3c3RhbmllICJ3eWVrc3RyYWNob3dh5iIgY2VydHlmaWthdCBDQSBpIGRvZGHmIGdvIGRvIHdld27qdHJ6bmVqCitiYXp5IENBLiBXeWtvbmFqIHBvd3m/c3qxIG9wZXJhY2rqIHRha79lCis8QlI+ZGxhIHBpZ3d5LiBTYW1vIHphaW1wb3J0b3dhbmllIGNlcnR5ZmlrYXR1IGplc3QgYmFyZHpvIHByb3N0ZSB3eWtvbnVqZQorc2nqIHRvIGtsaWtharFjIHcgTmV0c2NhcGUgbmEKKworPFA+PEI+U2VjdXJpdHktPiBZb3VycyAtPiBJbXBvcnQgYSBDZXJ0aWZpY2F0ZTwvQj4KKworPFA+UG8gemFpbXBvcnRvd2FuaXUgbmFsZb95IHcgPEI+U2VjdXJpdHkgLT4gU2lnbmVyczwvQj4gemF6bmFjennmIG5hc3oKK0NBIGNlcnR5ZmlrYXQgYSBuYXN06nBuaWUga2xpa26x5iBuYSBwcnp5Y2lza3UgRWRpdAorPEJSPm9yYXogInphY3pla293YeYiIG9wY2plOgorCis8UD48ST5BY2NlcHQgdGhpcyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgZm9yIENlcnRpZnlpbmcgbmV0d29yayBzaXRlczwvST4KKzxCUj48ST5BY2NlcHQgdGhpcyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgZm9yIENlcnRpZnlpbmcgZS1tYWlsIHVzZXJzPC9JPgorCis8UD5PZCB0ZWogcG9yeSBuYXN6IGNlcnR5ZmlrYXQgYupkemllIHRyYWt0b3dhbnkgbmEgcvN3bmkgeiBpbm55bWksIGtvbWVyY3lqbnltaS4KKworPFA+PEI+U3Bvc/NiIGRydWdpOjwvQj4KKzxCUj5Qb2xlZ2Egb24gbmEgd3lnZW5lcm93YW5pdSBpIGltcG9yY2llIGNlcnR5ZmlrYXR1IHBvcHJ6ZXogc3Ryb25lIHd3dy4KK1dyYXogeiBzdHVubmVsZW0gZG9zdGFyY3phbmUgc7EKKzxCUj5wcnprs2Fkb3dlIHN0cm9ueSAoZHdpZSkgaSBza3J5cHR5IChkd2EpLiZuYnNwOyBTa3J5cHR5IG5hbGW/eSByYWN6ZWoKK3RyYWt0b3dh5iBqYWtvIHd6b3J6ZWMgaSBrYb9keSBwb3dpbmllbiBuYXBpc2HmCis8QlI+c3dvamUsIGJhcmR6aWVqIGJlenBpZWN6bmUuIFBpZXJ3c3p5bSBrcm9raWVtIGplc3QgaW1wb3J0IGNlcnR5ZmlrYXR1CitDQS4gVb95d2Egc2nqIGRvIHRlZ28gc3Ryb255IDxCPmltcG9ydENBLmh0bWw8L0I+Cis8QlI+b3JheiBza3J5cHR1IDxCPmltcG9ydENBLnNoPC9CPi4gU2FtIHNrcnlwdCB3eWdssWRhIHRhazoKKworPFA+PEk+IyEvYmluL2Jhc2g8L0k+CisKKzxQPjxJPmVjaG8gIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiPC9JPgorPEJSPjxJPmVjaG88L0k+Cis8QlI+PEk+Y2F0IDxGT05UIENPTE9SPSIjQ0MwMDAwIj4vdmFyL2xpYi9odHRwZHMvY2dpLWJpbi88Qj5jYWNlcnQucGVtPC9CPjwvRk9OVD48L0k+CisKKzxQPmNhY2VydC5wZW0gamVzdCB0byBvY3p5d2m2Y2llIGNlcnR5ZmlrYXQgcHVibGljem55IENBIHpuYWpkdWqxY3kgc2nqCit3IGthdGFsb2d1IC91c3IvbG9jYWwvc3NsL2Jpbi9kZW1vQ0EKKzxCUj5rdPNyeSBuYWxlv3kgcHJ6ZWtvcGlvd2HmIGRvIGthdGFsb2d1IGNnaS1iaW4gc2Vyd2VyYSBodHRwZCBvcmF6IG5hZGHmCittdSBvZHBvd2llZG5pZSBwcmF3YSBkb3N06nB1LgorPEJSPlBvIHphaW1wb3J0b3dhbml1IGNlcnR5ZmlrYXR1IENBIG5hbGW/eSB3IFNlY3VyaXR5LT5TaWduZXJzIHphem5hY3p55gorZG8gamFraWNoIGNlbPN3IGLqZHppZW15IHV6bmF3bGkKKzxCUj5nbyB6YSB3aWFyeWdvZG55LiBEbyBnZW5lcm93YW5pYSBjZXJ0eWZpa2F0dSBrbGllbnRhIHd5a29yenlzdGFteSBwb3pvc3Rhs7EKK3N0cm9uZSBpIHNrcnlwdC4gWmFuaW0gZG8gdGVnbyBkb2pkemllCis8QlI+bmFsZb95ICJkb2tvbmZpZ3Vyb3dh5iIgc2tyeXB0IGkgc3R3b3J6eeYgcG90cnplYm5lIGthdGFsb2dpLiZuYnNwOworVyAvdG1wIChsdWIgdyBpbm55bSBtaWVqc2N1KSBuYWxlenkgc3R3b3J6eeYKKzxCUj5rYXRhbG9nIHNzbCBhIG5hc3TqcG5pZSBwcnpla29waW93YeYgZG8gbmllZ28ga2F0YWxvZyA8Qj4vdXNyL2xvY2FsL2Jpbi9kZW1vQ0E8L0I+CitvcmF6IHBsaWsgPEI+b3BlbnNzbC5jbmY8L0I+LgorPEJSPkpha28gv2Ugc2tyeXB0eSBkb215tmxuaWUgdXJ1Y2hhbWlhbmUgc7EgeiBwcmF3YW1pIHW/eXRrb3duaWthIG5vYm9keQorbmFsZb95IHVjenluaeYgZ28mbmJzcDsgd2xhtmNpY2llbGVtCis8QlI+a2F0YWxvZ3UgL3RtcC9zc2wgaSBjYbNlaiBqZWdvIHphd2FydG+2Y2kuIEtvbGVqbrEgY3p5bm5vtmNpsSBqZXN0Cit3eWdlbmVyb3dhbmllIHBsaWt1IDxCPi5ybmQ8L0I+LiBXIExpbnV4aWUgcm9iaW15IHRvCis8QlI+dGFrOgorPEJSPjxCPmNhdCAvZGV2L3JhbmRvbSA+IC90bXAvc3NsLy5ybmQ8L0I+Cis8QlI+Y3pla2FteSBjaHdpbGvqIHRhayBieSBwbGlrIC5ybmQgbWlhsyB3aWVsa2+25iBva2+zbyAxMDI0IEIgcG8gY3p5bQord7NhtmNpY2llbGVtIHBsaWt1IHJvYmlteSB1v3l0a293bmlrYSBub2JvZHkuCis8QlI+VGVyYXogdHJ6ZWJhIHByemVrb25maWd1cm93YeYgcGxpayAvdG1wL3NzbC9vcGVuc3NsLmNuZgorCis8UD48ST4jPC9JPgorPEJSPjxJPiMgT3BlblNTTCBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZS48L0k+Cis8QlI+PEk+IyBUaGlzIGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW9uIG9mIGNlcnRpZmljYXRlIHJlcXVlc3RzLjwvST4KKzxCUj48ST4jPC9JPgorPEJSPjxJPiZuYnNwOzwvST4KKzxCUj48ST48Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+UkFOREZJTEUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gL3RtcC9zc2wvLnJuZDwvRk9OVD48L0k+Cis8QlI+PEk+I29pZF9maWxlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis9IC90bXAvc3NsLy5vaWQ8L0k+Cis8QlI+PEk+b2lkX3NlY3Rpb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKz0gbmV3X29pZHM8L0k+Cis8QlI+PEk+Jm5ic3A7PC9JPgorPEJSPjxJPlsgbmV3X29pZHMgXTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+IyBXZSBjYW4gYWRkIG5ldyBPSURzIGluIGhlcmUgZm9yIHVzZSBieSAnY2EnIGFuZCAncmVxJy48L0k+Cis8QlI+PEk+IyBBZGQgYSBzaW1wbGUgT0lEIGxpa2UgdGhpczo8L0k+Cis8QlI+PEk+IyB0ZXN0b2lkMT0xLjIuMy40PC9JPgorPEJSPjxJPiMgT3IgdXNlIGNvbmZpZyBmaWxlIHN1YnN0aXR1dGlvbiBsaWtlIHRoaXM6PC9JPgorPEJSPjxJPiMgdGVzdG9pZDI9JHt0ZXN0b2lkMX0uNS42PC9JPjxJPjwvST4KKworPFA+PEk+IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8L0k+Cis8QlI+PEk+WyBjYSBdPC9JPgorPEJSPjxJPmRlZmF1bHRfY2EmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSBDQV9kZWZhdWx0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisjIFRoZSBkZWZhdWx0IGNhIHNlY3Rpb248L0k+PEk+PC9JPgorCis8UD48ST4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzwvST4KKzxCUj48ST5bIENBX2RlZmF1bHQgXTwvST4KKzxCUj48ST4mbmJzcDs8L0k+Cis8QlI+PEk+PEZPTlQgQ09MT1I9IiNGRjAwMDAiPmRpciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSAvdG1wL3NzbC9kZW1vQ0EmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgV2hlcmUgZXZlcnl0aGluZyBpcyBrZXB0PC9GT05UPjwvST4KKzxCUj48ST5jZXJ0cyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPSAkZGlyL2NlcnRzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisjIFdoZXJlIHRoZSBpc3N1ZWQgY2VydHMgYXJlIGtlcHQ8L0k+Cis8QlI+PEk+Y3JsX2RpciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9ICRkaXIvY3JsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisjIFdoZXJlIHRoZSBpc3N1ZWQgY3JsIGFyZSBrZXB0PC9JPgorPEJSPjxJPmRhdGFiYXNlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gJGRpci9pbmRleC50eHQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgZGF0YWJhc2UgaW5kZXggZmlsZS48L0k+Cis8QlI+PEk+bmV3X2NlcnRzX2RpciZuYnNwOyZuYnNwOyA9ICRkaXIvbmV3Y2VydHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyMgZGVmYXVsdCBwbGFjZSBmb3IgbmV3IGNlcnRzLjwvST4KKzxCUj4mbmJzcDsKKzxCUj5OYWxlv3kgem1pZW5p5iBvcGNqZSB6YXpuYWN6b25lIG5hIGN6ZXJ3b25vLiBPc3RhdG5psSBjenlubm+2Y2mxIGplc3QKK3NwcmF3ZHplbmllIGkgZXdlbnR1YWxuZSBwb3ByYXdpZW5pZQorPEJSPnN0cm9ueSBjYS5odG1sIGkgc2tyeXB0dSBjYS5wbC4gVyBwbGlrdSBjYS5odG1sIG5hbGV6eSB3cGlzYeYgcG9wcmF3brEKK25henfqIHNlcndlcmEgbmEga3TzcnltIHpuYWpkdWplIHNp6gorPEJSPnNrcnlwdCBjYS5wbCBjenlsaSBsaW5pamvqIDxCPiZsdDtGT1JNIEFDVElPTj0iPEZPTlQgQ09MT1I9IiNGRjAwMDAiPmh0dHA6Ly9sb2NhbGhvc3QvY2dpLWJpbi9jYS5wbDwvRk9OVD4iCitNRVRIT0Q9UE9TVD48L0I+LiBXIGNhLnBsCis8QlI+bmFsZb95IHNrb250cm9sb3dh5iBwb3ByYXdub7bmIHBvZGFueWNoILZjaWW/ZWsgb3JheiB3cGlzYeYgaGFzs28gamFraW0KK3phYmV6cGllY3pvbnkgamVzdCBrbHVjeiBwcnl3YXRueSBDQQorPEJSPih6bWllbm5hICRjZXJ0cGFzcyB6YXpuYWN6b25hIG5hIGN6ZXJ3b25vKS4KKzxCUj4mbmJzcDsKKworPFA+PEk+IyEvdXNyL2Jpbi9wZXJsPC9JPgorPEJSPjxJPiNjYS5wbDwvST48ST48L0k+CisKKzxQPjxJPiRjb25maWcmbmJzcDsmbmJzcDsgPSAiL3RtcC9zc2wvb3BlbnNzbC5jbmYiOzwvST4KKzxCUj48ST4kY2FwYXRoJm5ic3A7Jm5ic3A7ID0gIi91c3IvbG9jYWwvc3NsL2Jpbi9vcGVuc3NsIGNhIjs8L0k+Cis8QlI+PEk+PEZPTlQgQ09MT1I9IiNGRjAwMDAiPiRjZXJ0cGFzcyA9ICJ0dV9qZXN0X2hhc2xvIjs8L0ZPTlQ+PC9JPgorPEJSPjxJPiR0ZW1wY2EmbmJzcDsmbmJzcDsgPSAiL3RtcC9zc2wvY2xpIi5yYW5kIDEwMDAwOzwvST4KKzxCUj48ST4kdGVtcG91dCZuYnNwOyA9ICIvdG1wL3NzbC9jZXJ0dG1wIi5yYW5kIDEwMDAwOzwvST4KKzxCUj48ST4kY2FvdXQmbmJzcDsmbmJzcDsmbmJzcDsgPSAiL3RtcC9zc2wvY2VydHd5bmlrLnR4dCI7PC9JPgorPEJSPjxJPiRDQWNlcnQmbmJzcDsmbmJzcDsgPSAiL3RtcC9zc2wvZGVtb0NBL2NhY2VydC5wZW0iOzwvST4KKzxCUj48ST4uLi48L0k+Cis8QlI+Jm5ic3A7CisKKzxQPlBvIHVtaWVzemN6ZW5pdSB0YWsgcHJ6eWdvdG93YW55Y2ggc3Ryb24gaSBza3J5cHTzdyBuYSBzZXJ3ZXJ6ZSBi6mR6aWUKK21vv25hIGdlbmVyb3dh5iBjZXJ0eWZpa2F0eSBkbGEga2xpZW5083cuCisKKzxQPjxCPldhZHkgaSB6YWxldHkgb2J5ZHd1IHNwb3NvYvN3IGdlbmVyb3dhbmlhIGkgaW5zdGFsb3dhbmlhIGNlcnR5ZmlrYXTzdy48L0I+CisKKzxQPjxBIE5BTUU9InVzdXdhbmllIj48L0E+SmFrIHd5bmlrYSB6IHBvd3m/c3plZ28gb3Bpc3UgYmV6cGllY3puaWVqc3p5bQoraSBwb2xlY2FueW0gcHJ6ZXplIG1uaWUgamVzdCBzcG9z82IgcGllcndzenkuIEplZ28gcG93Yb9usSB3YWSxCis8QlI+amVzdCZuYnNwOyBmYWt0IL9lIGN6s293aWVrIGdlbmVydWqxY3kgY2VydHlmaWthdHkgem5hamR1amUgc2nqIHcgcG9zaWFkYW5pdQora2x1Y3phIHByeXdhdG5lZ28gb3NvYnkgd3lzdOpwdWqxY2VqIG8KKzxCUj5jZXJ0eWZpa2F0LiZuYnNwOyA8Rk9OVCBDT0xPUj0iI0ZGMDAwMCI+T2N6eXdptmNpZSB1Y3pjaXd5IENBIHBvd2luaWVuCitza2Fzb3dh5iBnbywgemFyYXogcG8gdXR3b3J6ZW5pdTwvRk9OVD4uIFcgdGFraW0gd3lwYWRrdSBtZXRvZGEgcGllcndzemEKKzxCUj5zcGWzbmlhJm5ic3A7IHdzemVsa2llIHd5bW9naS4gU3Bvc/NiIGRydWdpIHBy82N6IHNhbXljaCB3YWQgbWEgamVkbrEKK2FjeiBvZ3JvbW6xIHphbGV06i4gTWlhbm93aWNpZSBrbHVjeiBwcnl3YXRueQorPEJSPmtsaWVudGEmbmJzcDsgbmlnZHkgbmllIG9wdXN6Y3phIGplZ28ga29tcHV0ZXJhLiBEbyB3YWQgbW+/bmEgemFsaWN6eeYKK2Zha3Qgv2UgaGFzs28gemFiZXpwaWVjemFqsWNlIGtsdWN6IHByeXdhdG55IENBCis8QlI+em5hamR1amUgc2nqIG5hIHNlcndlcnplIGkgdG8gdyBkb2RhdGt1IHcgv2FkZW4gc3Bvc/NiIG5pZSBjaHJvbmlvbmUuJm5ic3A7CitLb2xlam6xIHdhZLEgamVzdCBnZW5lcm93YW5pZSBrb21wbGV0bnljaAorPEJSPmNlcnR5ZmlrYXTzdyBwcnpleiBzdHJvbmUgd3d3LCBjbyBtb79lIGdyb3pp5iB3eWtyYWR6ZW5pZW0ga2x1Y3phIHByeXdhdG5lZ28uCitSb3p3abF6YW5pZW0gbW+/ZSBieeYgc2uzYWRvd2FuaWUKKzxCUj5yZXF1ZXN083cgdyBiYXppZSBkYW55Y2ggYSBuYXN0cG5pZSBy6mN6bmEgaWNoIG9icvNia2EgcHJ6ZXogYWRtaW5pc3RyYXRvcmEuCitSZWFzdW11arFjLCBzcG9z82IgZHJ1Z2kgbmFsZb95Cis8QlI+cG90cmFrdG93YeYgamFrbyBkZW1vbnN0cmFjamUgbWV0b2R5IGt083KxIG1vv25hIHByemXmd2ljennmIHByemVkCituYXBpc2FuaWVtIHBvcnqxZG55Y2ggc2tyeXB083cuCis8QlI+Jm5ic3A7PEI+PEZPTlQgU0laRT0rMT48L0ZPTlQ+PC9CPgorCis8UD48Qj48Rk9OVCBTSVpFPSsxPlRhamVtbmljenkgcHJ6ZbOxY3puaWsgLXYgMyB3IHN0dW5uZWx1PC9GT05UPjwvQj4KKworPFA+U3R1bm5lbCBwb3NpYWRhIHRyenkgdHJ5Ynkgd2VyeWZpa2Fjamkga2xpZW50YS4KKzxCUj5QaWVyd3N6eSBvcGNqYSA8Qj48Rk9OVCBTSVpFPSsxPi12IDE8L0ZPTlQ+PC9CPiBvem5hY3phIL9lIG5hbGW/eSBzcHLzYm93YeYKK3p3ZXJ5Zmlrb3dh5iBvc29i6iBuYXdpsXp1arFjsSBwb7OxY3plbmllIGN6eWxpIHV6eXNrYeYgamVqCis8QlI+Y2VyeWZpa2F0LiBKZbZsaSBvcGVyYWNqYSB0YSBzaeogbmllIHBvd2llZHppZSwgbWltbyB3c3p5c3RrbyBkb3N06nAKK2RvIHNlcndlcmEgYupkemllIHphcGV3bmlvbnkuCis8QlI+UHJ6ZbOxY3puaWsgPEI+PEZPTlQgU0laRT0rMT4tdiAyPC9GT05UPjwvQj4gbmFrYXp1amUgc3R1bm5lbG93aSB6d2VyeWZpa293YeYKK2tsaWVudGEuIEpltmxpIHW/eXRrb3duaWsgbmllIHBvc2lhZGEgY2VydHlmaWthdHUgbHViIGNlcnR5ZmlrYXQKKzxCUj5qZXN0IG5pZXdhv255LCBuaWV3s2G2Y2l3eSBjenkgdGW/IG5pZSBwb3NpYWRhbXkgY2VydHlmaWthdHUgQ0Ega3TzcnltCitwb2RwaXNhbnkgamVzdCBjZXJ0eWZpa2F0IGtsaWVudGEKKzxCUj48Rk9OVCBTSVpFPS0yPihzdHJhc3pueSBqZXN0IHRlbiBq6np5ayBwb2xza2kpPC9GT05UPiBuYXdpsXphbmllIHBvs7FjemVuaWEKK3ogc2Vyd2VyZW0gYupkemllIG5pZW1vv2xpd2UuIEkgd3Jlc3pjaWUgb3BjamEgPEI+PEZPTlQgU0laRT0rMT4tdiAzPC9GT05UPjwvQj4KK25ha2F6dWqxY2EKKzxCUj5zdHVubmVsb3dpIHp3ZXJ5Zmlrb3dh5iBrbGllbnRhIGEgdGFrv2UgcG9zenVrYeYgamVnbyBjZXJ0eWZpa2F0dSB3CituYXN6ZWogbG9rYWxuZWogYmF6aWUuCis8QlI+RHppZWtpIG9wY2ppIC12IDMgbW+/ZW15IHN0d29yennmIGJhcmR6byBzZWxla3R5d255IGRvc3TqcCBkbyB1c7N1Zworb2Zlcm93YW55Y2ggcHJ6ZXogc2Vyd2VyLCB1bmlrYWqxYyBnZW5lcm93YW5pYSBkdb95Y2ggaWxvtmNpIGNlcnR5ZmlrYXTzdy4KKzxGT05UIENPTE9SPSIjRkYwMDAwIj5Vd2FnYSBvZ/NsbmE6IGRvIHBvcHJhd25laiB3ZXJ5ZmlrYWNqaSBrbGllbnRhIEtPTklFQ1pORQoramVzdCBwb3NpYWRhbmllIGNlcnR5ZmlrYXR1IENBIGt083J5bSBwb2RwaXNhbnkmbmJzcDsgamVzdCBzcHJhd2R6YW55IGNlcnR5ZmlrYXQ8L0ZPTlQ+LgorQmV6IHRlZ28gc3R1bm5lbCBuaWUgamVzdCB3c3RhbmllIHByemVwcm93YWR6aeYgcG9wcmF3bmVqIGF1dG9yeXphY2ppIGtsaWVudGEuCitQcvNiYSB0YWthIGtv8WN6eSBzaeogYrPqZGFtaSAiPEI+VkVSSUZZIEVSUk9SOiBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZQorZm9yIC4uLi4uPC9CPiIgb3JheiAiPEI+U1NMX2FjY2VwdDogZXJyb3I6MTQwODkwQjE6U1NMIHJvdXRpbmVzOjwvQj4gPEI+U1NMM19HRVRfQ0xJRU5UX0NFUlRJRklDQVRFOm5vCitjZXJ0aWZpY2F0ZSByZXR1cm5lZDwvQj4iLiBBIHRlcmF6IHByenlrs2FkIHByYWt0eWN6bnk6IGNoY2VteSBhYnkgZG8gaHR0cHMKK2LqZLFjeW0gbmEgPEI+cG9yY2llIDQ0NDwvQj4gbWlhs3kgZG9zdOpwIHdzenlzdGtpZSBvc29ieSBtYWqxY2UgY2VydHlmaWthdHkKK25hdG9taWFzdAorPEJSPmRvIGRvIGh0dHBzIG5hIDxCPnBvcmNpZSA0NDU8L0I+IGRvc3TqcCBtaWGzIHR5bGtvIEphbiBLb3dhbHNraS4gUGllcndzerEKK2N6eW5ub7ZjabEgamFrsSBuYWxlv3kgd3lrb25h5iBqZXN0IHNrb3Bpb3dhbmllCis8QlI+Y2VydHlmaWthdHUgQ0EgZG8ga2F0YWxvZ3UgPEI+L3Vzci9sb2NhbC9zc2wvY2VydHM8L0I+IChkZWZhdWx0IGNlcnQKK2FyZWEpLCBuYXN06nBuaWUgdyB0eW0ga2F0YWxvZ3UgbmFsZb95IHV0d29yennmCis8QlI+cG9ka2F0YWxvZyBvJm5ic3A7IG5hendpZSA8Qj5teXRydXN0ZWQ8L0I+LCBwb2N6eW0gc2tvcGlvd2HmIGRvIG5pZWdvCitjZXJ0eWZpa2F0IGtsaWVudGEgY3p5bGkgamFuLnBlbS4gPEEgSFJFRj0iI3VzdXdhbmllIj48Qj5Vd2FnYTwvQj46IHogcGxpa3UKK2phbi5wZW08L0E+Cis8QlI+PEEgSFJFRj0iI3VzdXdhbmllIj48Qj5NVVNJU1o8L0I+IHVzdW6x5iBrbHVjeiBwcnl3YXRueTwvQT4gISEhIEN6eWxpJm5ic3A7Cit0byBjbyBzaeogem5hamR1amUgbWnqZHp5CisKKzxQPi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KKzxCUj4uLi4uLi4uCis8QlI+LS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKworPFA+s7Fjem5pZSB6IHBvd3m/c3p5bWkgbGluaWFtaS4gTmFzdOpwbmllIHcga2F0YWxvZ2FjaCA8Qj4vdXNyL2xvY2FsL3NzbC9jZXJ0czwvQj4KK2kgPEI+L3Vzci9sb2NhbC9zc2wvY2VydHMvbXl0cnVzdGVkPC9CPiBuYWxlv3kKKzxCUj53eWtvbmHmIHBvbGVjZW5pZQorPEJSPjxCPi91c3IvbG9jYWwvc3NsL2Jpbi9jX3JlaGFzaCAuLzwvQj4KKzxCUj5UZXJheiBrb2xlaiBuYSB1cnVjaG9taWVuaWUgc3R1bm5lbGE6Cis8QlI+PEI+c3R1bm5lbCAtZCA0NDQgLXIgODAgLXYgMjwvQj4KKzxCUj5vcmF6Cis8QlI+PEI+c3R1bm5lbCAtZCA0NDUgLXIgODAgLXYgMzwvQj4KKzxCUj5OZXRzY2FwZW0gbmFsZb95IHBvs7FjennmIHNpZSB6IGh0dHBzOi8vbG9jYWxob3N0OjQ0NC8gYSBwbyBweXRhbml1CitvIGNlcnR5ZmlrYXQgcHJ6ZWRzdGF3aeYgY2VydHlmaWthdCBuYWxlv7FjeQorPEJSPmRvIHBpZ3d5LiBEb3N06nAgZG8gc2Vyd2VyYSBi6mR6aWUgemFwZXduaW9ueS4gQ3p5bm5vtmMgdOogbmFsZb95IHBvd3Tzcnp55gorcHJ6ZWRzdGF3aWFqsWMgc2nqIHphIGRydWdpbSByYXplbQorPEJSPmNlcnR5ZmlrYXRlbSBKYW5hIEtvd2Fsc2tpZWdvLiBQb7OxY3plbmllIHRha79lIGLqZHppZSB6cmVhbGl6b3dhbmUuJm5ic3A7CitXIHByenlwYWRrdSBodHRwczovL2xvY2FsaG9zdDo0NDUvIHdlarZjaWUKKzxCUj5uYSBzZXJ3ZXIgYupkemllIHphcGV3bmlvbmUgdHlsa28gcG8gd3lsZWdpdHltb3dhbml1IHNp6iBjZXJ0eWZpa2F0ZW0KK0phbmEgS293YWxza2llZ28uIFBvIGthemRlaiB6bWlhbmllIHcKKzxCUj5rYXRhbG9ndSAvdXNyL2xvY2FsL3NzbC9jZXJ0cy9teXRydXN0ZWQgbmFsZb95IHd5a29uYeYga29tZW5k6iBjX3JlaGFzaAorLi8gaSB6cmVzdGFydG93YeYgc3R1bm5lbGEuCis8QlI+Jm5ic3A7Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2Mvc3R1bm5lbC44LmluIGIvZG9jL3N0dW5uZWwuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFkZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0dW5uZWwuOC5pbgpAQCAtMCwwICsxLDEyNTMgQEAKKy5cIiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBQb2Q6Ok1hbiAyLjI4IChQb2Q6OlNpbXBsZSAzLjI4KQorLlwiCisuXCIgU3RhbmRhcmQgcHJlYW1ibGU6CisuXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisuZGUgU3AgXCIgVmVydGljYWwgc3BhY2UgKHdoZW4gd2UgY2FuJ3QgdXNlIC5QUCkKKy5pZiB0IC5zcCAuNXYKKy5pZiBuIC5zcAorLi4KKy5kZSBWYiBcIiBCZWdpbiB2ZXJiYXRpbSB0ZXh0CisuZnQgQ1cKKy5uZgorLm5lIFxcJDEKKy4uCisuZGUgVmUgXCIgRW5kIHZlcmJhdGltIHRleHQKKy5mdCBSCisuZmkKKy4uCisuXCIgU2V0IHVwIHNvbWUgY2hhcmFjdGVyIHRyYW5zbGF0aW9ucyBhbmQgcHJlZGVmaW5lZCBzdHJpbmdzLiAgXCooLS0gd2lsbAorLlwiIGdpdmUgYW4gdW5icmVha2FibGUgZGFzaCwgXCooUEkgd2lsbCBnaXZlIHBpLCBcKihMIiB3aWxsIGdpdmUgYSBsZWZ0CisuXCIgZG91YmxlIHF1b3RlLCBhbmQgXCooUiIgd2lsbCBnaXZlIGEgcmlnaHQgZG91YmxlIHF1b3RlLiAgXCooQysgd2lsbAorLlwiIGdpdmUgYSBuaWNlciBDKysuICBDYXBpdGFsIG9tZWdhIGlzIHVzZWQgdG8gZG8gdW5icmVha2FibGUgZGFzaGVzIGFuZAorLlwiIHRoZXJlZm9yZSB3b24ndCBiZSBhdmFpbGFibGUuICBcKihDYCBhbmQgXCooQycgZXhwYW5kIHRvIGAnIGluIG5yb2ZmLAorLlwiIG5vdGhpbmcgaW4gdHJvZmYsIGZvciB1c2Ugd2l0aCBDPD4uCisudHIgXCgqVy0KKy5kcyBDKyBDXHYnLS4xdidcaCctMXAnXHMtMitcaCctMXAnK1xzMFx2Jy4xdidcaCctMXAnCisuaWUgbiBce1wKKy4gICAgZHMgLS0gXCgqVy0KKy4gICAgZHMgUEkgcGkKKy4gICAgaWYgKFxuKC5IPTR1KSYoMW09MjR1KSAuZHMgLS0gXCgqV1xoJy0xMnUnXCgqV1xoJy0xMnUnLVwiIGRpYWJsbyAxMCBwaXRjaAorLiAgICBpZiAoXG4oLkg9NHUpJigxbT0yMHUpIC5kcyAtLSBcKCpXXGgnLTEydSdcKCpXXGgnLTh1Jy1cIiAgZGlhYmxvIDEyIHBpdGNoCisuICAgIGRzIEwiICIiCisuICAgIGRzIFIiICIiCisuICAgIGRzIENgICIiCisuICAgIGRzIEMnICIiCisnYnJcfQorLmVsXHtcCisuICAgIGRzIC0tIFx8XChlbVx8CisuICAgIGRzIFBJIFwoKnAKKy4gICAgZHMgTCIgYGAKKy4gICAgZHMgUiIgJycKKy4gICAgZHMgQ2AKKy4gICAgZHMgQycKKydiclx9CisuXCIKKy5cIiBFc2NhcGUgc2luZ2xlIHF1b3RlcyBpbiBsaXRlcmFsIHN0cmluZ3MgZnJvbSBncm9mZidzIFVuaWNvZGUgdHJhbnNmb3JtLgorLmllIFxuKC5nIC5kcyBBcSBcKGFxCisuZWwgICAgICAgLmRzIEFxICcKKy5cIgorLlwiIElmIHRoZSBGIHJlZ2lzdGVyIGlzIHR1cm5lZCBvbiwgd2UnbGwgZ2VuZXJhdGUgaW5kZXggZW50cmllcyBvbiBzdGRlcnIgZm9yCisuXCIgdGl0bGVzICguVEgpLCBoZWFkZXJzICguU0gpLCBzdWJzZWN0aW9ucyAoLlNTKSwgaXRlbXMgKC5JcCksIGFuZCBpbmRleAorLlwiIGVudHJpZXMgbWFya2VkIHdpdGggWDw+IGluIFBPRC4gIE9mIGNvdXJzZSwgeW91J2xsIGhhdmUgdG8gcHJvY2VzcyB0aGUKKy5cIiBvdXRwdXQgeW91cnNlbGYgaW4gc29tZSBtZWFuaW5nZnVsIGZhc2hpb24uCisuXCIKKy5cIiBBdm9pZCB3YXJuaW5nIGZyb20gZ3JvZmYgYWJvdXQgdW5kZWZpbmVkIHJlZ2lzdGVyICdGJy4KKy5kZSBJWAorLi4KKy5uciByRiAwCisuaWYgXG4oLmcgLmlmIHJGIC5uciByRiAxCisuaWYgKFxuKHJGOihcbiguZz09MCkpIFx7CisuICAgIGlmIFxuRiBceworLiAgICAgICAgZGUgSVgKKy4gICAgICAgIHRtIEluZGV4OlxcJDFcdFxcbiVcdCJcXCQyIgorLi4KKy4gICAgICAgIGlmICFcbkY9PTIgXHsKKy4gICAgICAgICAgICBuciAlIDAKKy4gICAgICAgICAgICBuciBGIDIKKy4gICAgICAgIFx9CisuICAgIFx9CisuXH0KKy5yciByRgorLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLlwiCisuSVggVGl0bGUgInN0dW5uZWwgOCIKKy5USCBzdHVubmVsIDggIjIwMTUuMDcuMjciICI1LjIyIiAic3R1bm5lbCBUTFMgUHJveHkiCisuXCIgRm9yIG5yb2ZmLCB0dXJuIG9mZiBqdXN0aWZpY2F0aW9uLiAgQWx3YXlzIHR1cm4gb2ZmIGh5cGhlbmF0aW9uOyBpdCBtYWtlcworLlwiIHdheSB0b28gbWFueSBtaXN0YWtlcyBpbiB0ZWNobmljYWwgZG9jdW1lbnRzLgorLmlmIG4gLmFkIGwKKy5uaAorLlNIICJOQU1FIgorc3R1bm5lbCBcLSBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZFwtYmFsYW5jaW5nIHByb3h5CisuU0ggIlNZTk9QU0lTIgorLklYIEhlYWRlciAiU1lOT1BTSVMiCisuSVAgIlxmQlVuaXg6XGZSIiA0CisuSVggSXRlbSAiVW5peDoiCitcJlxmQnN0dW5uZWxcZlIgW1xzLTFGSUxFXHMwXSB8IFwtZmTCoE4gfCBcLWhlbHAgfCBcLXZlcnNpb24gfCBcLXNvY2tldHMgfCBcLW9wdGlvbnMKKy5JUCAiXGZCXHMtMVdJTjMyOlxzMFxmUiIgNAorLklYIEl0ZW0gIldJTjMyOiIKK1wmXGZCc3R1bm5lbFxmUiBbIFsgXC1pbnN0YWxsIHwgXC11bmluc3RhbGwgfCBcLXN0YXJ0IHwgXC1zdG9wIHwKKyAgICBcLXJlbG9hZCB8IFwtcmVvcGVuIHwgXC1leGl0IF0gW1wtcXVpZXRdIFtccy0xRklMRVxzMF0gXSB8CisgICAgXC1oZWxwIHwgXC12ZXJzaW9uIHwgXC1zb2NrZXRzIHwgXC1vcHRpb25zCisuU0ggIkRFU0NSSVBUSU9OIgorLklYIEhlYWRlciAiREVTQ1JJUFRJT04iCitUaGUgXGZCc3R1bm5lbFxmUiBwcm9ncmFtIGlzIGRlc2lnbmVkIHRvIHdvcmsgYXMgXGZJXHMtMVNTTFxzMFxmUiBlbmNyeXB0aW9uIHdyYXBwZXIgCitiZXR3ZWVuIHJlbW90ZSBjbGllbnRzIGFuZCBsb2NhbCAoXGZJaW5ldGRcZlJcLXN0YXJ0YWJsZSkgb3IgcmVtb3RlCitzZXJ2ZXJzLiBUaGUgY29uY2VwdCBpcyB0aGF0IGhhdmluZyBub24tU1NMIGF3YXJlIGRhZW1vbnMgcnVubmluZyBvbgoreW91ciBzeXN0ZW0geW91IGNhbiBlYXNpbHkgc2V0IHRoZW0gdXAgdG8gY29tbXVuaWNhdGUgd2l0aCBjbGllbnRzIG92ZXIKK3NlY3VyZSBccy0xU1NMXHMwIGNoYW5uZWxzLgorLlBQCitcJlxmQnN0dW5uZWxcZlIgY2FuIGJlIHVzZWQgdG8gYWRkIFxzLTFTU0xcczAgZnVuY3Rpb25hbGl0eSB0byBjb21tb25seSB1c2VkIFxmSUluZXRkXGZSCitkYWVtb25zIGxpa2UgXHMtMVBPUFwtMiwgUE9QXC0zLFxzMCBhbmQgXHMtMUlNQVBcczAgc2VydmVycywgdG8gc3RhbmRhbG9uZSBkYWVtb25zIGxpa2UKK1wmXHMtMU5OVFAsIFNNVFBcczAgYW5kIFxzLTFIVFRQLFxzMCBhbmQgaW4gdHVubmVsaW5nIFxzLTFQUFBcczAgb3ZlciBuZXR3b3JrIHNvY2tldHMgd2l0aG91dAorY2hhbmdlcyB0byB0aGUgc291cmNlIGNvZGUuCisuUFAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKK0VyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorLlNIICJPUFRJT05TIgorLklYIEhlYWRlciAiT1BUSU9OUyIKKy5JUCAiXGZCXHMtMUZJTEVcczBcZlIiIDQKKy5JWCBJdGVtICJGSUxFIgorVXNlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUKKy5JUCAiXGZCXC1mZCBOXGZSIChVbml4IG9ubHkpIiA0CisuSVggSXRlbSAiLWZkIE4gKFVuaXggb25seSkiCitSZWFkIHRoZSBjb25maWcgZmlsZSBmcm9tIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IKKy5JUCAiXGZCXC1oZWxwXGZSIiA0CisuSVggSXRlbSAiLWhlbHAiCitQcmludCBcZkJzdHVubmVsXGZSIGhlbHAgbWVudQorLklQICJcZkJcLXZlcnNpb25cZlIiIDQKKy5JWCBJdGVtICItdmVyc2lvbiIKK1ByaW50IFxmQnN0dW5uZWxcZlIgdmVyc2lvbiBhbmQgY29tcGlsZSB0aW1lIGRlZmF1bHRzCisuSVAgIlxmQlwtc29ja2V0c1xmUiIgNAorLklYIEl0ZW0gIi1zb2NrZXRzIgorUHJpbnQgZGVmYXVsdCBzb2NrZXQgb3B0aW9ucworLklQICJcZkJcLW9wdGlvbnNcZlIiIDQKKy5JWCBJdGVtICItb3B0aW9ucyIKK1ByaW50IHN1cHBvcnRlZCBccy0xU1NMXHMwIG9wdGlvbnMKKy5JUCAiXGZCXC1pbnN0YWxsXGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItaW5zdGFsbCAoV2luZG93cyBOVCBhbmQgbGF0ZXIgb25seSkiCitJbnN0YWxsIFxzLTFOVFxzMCBTZXJ2aWNlCisuSVAgIlxmQlwtdW5pbnN0YWxsXGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItdW5pbnN0YWxsIChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KSIKK1VuaW5zdGFsbCBccy0xTlRcczAgU2VydmljZQorLklQICJcZkJcLXN0YXJ0XGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItc3RhcnQgKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpIgorU3RhcnQgXHMtMU5UXHMwIFNlcnZpY2UKKy5JUCAiXGZCXC1zdG9wXGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItc3RvcCAoV2luZG93cyBOVCBhbmQgbGF0ZXIgb25seSkiCitTdG9wIFxzLTFOVFxzMCBTZXJ2aWNlCisuSVAgIlxmQlwtcmVsb2FkXGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItcmVsb2FkIChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KSIKK1JlbG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9mIHRoZSBydW5uaW5nIFxzLTFOVFxzMCBTZXJ2aWNlCisuSVAgIlxmQlwtcmVvcGVuXGZSIChXaW5kb3dzIFxzLTFOVFxzMCBhbmQgbGF0ZXIgb25seSkiIDQKKy5JWCBJdGVtICItcmVvcGVuIChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KSIKK1Jlb3BlbiB0aGUgbG9nIGZpbGUgb2YgdGhlIHJ1bm5pbmcgXHMtMU5UXHMwIFNlcnZpY2UKKy5JUCAiXGZCXC1leGl0XGZSIChXaW4zMiBvbmx5KSIgNAorLklYIEl0ZW0gIi1leGl0IChXaW4zMiBvbmx5KSIKK0V4aXQgYW4gYWxyZWFkeSBzdGFydGVkIHN0dW5uZWwKKy5JUCAiXGZCXC1xdWlldFxmUiAoV2luMzIgb25seSkiIDQKKy5JWCBJdGVtICItcXVpZXQgKFdpbjMyIG9ubHkpIgorRG9uJ3QgZGlzcGxheSBhbnkgbWVzc2FnZSBib3hlcworLlNIICJDT05GSUdVUkFUSU9OIEZJTEUiCisuSVggSGVhZGVyICJDT05GSUdVUkFUSU9OIEZJTEUiCitFYWNoIGxpbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUgZWl0aGVyOgorLklQICJcKGJ1IiA0CitBbiBlbXB0eSBsaW5lIChpZ25vcmVkKS4KKy5JUCAiXChidSIgNAorQSBjb21tZW50IHN0YXJ0aW5nIHdpdGggJzsnIChpZ25vcmVkKS4KKy5JUCAiXChidSIgNAorQW4gJ29wdGlvbl9uYW1lID0gb3B0aW9uX3ZhbHVlJyBwYWlyLgorLklQICJcKGJ1IiA0CitcJidbc2VydmljZV9uYW1lXScgaW5kaWNhdGluZyBhIHN0YXJ0IG9mIGEgc2VydmljZSBkZWZpbml0aW9uLgorLlBQCitBbiBhZGRyZXNzIHBhcmFtZXRlciBvZiBhbiBvcHRpb24gbWF5IGJlIGVpdGhlcjoKKy5JUCAiXChidSIgNAorQSBwb3J0IG51bWJlci4KKy5JUCAiXChidSIgNAorQSBjb2xvbi1zZXBhcmF0ZWQgcGFpciBvZiBccy0xSVBcczAgYWRkcmVzcyAoZWl0aGVyIElQdjQsIElQdjYsIG9yIGRvbWFpbiBuYW1lKSBhbmQgcG9ydCBudW1iZXIuCisuSVAgIlwoYnUiIDQKK0EgVW5peCBzb2NrZXQgcGF0aCAoVW5peCBvbmx5KS4KKy5TUyAiXHMtMUdMT0JBTCBPUFRJT05TXHMwIgorLklYIFN1YnNlY3Rpb24gIkdMT0JBTCBPUFRJT05TIgorLklQICJcZkJjaHJvb3RcZlIgPSBccy0xRElSRUNUT1JZIFxzMChVbml4IG9ubHkpIiA0CisuSVggSXRlbSAiY2hyb290ID0gRElSRUNUT1JZIChVbml4IG9ubHkpIgorZGlyZWN0b3J5IHRvIGNocm9vdCBcZkJzdHVubmVsXGZSIHByb2Nlc3MKKy5TcAorXCZcZkJjaHJvb3RcZlIga2VlcHMgXGZCc3R1bm5lbFxmUiBpbiBhIGNocm9vdGVkIGphaWwuICBcZklDQXBhdGhcZlIsIFxmSUNSTHBhdGhcZlIsIFxmSXBpZFxmUgorYW5kIFxmSWV4ZWNcZlIgYXJlIGxvY2F0ZWQgaW5zaWRlIHRoZSBqYWlsIGFuZCB0aGUgcGF0Y2hlcyBoYXZlIHRvIGJlIHJlbGF0aXZlCit0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCB3aXRoIFxmQmNocm9vdFxmUi4KKy5TcAorU2V2ZXJhbCBmdW5jdGlvbnMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYWxzbyBuZWVkIHRoZWlyIGZpbGVzIHRvIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBjaHJvb3QgamFpbCwgZS5nLjoKKy5SUyA0CisuSVAgIlwoYnUiIDQKK0RlbGF5ZWQgcmVzb2x2ZXIgdHlwaWNhbGx5IG5lZWRzIC9ldGMvbnNzd2l0Y2guY29uZiBhbmQgL2V0Yy9yZXNvbHYuY29uZi4KKy5JUCAiXChidSIgNAorTG9jYWwgdGltZSBpbiBsb2cgZmlsZXMgbmVlZHMgL2V0Yy90aW1lem9uZS4KKy5JUCAiXChidSIgNAorU29tZSBvdGhlciBmdW5jdGlvbnMgbWF5IG5lZWQgZGV2aWNlcywgZS5nLiAvZGV2L3plcm8gb3IgL2Rldi9udWxsLgorLlJFCisuUlMgNAorLlJFCisuSVAgIlxmQmNvbXByZXNzaW9uXGZSID0gZGVmbGF0ZSB8IHpsaWIiIDQKKy5JWCBJdGVtICJjb21wcmVzc2lvbiA9IGRlZmxhdGUgfCB6bGliIgorc2VsZWN0IGRhdGEgY29tcHJlc3Npb24gYWxnb3JpdGhtCisuU3AKK2RlZmF1bHQ6IG5vIGNvbXByZXNzaW9uCisuU3AKK2RlZmxhdGUgaXMgdGhlIHN0YW5kYXJkIGNvbXByZXNzaW9uIG1ldGhvZCBhcyBkZXNjcmliZWQgaW4gXHMtMVJGQyAxOTUxLlxzMAorLlNwCit6bGliIGNvbXByZXNzaW9uIG9mIFxmQk9wZW5TU0wgMC45LjhcZlIgb3IgYWJvdmUgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aAorXCZcZkJPcGVuU1NMIDAuOS43XGZSLgorLklQICJcZkJkZWJ1Z1xmUiA9IFtccy0xRkFDSUxJVFkuXHMwXUxFVkVMIiA0CisuSVggSXRlbSAiZGVidWcgPSBbRkFDSUxJVFkuXUxFVkVMIgorZGVidWdnaW5nIGxldmVsCisuU3AKK0xldmVsIGlzIG9uZSBvZiB0aGUgc3lzbG9nIGxldmVsIG5hbWVzIG9yIG51bWJlcnMKK2VtZXJnICgwKSwgYWxlcnQgKDEpLCBjcml0ICgyKSwgZXJyICgzKSwgd2FybmluZyAoNCksIG5vdGljZSAoNSksCitpbmZvICg2KSwgb3IgZGVidWcgKDcpLiAgQWxsIGxvZ3MgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwgYW5kCithbGwgbGV2ZWxzIG51bWVyaWNhbGx5IGxlc3MgdGhhbiBpdCB3aWxsIGJlIHNob3duLiAgVXNlIFxmSWRlYnVnID0gZGVidWdcZlIgb3IKK1wmXGZJZGVidWcgPSA3XGZSIGZvciBncmVhdGVzdCBkZWJ1Z2dpbmcgb3V0cHV0LiAgVGhlIGRlZmF1bHQgaXMgbm90aWNlICg1KS4KKy5TcAorVGhlIHN5c2xvZyBmYWNpbGl0eSAnZGFlbW9uJyB3aWxsIGJlIHVzZWQgdW5sZXNzIGEgZmFjaWxpdHkgbmFtZSBpcyBzdXBwbGllZC4KKyhGYWNpbGl0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbjMyLikKKy5TcAorQ2FzZSBpcyBpZ25vcmVkIGZvciBib3RoIGZhY2lsaXRpZXMgYW5kIGxldmVscy4KKy5JUCAiXGZCXHMtMUVHRFxzMFxmUiA9IFxzLTFFR0RfUEFUSCBcczAoVW5peCBvbmx5KSIgNAorLklYIEl0ZW0gIkVHRCA9IEVHRF9QQVRIIChVbml4IG9ubHkpIgorcGF0aCB0byBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24gc29ja2V0CisuU3AKK0VudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgdG8gdXNlIHRvIGZlZWQgdGhlIFxmQk9wZW5TU0xcZlIgcmFuZG9tIG51bWJlcgorZ2VuZXJhdG9yLiAgKEF2YWlsYWJsZSBvbmx5IGlmIGNvbXBpbGVkIHdpdGggXGZCT3BlblNTTCAwLjkuNWFcZlIgb3IgaGlnaGVyKQorLklQICJcZkJlbmdpbmVcZlIgPSBhdXRvIHwgXHMtMUVOR0lORV9JRFxzMCIgNAorLklYIEl0ZW0gImVuZ2luZSA9IGF1dG8gfCBFTkdJTkVfSUQiCitzZWxlY3QgaGFyZHdhcmUgZW5naW5lCisuU3AKK2RlZmF1bHQ6IHNvZnR3YXJlLW9ubHkgY3J5cHRvZ3JhcGh5CisuU3AKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhZHZhbmNlZCBlbmdpbmUgY29uZmlndXJhdGlvbiB0byByZWFkIHRoZSBwcml2YXRlIGtleSBmcm9tIGFuCitPcGVuU0MgZW5naW5lCisuU3AKKy5WYiA3CitcJiAgICBlbmdpbmU9ZHluYW1pYworXCYgICAgZW5naW5lQ3RybD1TT19QQVRIOi91c3IvbGliL29wZW5zYy9lbmdpbmVfcGtjczExLnNvCitcJiAgICBlbmdpbmVDdHJsPUlEOnBrY3MxMQorXCYgICAgZW5naW5lQ3RybD1MSVNUX0FERDoxCitcJiAgICBlbmdpbmVDdHJsPUxPQUQKK1wmICAgIGVuZ2luZUN0cmw9TU9EVUxFX1BBVEg6L3Vzci9saWIvcGtjczExL29wZW5zY1wtcGtjczExLnNvCitcJiAgICBlbmdpbmVDdHJsPUlOSVQKK1wmCitcJiAgICBbc2VydmljZV0KK1wmICAgIGVuZ2luZU51bT0xCitcJiAgICBrZXk9aWRfNDUKKy5WZQorLklQICJcZkJlbmdpbmVDdHJsXGZSID0gQ09NTUFORFs6UEFSQU1FVEVSXSIgNAorLklYIEl0ZW0gImVuZ2luZUN0cmwgPSBDT01NQU5EWzpQQVJBTUVURVJdIgorY29udHJvbCBoYXJkd2FyZSBlbmdpbmUKKy5TcAorU3BlY2lhbCBjb21tYW5kcyBcKihMIlxzLTFMT0FEXCooUiJcczAgYW5kIFwqKEwiXHMtMUlOSVRcKihSIlxzMCBjYW4gYmUgdXNlZCB0byBsb2FkIGFuZCBpbml0aWFsaXplIHRoZQorZW5naW5lIGNyeXB0b2dhcGhpYyBtb2R1bGUuCisuSVAgIlxmQmVuZ2luZURlZmF1bHRcZlIgPSBccy0xVEFTS19MSVNUXHMwIiA0CisuSVggSXRlbSAiZW5naW5lRGVmYXVsdCA9IFRBU0tfTElTVCIKK3NldCBPcGVuU1NMIHRhc2tzIGRlbGVnYXRlZCB0byB0aGUgY3VycmVudCBlbmdpbmUKKy5TcAorVGhlIHBhcmFtZXRlciBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrIHRvIGJlIGRlbGVnYXRlZCB0byB0aGUKK2N1cnJlbnQgZW5naW5lLgorLlNwCitUaGUgZm9sbG93aW5nIHRhc2tzIG1heSBiZSBhdmFpbGFibGUsIGlmIHN1cHBvcnRlZCBieSB0aGUgZW5naW5lOiBccy0xQUxMLCBSU0EsCitEU0EsIEVDREgsIEVDRFNBLCBESCwgUkFORCwgQ0lQSEVSUywgRElHRVNUUywgUEtFWSwgUEtFWV9DUllQVE8sIFBLRVlfQVNOMS5cczAKKy5JUCAiXGZCZmlwc1xmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAiZmlwcyA9IHllcyB8IG5vIgorRW5hYmxlIG9yIGRpc2FibGUgXHMtMUZJUFMgMTQwXC0yXHMwIG1vZGUuCisuU3AKK1RoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSBlbnRlcmluZyBccy0xRklQU1xzMCBtb2RlIGlmIFxmQnN0dW5uZWxcZlIgd2FzIGNvbXBpbGVkCit3aXRoIFxzLTFGSVBTIDE0MFwtMlxzMCBzdXBwb3J0LgorLlNwCitkZWZhdWx0OiBubyAoc2luY2UgdmVyc2lvbiA1LjAwKQorLklQICJcZkJmb3JlZ3JvdW5kXGZSID0geWVzIHwgbm8gKFVuaXggb25seSkiIDQKKy5JWCBJdGVtICJmb3JlZ3JvdW5kID0geWVzIHwgbm8gKFVuaXggb25seSkiCitmb3JlZ3JvdW5kIG1vZGUKKy5TcAorU3RheSBpbiBmb3JlZ3JvdW5kIChkb24ndCBmb3JrKSBhbmQgbG9nIHRvIHN0ZGVycgoraW5zdGVhZCBvZiB2aWEgc3lzbG9nICh1bmxlc3MgXGZJb3V0cHV0XGZSIGlzIHNwZWNpZmllZCkuCisuU3AKK2RlZmF1bHQ6IGJhY2tncm91bmQgaW4gZGFlbW9uIG1vZGUKKy5JUCAiXGZCaWNvbkFjdGl2ZVxmUiA9IFxzLTFJQ09OX0ZJTEUgXHMwKFxzLTFHVUlcczAgb25seSkiIDQKKy5JWCBJdGVtICJpY29uQWN0aXZlID0gSUNPTl9GSUxFIChHVUkgb25seSkiCitcJlxzLTFHVUlcczAgaWNvbiB0byBiZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMKKy5TcAorT24gV2luZG93cyBwbGF0Zm9ybSB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBhbiAuaWNvIGZpbGUgY29udGFpbmluZyBhIDE2eDE2CitwaXhlbCBpbWFnZS4KKy5JUCAiXGZCaWNvbkVycm9yXGZSID0gXHMtMUlDT05fRklMRSBcczAoXHMtMUdVSVxzMCBvbmx5KSIgNAorLklYIEl0ZW0gImljb25FcnJvciA9IElDT05fRklMRSAoR1VJIG9ubHkpIgorXCZccy0xR1VJXHMwIGljb24gdG8gYmUgZGlzcGxheWVkIHdoZW4gbm8gdmFsaWQgY29uZmlndXJhdGlvbiBpcyBsb2FkZWQKKy5TcAorT24gV2luZG93cyBwbGF0Zm9ybSB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBhbiAuaWNvIGZpbGUgY29udGFpbmluZyBhIDE2eDE2CitwaXhlbCBpbWFnZS4KKy5JUCAiXGZCaWNvbklkbGVcZlIgPSBccy0xSUNPTl9GSUxFIFxzMChccy0xR1VJXHMwIG9ubHkpIiA0CisuSVggSXRlbSAiaWNvbklkbGUgPSBJQ09OX0ZJTEUgKEdVSSBvbmx5KSIKK1wmXHMtMUdVSVxzMCBpY29uIHRvIGJlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucworLlNwCitPbiBXaW5kb3dzIHBsYXRmb3JtIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIC5pY28gZmlsZSBjb250YWluaW5nIGEgMTZ4MTYKK3BpeGVsIGltYWdlLgorLklQICJcZkJsb2dcZlIgPSBhcHBlbmQgfCBvdmVyd3JpdGUiIDQKKy5JWCBJdGVtICJsb2cgPSBhcHBlbmQgfCBvdmVyd3JpdGUiCitsb2cgZmlsZSBoYW5kbGluZworLlNwCitUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNob29zZSB3aGV0aGVyIHRoZSBsb2cgZmlsZSAoc3BlY2lmaWVkIHdpdGggdGhlIFxmSW91dHB1dFxmUgorb3B0aW9uKSBpcyBhcHBlbmRlZCBvciBvdmVyd3JpdHRlbiB3aGVuIG9wZW5lZCBvciByZS1vcGVuZWQuCisuU3AKK2RlZmF1bHQ6IGFwcGVuZAorLklQICJcZkJvdXRwdXRcZlIgPSBccy0xRklMRVxzMCIgNAorLklYIEl0ZW0gIm91dHB1dCA9IEZJTEUiCithcHBlbmQgbG9nIG1lc3NhZ2VzIHRvIGEgZmlsZQorLlNwCisvZGV2L3N0ZG91dCBkZXZpY2UgY2FuIGJlIHVzZWQgdG8gc2VuZCBsb2cgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkCitvdXRwdXQgKGZvciBleGFtcGxlIHRvIGxvZyB0aGVtIHdpdGggZGFlbW9udG9vbHMgc3Bsb2dnZXIpLgorLklQICJcZkJwaWRcZlIgPSBccy0xRklMRSBcczAoVW5peCBvbmx5KSIgNAorLklYIEl0ZW0gInBpZCA9IEZJTEUgKFVuaXggb25seSkiCitwaWQgZmlsZSBsb2NhdGlvbgorLlNwCitJZiB0aGUgYXJndW1lbnQgaXMgZW1wdHksIHRoZW4gbm8gcGlkIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorLlNwCitcJlxmSXBpZFxmUiBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBcZkljaHJvb3RcZlIgZGlyZWN0b3J5IGlmIHNwZWNpZmllZC4KKy5JUCAiXGZCUk5EYnl0ZXNcZlIgPSBccy0xQllURVNcczAiIDQKKy5JWCBJdGVtICJSTkRieXRlcyA9IEJZVEVTIgorYnl0ZXMgdG8gcmVhZCBmcm9tIHJhbmRvbSBzZWVkIGZpbGVzCisuU3AKK051bWJlciBvZiBieXRlcyBvZiBkYXRhIHJlYWQgZnJvbSByYW5kb20gc2VlZCBmaWxlcy4gIFdpdGggXHMtMVNTTFxzMCB2ZXJzaW9ucyBsZXNzCit0aGFuIFxmQjAuOS41YVxmUiwgYWxzbyBkZXRlcm1pbmVzIGhvdyBtYW55IGJ5dGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQKK3N1ZmZpY2llbnQgdG8gc2VlZCB0aGUgXHMtMVBSTkcuIFxzMCBNb3JlIHJlY2VudCBcZkJPcGVuU1NMXGZSIHZlcnNpb25zIGhhdmUgYSBidWlsdGluCitmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hlbiBzdWZmaWNpZW50IHJhbmRvbW5lc3MgaXMgYXZhaWxhYmxlLgorLklQICJcZkJSTkRmaWxlXGZSID0gXHMtMUZJTEVcczAiIDQKKy5JWCBJdGVtICJSTkRmaWxlID0gRklMRSIKK3BhdGggdG8gZmlsZSB3aXRoIHJhbmRvbSBzZWVkIGRhdGEKKy5TcAorVGhlIFxzLTFTU0xcczAgbGlicmFyeSB3aWxsIHVzZSBkYXRhIGZyb20gdGhpcyBmaWxlIGZpcnN0IHRvIHNlZWQgdGhlIHJhbmRvbQorbnVtYmVyIGdlbmVyYXRvci4KKy5JUCAiXGZCUk5Eb3ZlcndyaXRlXGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJSTkRvdmVyd3JpdGUgPSB5ZXMgfCBubyIKK292ZXJ3cml0ZSB0aGUgcmFuZG9tIHNlZWQgZmlsZXMgd2l0aCBuZXcgcmFuZG9tIGRhdGEKKy5TcAorZGVmYXVsdDogeWVzCisuSVAgIlxmQnNlcnZpY2VcZlIgPSBccy0xU0VSVklDRSBcczAoVW5peCBvbmx5KSIgNAorLklYIEl0ZW0gInNlcnZpY2UgPSBTRVJWSUNFIChVbml4IG9ubHkpIgorc3R1bm5lbCBzZXJ2aWNlIG5hbWUKKy5TcAorVGhlIHNwZWNpZmllZCBzZXJ2aWNlIG5hbWUgaXMgdXNlZCBmb3Igc3lzbG9nIGFuZCBhcyB0aGUgXGZJaW5ldGRcZlIgbW9kZSBzZXJ2aWNlCituYW1lIGZvciBccy0xVENQXHMwIFdyYXBwZXJzLiAgV2hpbGUgdGhpcyBvcHRpb24gY2FuIHRlY2huaWNhbGx5IGJlIHNwZWNpZmllZCBpbiB0aGUKK3NlcnZpY2Ugc2VjdGlvbnMsIGl0IGlzIG9ubHkgdXNlZnVsIGluIGdsb2JhbCBvcHRpb25zLgorLlNwCitkZWZhdWx0OiBzdHVubmVsCisuSVAgIlxmQnNldGdpZFxmUiA9IFxzLTFHUk9VUCBcczAoVW5peCBvbmx5KSIgNAorLklYIEl0ZW0gInNldGdpZCA9IEdST1VQIChVbml4IG9ubHkpIgorXCZcZklzZXRnaWQoKVxmUiB0byB0aGUgc3BlY2lmaWVkIGdyb3VwIGluIGRhZW1vbiBtb2RlIGFuZCBjbGVhciBhbGwgb3RoZXIgZ3JvdXBzCisuSVAgIlxmQnNldHVpZFxmUiA9IFxzLTFVU0VSIFxzMChVbml4IG9ubHkpIiA0CisuSVggSXRlbSAic2V0dWlkID0gVVNFUiAoVW5peCBvbmx5KSIKK1wmXGZJc2V0dWlkKClcZlIgdG8gdGhlIHNwZWNpZmllZCB1c2VyIGluIGRhZW1vbiBtb2RlCisuSVAgIlxmQnNvY2tldFxmUiA9IGF8bHxyOk9QVElPTj1WQUxVRVs6VkFMVUVdIiA0CisuSVggSXRlbSAic29ja2V0ID0gYXxsfHI6T1BUSU9OPVZBTFVFWzpWQUxVRV0iCitTZXQgYW4gb3B0aW9uIG9uIHRoZSBhY2NlcHQvbG9jYWwvcmVtb3RlIHNvY2tldAorLlNwCitUaGUgdmFsdWVzIGZvciB0aGUgbGluZ2VyIG9wdGlvbiBhcmUgbF9vbm9mOmxfbGluZ2VyLgorVGhlIHZhbHVlcyBmb3IgdGhlIHRpbWUgYXJlIHR2X3NlYzp0dl91c2VjLgorLlNwCitFeGFtcGxlczoKKy5TcAorLlZiIDkKK1wmICAgIHNvY2tldCA9IGw6U09fTElOR0VSPTE6NjAKK1wmICAgICAgICBzZXQgb25lIG1pbnV0ZSB0aW1lb3V0IGZvciBjbG9zaW5nIGxvY2FsIHNvY2tldAorXCYgICAgc29ja2V0ID0gcjpTT19PT0JJTkxJTkU9eWVzCitcJiAgICAgICAgcGxhY2Ugb3V0XC1vZlwtYmFuZCBkYXRhIGRpcmVjdGx5IGludG8gdGhlCitcJiAgICAgICAgcmVjZWl2ZSBkYXRhIHN0cmVhbSBmb3IgcmVtb3RlIHNvY2tldHMKK1wmICAgIHNvY2tldCA9IGE6U09fUkVVU0VBRERSPW5vCitcJiAgICAgICAgZGlzYWJsZSBhZGRyZXNzIHJldXNlIChlbmFibGVkIGJ5IGRlZmF1bHQpCitcJiAgICBzb2NrZXQgPSBhOlNPX0JJTkRUT0RFVklDRT1sbworXCYgICAgICAgIG9ubHkgYWNjZXB0IGNvbm5lY3Rpb25zIG9uIGxvb3BiYWNrIGludGVyZmFjZQorLlZlCisuSVAgIlxmQnN5c2xvZ1xmUiA9IHllcyB8IG5vIChVbml4IG9ubHkpIiA0CisuSVggSXRlbSAic3lzbG9nID0geWVzIHwgbm8gKFVuaXggb25seSkiCitlbmFibGUgbG9nZ2luZyB2aWEgc3lzbG9nCisuU3AKK2RlZmF1bHQ6IHllcworLklQICJcZkJ0YXNrYmFyXGZSID0geWVzIHwgbm8gKFxzLTFXSU4zMlxzMCBvbmx5KSIgNAorLklYIEl0ZW0gInRhc2tiYXIgPSB5ZXMgfCBubyAoV0lOMzIgb25seSkiCitlbmFibGUgdGhlIHRhc2tiYXIgaWNvbgorLlNwCitkZWZhdWx0OiB5ZXMKKy5TUyAiU0VSVklDRS1MRVZFTCBccy0xT1BUSU9OU1xzMCIKKy5JWCBTdWJzZWN0aW9uICJTRVJWSUNFLUxFVkVMIE9QVElPTlMiCitFYWNoIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBiZWdpbnMgd2l0aCBhIHNlcnZpY2UgbmFtZSBpbiBzcXVhcmUgYnJhY2tldHMuCitUaGUgc2VydmljZSBuYW1lIGlzIHVzZWQgZm9yIGxpYndyYXAgKFxzLTFUQ1BcczAgV3JhcHBlcnMpIGFjY2VzcyBjb250cm9sIGFuZCBsZXRzCit5b3UgZGlzdGluZ3Vpc2ggXGZCc3R1bm5lbFxmUiBzZXJ2aWNlcyBpbiB5b3VyIGxvZyBmaWxlcy4KKy5QUAorTm90ZSB0aGF0IGlmIHlvdSB3aXNoIHRvIHJ1biBcZkJzdHVubmVsXGZSIGluIFxmSWluZXRkXGZSIG1vZGUgKHdoZXJlIGl0CitpcyBwcm92aWRlZCBhIG5ldHdvcmsgc29ja2V0IGJ5IGEgc2VydmVyIHN1Y2ggYXMgXGZJaW5ldGRcZlIsIFxmSXhpbmV0ZFxmUiwKK29yIFxmSXRjcHNlcnZlclxmUikgdGhlbiB5b3Ugc2hvdWxkIHJlYWQgdGhlIHNlY3Rpb24gZW50aXRsZWQgXGZJXHMtMUlORVREIE1PREVcczBcZlIKK2JlbG93LgorLklQICJcZkJhY2NlcHRcZlIgPSBbXHMtMUhPU1Q6XHMwXVBPUlQiIDQKKy5JWCBJdGVtICJhY2NlcHQgPSBbSE9TVDpdUE9SVCIKK2FjY2VwdCBjb25uZWN0aW9ucyBvbiBzcGVjaWZpZWQgYWRkcmVzcworLlNwCitJZiBubyBob3N0IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gYWxsIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgbG9jYWwgaG9zdC4KKy5TcAorVG8gbGlzdGVuIG9uIGFsbCBJUHY2IGFkZHJlc3NlcyB1c2U6CisuU3AKKy5WYiAxCitcJiAgICBhY2NlcHQgPSA6OjpQT1JUCisuVmUKKy5JUCAiXGZCQ0FwYXRoXGZSID0gXHMtMURJUkVDVE9SWVxzMCIgNAorLklYIEl0ZW0gIkNBcGF0aCA9IERJUkVDVE9SWSIKK0NlcnRpZmljYXRlIEF1dGhvcml0eSBkaXJlY3RvcnkKKy5TcAorVGhpcyBpcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIFxmQnN0dW5uZWxcZlIgd2lsbCBsb29rIGZvciBjZXJ0aWZpY2F0ZXMgd2hlbiB1c2luZwordGhlIFxmSXZlcmlmeVxmUiBvcHRpb24uICBOb3RlIHRoYXQgdGhlIGNlcnRpZmljYXRlcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgbmFtZWQKK1wmXHMtMVhYWFhYWFhYLjBcczAgd2hlcmUgXHMtMVhYWFhYWFhYXHMwIGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBccy0xREVSXHMwIGVuY29kZWQgc3ViamVjdCBvZiB0aGUKK2NlcnQuCisuU3AKK1RoZSBoYXNoIGFsZ29yaXRobSBoYXMgYmVlbiBjaGFuZ2VkIGluIFxmQk9wZW5TU0wgMS4wLjBcZlIuICBJdCBpcyByZXF1aXJlZCB0bworY19yZWhhc2ggdGhlIGRpcmVjdG9yeSBvbiB1cGdyYWRlIGZyb20gXGZCT3BlblNTTCAwLngueFxmUiB0byBcZkJPcGVuU1NMIDEueC54XGZSLgorLlNwCitcJlxmSUNBcGF0aFxmUiBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBcZkljaHJvb3RcZlIgZGlyZWN0b3J5IGlmIHNwZWNpZmllZC4KKy5JUCAiXGZCQ0FmaWxlXGZSID0gXHMtMUNFUlRfRklMRVxzMCIgNAorLklYIEl0ZW0gIkNBZmlsZSA9IENFUlRfRklMRSIKK0NlcnRpZmljYXRlIEF1dGhvcml0eSBmaWxlCisuU3AKK1RoaXMgZmlsZSBjb250YWlucyBtdWx0aXBsZSBccy0xQ0FcczAgY2VydGlmaWNhdGVzLCB1c2VkIHdpdGggdGhlIFxmSXZlcmlmeVxmUiBvcHRpb24uCisuSVAgIlxmQmNlcnRcZlIgPSBccy0xUEVNX0ZJTEVcczAiIDQKKy5JWCBJdGVtICJjZXJ0ID0gUEVNX0ZJTEUiCitjZXJ0aWZpY2F0ZSBjaGFpbiBccy0xUEVNXHMwIGZpbGUgbmFtZQorLlNwCitUaGUgY2VydGlmaWNhdGVzIG11c3QgYmUgaW4gXHMtMVBFTVxzMCBmb3JtYXQsIGFuZCBtdXN0IGJlIGZyb20gdGhlCithY3R1YWwgc2VydmVyL2NsaWVudCBjZXJ0aWZpY2F0ZSB0byB0aGUgc2VsZi1zaWduZWQgcm9vdCBccy0xQ0FcczAgY2VydGlmaWNhdGUuCisuU3AKK0EgY2VydGlmaWNhdGUgaXMgcmVxdWlyZWQgaW4gc2VydmVyIG1vZGUsIGFuZCBvcHRpb25hbCBpbiBjbGllbnQgbW9kZS4KKy5JUCAiXGZCY2hlY2tFbWFpbFxmUiA9IFxzLTFFTUFJTFxzMCIgNAorLklYIEl0ZW0gImNoZWNrRW1haWwgPSBFTUFJTCIKK2VtYWlsIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgc3ViamVjdAorLlNwCitNdWx0aXBsZSBcZkljaGVja0VtYWlsXGZSIG9wdGlvbnMgYXJlIGFsbG93ZWQgaW4gYSBzaW5nbGUgc2VydmljZSBzZWN0aW9uLgorQ2VydGlmaWNhdGVzIGFyZSBhY2NlcHRlZCBpZiBubyBcZkljaGVja0VtYWlsXGZSIG9wdGlvbiB3YXMgc3BlY2lmaWVkLCBvciB0aGUKK2VtYWlsIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbnkgb2YgdGhlIGVtYWlsIGFkZHJlc3Nlcworc3BlY2lmaWVkIHdpdGggXGZJY2hlY2tFbWFpbFxmUi4KKy5JUCAiXGZCY2hlY2tIb3N0XGZSID0gXHMtMUhPU1RcczAiIDQKKy5JWCBJdGVtICJjaGVja0hvc3QgPSBIT1NUIgoraG9zdCBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBzdWJqZWN0CisuU3AKK011bHRpcGxlIFxmSWNoZWNrSG9zdFxmUiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi4KK0NlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgaWYgbm8gXGZJY2hlY2tIb3N0XGZSIG9wdGlvbiB3YXMgc3BlY2lmaWVkLCBvciB0aGUgaG9zdAorbmFtZSBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBtYXRjaGVzIGFueSBvZiB0aGUgaG9zdHMgc3BlY2lmaWVkIHdpdGgKK1wmXGZJY2hlY2tIb3N0XGZSLgorLklQICJcZkJjaGVja0lQXGZSID0gXHMtMUlQXHMwIiA0CisuSVggSXRlbSAiY2hlY2tJUCA9IElQIgorXCZccy0xSVBcczAgYWRkcmVzcyBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBzdWJqZWN0CisuU3AKK011bHRpcGxlIFxmSWNoZWNrSVBcZlIgb3B0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHNpbmdsZSBzZXJ2aWNlIHNlY3Rpb24uCitDZXJ0aWZpY2F0ZXMgYXJlIGFjY2VwdGVkIGlmIG5vIFxmSWNoZWNrSVBcZlIgb3B0aW9uIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSBccy0xSVBcczAKK2FkZHJlc3Mgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbnkgb2YgdGhlIFxzLTFJUFxzMCBhZGRyZXNzZXMgc3BlY2lmaWVkIHdpdGgKK1wmXGZJY2hlY2tJUFxmUi4KKy5JUCAiXGZCY2lwaGVyc1xmUiA9IFxzLTFDSVBIRVJfTElTVFxzMCIgNAorLklYIEl0ZW0gImNpcGhlcnMgPSBDSVBIRVJfTElTVCIKK1NlbGVjdCBwZXJtaXR0ZWQgXHMtMVNTTFxzMCBjaXBoZXJzCisuU3AKK0EgY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGNpcGhlcnMgdG8gYWxsb3cgaW4gdGhlIFxzLTFTU0xcczAgY29ubmVjdGlvbiwKK2ZvciBleGFtcGxlIFxzLTFERVNcLUNCQzNcLVNIQTpJREVBXC1DQkNcLU1ENS5cczAKKy5JUCAiXGZCY2xpZW50XGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJjbGllbnQgPSB5ZXMgfCBubyIKK2NsaWVudCBtb2RlIChyZW1vdGUgc2VydmljZSB1c2VzIFxzLTFTU0xcczApCisuU3AKK2RlZmF1bHQ6IG5vIChzZXJ2ZXIgbW9kZSkKKy5JUCAiXGZCY29ubmVjdFxmUiA9IFtccy0xSE9TVDpcczBdUE9SVCIgNAorLklYIEl0ZW0gImNvbm5lY3QgPSBbSE9TVDpdUE9SVCIKK2Nvbm5lY3QgdG8gYSByZW1vdGUgYWRkcmVzcworLlNwCitJZiBubyBob3N0IGlzIHNwZWNpZmllZCwgdGhlIGhvc3QgZGVmYXVsdHMgdG8gbG9jYWxob3N0LgorLlNwCitNdWx0aXBsZSBcZkljb25uZWN0XGZSIG9wdGlvbnMgYXJlIGFsbG93ZWQgaW4gYSBzaW5nbGUgc2VydmljZSBzZWN0aW9uLgorLlNwCitJZiBob3N0IHJlc29sdmVzIHRvIG11bHRpcGxlIGFkZHJlc3NlcyBhbmQvb3IgaWYgbXVsdGlwbGUgXGZJY29ubmVjdFxmUgorb3B0aW9ucyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSByZW1vdGUgYWRkcmVzcyBpcyBjaG9zZW4gdXNpbmcgYQorcm91bmQtcm9iaW4gYWxnb3JpdGhtLgorLklQICJcZkJDUkxwYXRoXGZSID0gXHMtMURJUkVDVE9SWVxzMCIgNAorLklYIEl0ZW0gIkNSTHBhdGggPSBESVJFQ1RPUlkiCitDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIGRpcmVjdG9yeQorLlNwCitUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggXGZCc3R1bm5lbFxmUiB3aWxsIGxvb2sgZm9yIENSTHMgd2hlbgordXNpbmcgdGhlIFxmSXZlcmlmeVxmUiBvcHRpb24uIE5vdGUgdGhhdCB0aGUgQ1JMcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQKK2JlIG5hbWVkIFxzLTFYWFhYWFhYWFxzMC5yMCB3aGVyZSBccy0xWFhYWFhYWFhcczAgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIFxzLTFDUkwuXHMwCisuU3AKK1RoZSBoYXNoIGFsZ29yaXRobSBoYXMgYmVlbiBjaGFuZ2VkIGluIFxmQk9wZW5TU0wgMS4wLjBcZlIuICBJdCBpcyByZXF1aXJlZCB0bworY19yZWhhc2ggdGhlIGRpcmVjdG9yeSBvbiB1cGdyYWRlIGZyb20gXGZCT3BlblNTTCAwLngueFxmUiB0byBcZkJPcGVuU1NMIDEueC54XGZSLgorLlNwCitcJlxmSUNSTHBhdGhcZlIgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgXGZJY2hyb290XGZSIGRpcmVjdG9yeSBpZiBzcGVjaWZpZWQuCisuSVAgIlxmQkNSTGZpbGVcZlIgPSBccy0xQ0VSVF9GSUxFXHMwIiA0CisuSVggSXRlbSAiQ1JMZmlsZSA9IENFUlRfRklMRSIKK0NlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgZmlsZQorLlNwCitUaGlzIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgQ1JMcywgdXNlZCB3aXRoIHRoZSBcZkl2ZXJpZnlcZlIgb3B0aW9uLgorLklQICJcZkJjdXJ2ZVxmUiA9IFxzLTFOSURcczAiIDQKKy5JWCBJdGVtICJjdXJ2ZSA9IE5JRCIKK3NwZWNpZnkgXHMtMUVDREhcczAgY3VydmUgbmFtZQorLlNwCitUbyBnZXQgYSBsaXN0IG9mIHN1cHBvcnRlZCBjdXJ2ZXMgdXNlOgorLlNwCisuVmIgMQorXCYgICAgb3BlbnNzbCBlY3BhcmFtIFwtbGlzdF9jdXJ2ZXMKKy5WZQorLlNwCitkZWZhdWx0OiBwcmltZTI1NnYxCisuSVAgIlxmQmxvZ0lkXGZSID0gXHMtMVRZUEVcczAiIDQKKy5JWCBJdGVtICJsb2dJZCA9IFRZUEUiCitjb25uZWN0aW9uIGlkZW50aWZpZXIgdHlwZQorLlNwCitUaGlzIGlkZW50aWZpZXIgYWxsb3dzIHlvdSB0byBkaXN0aW5ndWlzaCBsb2cgZW50cmllcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2YgdGhlCitjb25uZWN0aW9ucy4KKy5TcAorQ3VycmVudGx5IHN1cHBvcnRlZCB0eXBlczoKKy5SUyA0CisuSVAgIlxmSXNlcXVlbnRpYWxcZlIiIDQKKy5JWCBJdGVtICJzZXF1ZW50aWFsIgorVGhlIG51bWVyaWMgc2VxdWVudGlhbCBpZGVudGlmaWVyIGlzIG9ubHkgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZSBpbnN0YW5jZSBvZgorXCZcZkJzdHVubmVsXGZSLCBidXQgdmVyeSBjb21wYWN0LiAgSXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1hbnVhbCBsb2cgYW5hbHlzaXMuCisuSVAgIlxmSXVuaXF1ZVxmUiIgNAorLklYIEl0ZW0gInVuaXF1ZSIKK1RoaXMgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgaXMgZ2xvYmFsbHkgdW5pcXVlLCBidXQgbG9uZ2VyIHRoYW4gdGhlIHNlcXVlbnRpYWwKK251bWJlci4gIEl0IGlzIG1vc3QgdXNlZnVsIGZvciBhdXRvbWF0ZWQgbG9nIGFuYWx5c2lzLgorLklQICJcZkl0aHJlYWRcZlIiIDQKKy5JWCBJdGVtICJ0aHJlYWQiCitUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aHJlYWQgaWRlbnRpZmllciBpcyBuZWl0aGVyIHVuaXF1ZSAoZXZlbiB3aXRoaW4gYSBzaW5nbGUKK2luc3RhbmNlIG9mIFxmQnN0dW5uZWxcZlIpIG5vciBzaG9ydC4gIEl0IGlzIG1vc3QgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgc29mdHdhcmUKK29yIGNvbmZpZ3VyYXRpb24gaXNzdWVzLgorLlJFCisuUlMgNAorLlNwCitkZWZhdWx0OiBzZXF1ZW50aWFsCisuUkUKKy5JUCAiXGZCZGVidWdcZlIgPSBccy0xTEVWRUxcczAiIDQKKy5JWCBJdGVtICJkZWJ1ZyA9IExFVkVMIgorZGVidWdnaW5nIGxldmVsCisuU3AKK0xldmVsIGlzIGEgb25lIG9mIHRoZSBzeXNsb2cgbGV2ZWwgbmFtZXMgb3IgbnVtYmVycworZW1lcmcgKDApLCBhbGVydCAoMSksIGNyaXQgKDIpLCBlcnIgKDMpLCB3YXJuaW5nICg0KSwgbm90aWNlICg1KSwKK2luZm8gKDYpLCBvciBkZWJ1ZyAoNykuICBBbGwgbG9ncyBmb3IgdGhlIHNwZWNpZmllZCBsZXZlbCBhbmQKK2FsbCBsZXZlbHMgbnVtZXJpY2FsbHkgbGVzcyB0aGFuIGl0IHdpbGwgYmUgc2hvd24uICBVc2UgXGZJZGVidWcgPSBkZWJ1Z1xmUiBvcgorXCZcZklkZWJ1ZyA9IDdcZlIgZm9yIGdyZWF0ZXN0IGRlYnVnZ2luZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyBub3RpY2UgKDUpLgorLklQICJcZkJkZWxheVxmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAiZGVsYXkgPSB5ZXMgfCBubyIKK2RlbGF5IFxzLTFETlNcczAgbG9va3VwIGZvciB0aGUgXGZJY29ubmVjdFxmUiBvcHRpb24KKy5TcAorVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBkeW5hbWljIFxzLTFETlMsXHMwIG9yIHdoZW4gXHMtMUROU1xzMCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZworXCZcZkJzdHVubmVsXGZSIHN0YXJ0dXAgKHJvYWQgd2FycmlvciBccy0xVlBOLFxzMCBkaWFsLXVwIGNvbmZpZ3VyYXRpb25zKS4KKy5TcAorRGVsYXllZCByZXNvbHZlciBtb2RlIGlzIGF1dG9tYXRpY2FsbHkgZW5nYWdlZCB3aGVuIHN0dW5uZWwgZmFpbHMgdG8gcmVzb2x2ZSBvbgorc3RhcnR1cCBhbnkgb2YgdGhlIFxmSWNvbm5lY3RcZlIgdGFyZ2V0cyBmb3IgYSBzZXJ2aWNlLgorLlNwCitEZWxheWVkIHJlc29sdmVyIGluZmxpY3RzIFxmSWZhaWxvdmVyID0gcHJpb1xmUi4KKy5TcAorZGVmYXVsdDogbm8KKy5JUCAiXGZCZW5naW5lSWRcZlIgPSBccy0xRU5HSU5FX0lEXHMwIiA0CisuSVggSXRlbSAiZW5naW5lSWQgPSBFTkdJTkVfSUQiCitzZWxlY3QgZW5naW5lIFxzLTFJRFxzMCBmb3IgdGhlIHNlcnZpY2UKKy5JUCAiXGZCZW5naW5lTnVtXGZSID0gXHMtMUVOR0lORV9OVU1CRVJcczAiIDQKKy5JWCBJdGVtICJlbmdpbmVOdW0gPSBFTkdJTkVfTlVNQkVSIgorc2VsZWN0IGVuZ2luZSBudW1iZXIgZm9yIHRoZSBzZXJ2aWNlCisuU3AKK1RoZSBlbmdpbmVzIGFyZSBudW1iZXJlZCBzdGFydGluZyBmcm9tIDEuCisuSVAgIlxmQmV4ZWNcZlIgPSBccy0xRVhFQ1VUQUJMRV9QQVRIXHMwIiA0CisuSVggSXRlbSAiZXhlYyA9IEVYRUNVVEFCTEVfUEFUSCIKK2V4ZWN1dGUgYSBsb2NhbCBpbmV0ZC10eXBlIHByb2dyYW0KKy5TcAorXCZcZklleGVjXGZSIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIFxmSWNocm9vdFxmUiBkaXJlY3RvcnkgaWYgc3BlY2lmaWVkLgorLlNwCitUaGUgZm9sbG93aW5nIGVudmlyb25tZW50YWwgdmFyaWFibGVzIGFyZSBzZXQgb24gVW5peCBwbGF0Zm9ybXM6CitcJlxzLTFSRU1PVEVfSE9TVCwgUkVNT1RFX1BPUlQsIFNTTF9DTElFTlRfRE4sIFNTTF9DTElFTlRfSV9ETi5cczAKKy5pZSBuIC5JUCAiXGZCZXhlY0FyZ3NcZlIgPSAkMCAkMSAkMiAuLi4iIDQKKy5lbCAuSVAgIlxmQmV4ZWNBcmdzXGZSID0gXGYoQ1ckMFxmUiBcZihDVyQxXGZSIFxmKENXJDJcZlIgLi4uIiA0CisuSVggSXRlbSAiZXhlY0FyZ3MgPSAkMCAkMSAkMiAuLi4iCithcmd1bWVudHMgZm9yIFxmSWV4ZWNcZlIgaW5jbHVkaW5nIHRoZSBwcm9ncmFtIG5hbWUgKCQwKQorLlNwCitRdW90aW5nIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorQXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHdoaXRlc3BhY2UuCisuSVAgIlxmQmZhaWxvdmVyXGZSID0gcnIgfCBwcmlvIiA0CisuSVggSXRlbSAiZmFpbG92ZXIgPSByciB8IHByaW8iCitGYWlsb3ZlciBzdHJhdGVneSBmb3IgbXVsdGlwbGUgXCooTCJjb25uZWN0XCooUiIgdGFyZ2V0cy4KKy5TcAorLlZiIDIKK1wmICAgIHJyIChyb3VuZCByb2JpbikgXC0gZmFpciBsb2FkIGRpc3RyaWJ1dGlvbgorXCYgICAgcHJpbyAocHJpb3JpdHkpIFwtIHVzZSB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGNvbmZpZyBmaWxlCisuVmUKKy5TcAorZGVmYXVsdDogcnIKKy5JUCAiXGZCaWRlbnRcZlIgPSBccy0xVVNFUk5BTUVcczAiIDQKKy5JWCBJdGVtICJpZGVudCA9IFVTRVJOQU1FIgordXNlIFxzLTFJREVOVCBcczAoXHMtMVJGQyAxNDEzXHMwKSB1c2VybmFtZSBjaGVja2luZworLklQICJcZkJpbmNsdWRlXGZSID0gXHMtMURJUkVDVE9SWVxzMCIgNAorLklYIEl0ZW0gImluY2x1ZGUgPSBESVJFQ1RPUlkiCitpbmNsdWRlIGFsbCBjb25maWd1cmF0aW9uIGZpbGUgcGFydHMgbG9jYXRlZCBpbiBccy0xRElSRUNUT1JZXHMwCisuU3AKK1RoZSBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFzY2VuZGluZyBhbHBoYWJldGljYWwgb3JkZXIgb2YgdGhlaXIgbmFtZXMuCisuSVAgIlxmQmtleVxmUiA9IFxzLTFLRVlfRklMRVxzMCIgNAorLklYIEl0ZW0gImtleSA9IEtFWV9GSUxFIgorcHJpdmF0ZSBrZXkgZm9yIHRoZSBjZXJ0aWZpY2F0ZSBzcGVjaWZpZWQgd2l0aCBcZkljZXJ0XGZSIG9wdGlvbgorLlNwCitBIHByaXZhdGUga2V5IGlzIG5lZWRlZCB0byBhdXRoZW50aWNhdGUgdGhlIGNlcnRpZmljYXRlIG93bmVyLgorU2luY2UgdGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IHNlY3JldCBpdCBzaG91bGQgb25seSBiZSByZWFkYWJsZQorYnkgaXRzIG93bmVyLiAgT24gVW5peCBzeXN0ZW1zIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKy5TcAorLlZiIDEKK1wmICAgIGNobW9kIDYwMCBrZXlmaWxlCisuVmUKKy5TcAorZGVmYXVsdDogdGhlIHZhbHVlIG9mIHRoZSBcZkljZXJ0XGZSIG9wdGlvbgorLklQICJcZkJsaWJ3cmFwXGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJsaWJ3cmFwID0geWVzIHwgbm8iCitFbmFibGUgb3IgZGlzYWJsZSB0aGUgdXNlIG9mIC9ldGMvaG9zdHMuYWxsb3cgYW5kIC9ldGMvaG9zdHMuZGVueS4KKy5TcAorZGVmYXVsdDogbm8gKHNpbmNlIHZlcnNpb24gNS4wMCkKKy5JUCAiXGZCbG9jYWxcZlIgPSBccy0xSE9TVFxzMCIgNAorLklYIEl0ZW0gImxvY2FsID0gSE9TVCIKK0J5IGRlZmF1bHQsIHRoZSBccy0xSVBcczAgYWRkcmVzcyBvZiB0aGUgb3V0Z29pbmcgaW50ZXJmYWNlIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBmb3IgcmVtb3RlIGNvbm5lY3Rpb25zLgorVXNlIHRoaXMgb3B0aW9uIHRvIGJpbmQgYSBzdGF0aWMgbG9jYWwgXHMtMUlQXHMwIGFkZHJlc3MgaW5zdGVhZC4KKy5JUCAiXGZCc25pXGZSID0gXHMtMVNFUlZJQ0U6U0VSVkVSX1BBVFRFUk4gXHMwKHNlcnZlciBtb2RlKSIgNAorLklYIEl0ZW0gInNuaSA9IFNFUlZJQ0U6U0VSVkVSX1BBVFRFUk4gKHNlcnZlciBtb2RlKSIKK1VzZSB0aGUgc2VydmljZSBhcyBhIHNsYXZlIHNlcnZpY2UgKGEgbmFtZS1iYXNlZCB2aXJ0dWFsIHNlcnZlcikgZm9yIFNlcnZlcgorTmFtZSBJbmRpY2F0aW9uIFxzLTFUTFNcczAgZXh0ZW5zaW9uIChccy0xUkZDIDM1NDZcczApLgorLlNwCitcJlxmSXNlcnZpY2VfbmFtZVxmUiBzcGVjaWZpZXMgdGhlIG1hc3RlciBzZXJ2aWNlIHRoYXQgYWNjZXB0cyBjbGllbnQgY29ubmVjdGlvbnMKK3dpdGggdGhlIFxmSWFjY2VwdFxmUiBvcHRpb24uICBcZklzZXJ2ZXJfbmFtZV9wYXR0ZXJuXGZSIHNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIHRvIGJlCityZWRpcmVjdGVkLiAgVGhlIHBhdHRlcm4gbWF5IHN0YXJ0IHdpdGggdGhlICcqJyBjaGFyYWN0ZXIsIGUuZy4gJyouZXhhbXBsZS5jb20nLgorTXVsdGlwbGUgc2xhdmUgc2VydmljZXMgYXJlIG5vcm1hbGx5IHNwZWNpZmllZCBmb3IgYSBzaW5nbGUgbWFzdGVyIHNlcnZpY2UuCitUaGUgXGZJc25pXGZSIG9wdGlvbiBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aGluIGEgc2luZ2xlIHNsYXZlCitzZXJ2aWNlLgorLlNwCitUaGlzIHNlcnZpY2UsIGFzIHdlbGwgYXMgdGhlIG1hc3RlciBzZXJ2aWNlLCBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgaW4gY2xpZW50Cittb2RlLgorLlNwCitUaGUgXGZJY29ubmVjdFxmUiBvcHRpb24gb2YgdGhlIHNsYXZlIHNlcnZpY2UgaXMgaWdub3JlZCB3aGVuIHRoZSBcZklwcm90b2NvbFxmUiBvcHRpb24gaXMKK3NwZWNpZmllZCwgYXMgXGZJcHJvdG9jb2xcZlIgY29ubmVjdHMgdG8gdGhlIHJlbW90ZSBob3N0IGJlZm9yZSBccy0xVExTXHMwIGhhbmRzaGFrZS4KKy5TcAorTGlid3JhcCBjaGVja3MgKFVuaXggb25seSkgYXJlIHBlcmZvcm1lZCB0d2ljZTogd2l0aCB0aGUgbWFzdGVyIHNlcnZpY2UgbmFtZSBhZnRlcgorXCZccy0xVENQXHMwIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIGFuZCB3aXRoIHRoZSBzbGF2ZSBzZXJ2aWNlIG5hbWUgZHVyaW5nIHRoZSBccy0xVExTXHMwIGhhbmRzaGFrZS4KKy5TcAorVGhlIFxmSXNuaVxmUiBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIFxmQk9wZW5TU0wgMS4wLjBcZlIgYW5kIGxhdGVyLgorLklQICJcZkJzbmlcZlIgPSBccy0xU0VSVkVSIFxzMChjbGllbnQgbW9kZSkiIDQKKy5JWCBJdGVtICJzbmkgPSBTRVJWRVIgKGNsaWVudCBtb2RlKSIKK1VzZSB0aGUgcGFyYW1ldGVyIGFzIHRoZSB2YWx1ZSBvZiBccy0xVExTXHMwIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFxzLTFSRkMgMzU0NlxzMCkKK2V4dGVuc2lvbi4KKy5TcAorVGhlIFxmSXNuaVxmUiBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIFxmQk9wZW5TU0wgMS4wLjBcZlIgYW5kIGxhdGVyLgorLklQICJcZkJccy0xT0NTUFxzMFxmUiA9IFxzLTFVUkxcczAiIDQKKy5JWCBJdGVtICJPQ1NQID0gVVJMIgorc2VsZWN0IFxzLTFPQ1NQXHMwIHNlcnZlciBmb3IgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uCisuSVAgIlxmQk9DU1BhaWFcZlIgPSB5ZXMgfCBubyIgNAorLklYIEl0ZW0gIk9DU1BhaWEgPSB5ZXMgfCBubyIKK3ZhbGlkYXRlIGNlcnRpZmljYXRlcyB3aXRoIHRoZWlyIFxzLTFBSUEgT0NTUFxzMCByZXNwb25kZXJzCisuU3AKK1RoaXMgb3B0aW9uIGVuYWJsZXMgXGZJc3R1bm5lbFxmUiB0byB2YWxpZGF0ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgbGlzdCBvZgorXCZccy0xT0NTUFxzMCByZXNwb25kZXIgVVJMcyByZXRyaWV2ZWQgZnJvbSB0aGVpciBccy0xQUlBIFxzMChBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzKQorZXh0ZW5zaW9uLgorLklQICJcZkJPQ1NQZmxhZ1xmUiA9IFxzLTFPQ1NQX0ZMQUdcczAiIDQKKy5JWCBJdGVtICJPQ1NQZmxhZyA9IE9DU1BfRkxBRyIKK3NwZWNpZnkgXHMtMU9DU1BcczAgc2VydmVyIGZsYWcKKy5TcAorU2V2ZXJhbCBcZklPQ1NQZmxhZ1xmUiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIGZsYWdzLgorLlNwCitjdXJyZW50bHkgc3VwcG9ydGVkIGZsYWdzOiBccy0xTk9DRVJUUywgTk9JTlRFUk4gTk9TSUdTLCBOT0NIQUlOLCBOT1ZFUklGWSwKK05PRVhQTElDSVQsIE5PQ0FTSUdOLCBOT0RFTEVHQVRFRCwgTk9DSEVDS1MsIFRSVVNUT1RIRVIsIFJFU1BJRF9LRVksIE5PVElNRVxzMAorLklQICJcZkJvcHRpb25zXGZSID0gXHMtMVNTTF9PUFRJT05TXHMwIiA0CisuSVggSXRlbSAib3B0aW9ucyA9IFNTTF9PUFRJT05TIgorXCZcZkJPcGVuU1NMXGZSIGxpYnJhcnkgb3B0aW9ucworLlNwCitUaGUgcGFyYW1ldGVyIGlzIHRoZSBcZkJPcGVuU1NMXGZSIG9wdGlvbiBuYW1lIGFzIGRlc2NyaWJlZCBpbiB0aGUKK1wmXGZJXGZJU1NMX0NUWF9zZXRfb3B0aW9uc1xmSVx8KDNzc2wpXGZSIG1hbnVhbCwgYnV0IHdpdGhvdXQgXGZJXHMtMVNTTF9PUF9cczBcZlIgcHJlZml4LgorXCZcZklzdHVubmVsIFwtb3B0aW9uc1xmUiBsaXN0cyB0aGUgb3B0aW9ucyBmb3VuZCB0byBiZSBhbGxvd2VkIGluIHRoZQorY3VycmVudCBjb21iaW5hdGlvbiBvZiBcZklzdHVubmVsXGZSIGFuZCB0aGUgXGZJT3BlblNTTFxmUiBsaWJyYXJ5IHVzZWQKK3RvIGJ1aWxkIGl0LgorLlNwCitTZXZlcmFsIFxmSW9wdGlvbnNcZlIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBtdWx0aXBsZSBvcHRpb25zLgorQW4gb3B0aW9uIG5hbWUgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGEgZGFzaCAoXCooTCJcLVwqKFIiKSB0byBkaXNhYmxlIHRoZSBvcHRpb24uCisuU3AKK0ZvciBleGFtcGxlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBlcnJvbmVvdXMgRXVkb3JhIFxzLTFTU0xcczAKK2ltcGxlbWVudGF0aW9uLCB0aGUgZm9sbG93aW5nIG9wdGlvbiBjYW4gYmUgdXNlZDoKKy5TcAorLlZiIDEKK1wmICAgIG9wdGlvbnMgPSBET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKKy5WZQorLlNwCitkZWZhdWx0OgorLlNwCisuVmIgMgorXCYgICAgb3B0aW9ucyA9IE5PX1NTTHYyCitcJiAgICBvcHRpb25zID0gTk9fU1NMdjMKKy5WZQorLklQICJcZkJwcm90b2NvbFxmUiA9IFxzLTFQUk9UT1xzMCIgNAorLklYIEl0ZW0gInByb3RvY29sID0gUFJPVE8iCithcHBsaWNhdGlvbiBwcm90b2NvbCB0byBuZWdvdGlhdGUgXHMtMVNTTFxzMAorLlNwCitUaGlzIG9wdGlvbiBlbmFibGVzIGluaXRpYWwsIHByb3RvY29sLXNwZWNpZmljIG5lZ290aWF0aW9uIG9mIHRoZSBccy0xU1NML1RMU1xzMAorZW5jcnlwdGlvbi4KK1RoZSBcZklwcm90b2NvbFxmUiBvcHRpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggXHMtMVNTTFxzMCBlbmNyeXB0aW9uIG9uIGEgc2VwYXJhdGUgcG9ydC4KKy5TcAorQ3VycmVudGx5IHN1cHBvcnRlZCBwcm90b2NvbHM6CisuUlMgNAorLklQICJcZkljaWZzXGZSIiA0CisuSVggSXRlbSAiY2lmcyIKK1Byb3ByaWV0YXJ5ICh1bmRvY3VtbWVudGVkKSBleHRlbnNpb24gb2YgXHMtMUNJRlNcczAgcHJvdG9jb2wgaW1wbGVtZW50ZWQgaW4gU2FtYmEuCitTdXBwb3J0IGZvciB0aGlzIGV4dGVuc2lvbiB3YXMgZHJvcHBlZCBpbiBTYW1iYSAzLjAuMC4KKy5JUCAiXGZJY29ubmVjdFxmUiIgNAorLklYIEl0ZW0gImNvbm5lY3QiCitCYXNlZCBvbiBccy0xUkZDIDI4MTcgXC0gXHMwXGZJVXBncmFkaW5nIHRvIFxzLTFUTFNcczAgV2l0aGluIFxzLTFIVFRQLzEuMVxzMFxmUiwgc2VjdGlvbiA1LjIgXC0gXGZJUmVxdWVzdGluZyBhIFR1bm5lbCB3aXRoIFxzLTFDT05ORUNUXHMwXGZSCisuU3AKK1RoaXMgcHJvdG9jb2wgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2xpZW50IG1vZGUuCisuSVAgIlxmSWltYXBcZlIiIDQKKy5JWCBJdGVtICJpbWFwIgorQmFzZWQgb24gXHMtMVJGQyAyNTk1IFwtIFxzMFxmSVVzaW5nIFxzLTFUTFNcczAgd2l0aCBccy0xSU1BUCwgUE9QM1xzMCBhbmQgXHMtMUFDQVBcczBcZlIKKy5JUCAiXGZJbm50cFxmUiIgNAorLklYIEl0ZW0gIm5udHAiCitCYXNlZCBvbiBccy0xUkZDIDQ2NDIgXC0gXHMwXGZJVXNpbmcgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChccy0xVExTXHMwKSB3aXRoIE5ldHdvcmsgTmV3cyBUcmFuc2ZlciBQcm90b2NvbCAoXHMtMU5OVFBcczApXGZSCisuU3AKK1RoaXMgcHJvdG9jb2wgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2xpZW50IG1vZGUuCisuSVAgIlxmSXBnc3FsXGZSIiA0CisuSVggSXRlbSAicGdzcWwiCitCYXNlZCBvbgorXCZcZklodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOC4zL3N0YXRpYy9wcm90b2NvbFwtZmxvdy5odG1sI0FFTjczOTgyXGZSCisuSVAgIlxmSXBvcDNcZlIiIDQKKy5JWCBJdGVtICJwb3AzIgorQmFzZWQgb24gXHMtMVJGQyAyNDQ5IFwtIFxzMFxmSVxzLTFQT1AzXHMwIEV4dGVuc2lvbiBNZWNoYW5pc21cZlIKKy5JUCAiXGZJcHJveHlcZlIiIDQKKy5JWCBJdGVtICJwcm94eSIKK0hhcHJveHkgY2xpZW50IFxzLTFJUFxzMCBhZGRyZXNzCitcJlxmSWh0dHA6Ly9oYXByb3h5LjF3dC5ldS9kb3dubG9hZC8xLjUvZG9jL3Byb3h5XC1wcm90b2NvbC50eHRcZlIKKy5JUCAiXGZJc210cFxmUiIgNAorLklYIEl0ZW0gInNtdHAiCitCYXNlZCBvbiBccy0xUkZDIDI0ODcgXC0gXHMwXGZJXHMtMVNNVFBcczAgU2VydmljZSBFeHRlbnNpb24gZm9yIFNlY3VyZSBccy0xU01UUFxzMCBvdmVyIFxzLTFUTFNcczBcZlIKKy5JUCAiXGZJc29ja3NcZlIiIDQKKy5JWCBJdGVtICJzb2NrcyIKK1wmXHMtMVNPQ0tTXHMwIHZlcnNpb25zIDQsIDRhLCBhbmQgNSBhcmUgc3VwcG9ydGVkLiAgVGhlIFxzLTFTT0NLU1xzMCBwcm90b2NvbCBpdHNlbGYKK2lzIGVuY2Fwc3VsYXRlZCB3aXRoaW4gXHMtMVNTTC9UTFNcczAgZW5jcnlwdGlvbiBsYXllciB0byBwcm90ZWN0IHRoZSBmaW5hbAorZGVzdGluYXRpb24gYWRkcmVzcy4KKy5TcAorXCZcZklodHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9zb2NrczQucHJvdG9jb2xcZlIKKy5TcAorXCZcZklodHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9zb2NrczRhLnByb3RvY29sXGZSCisuU3AKK1RoZSBccy0xQklORFxzMCBjb21tYW5kIG9mIHRoZSBccy0xU09DS1NcczAgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KK1RoZSBccy0xVVNFUklEXHMwIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorLlNwCitTZWUgRXhhbXBsZXMgc2VjdGlvbiBmb3Igc2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIFxzLTFWUE5cczAgYmFzZWQgb24gXHMtMVNPQ0tTXHMwCitlbmNyeXB0aW9uLgorLlJFCisuUlMgNAorLlJFCisuSVAgIlxmQnByb3RvY29sQXV0aGVudGljYXRpb25cZlIgPSBiYXNpYyB8IG50bG0iIDQKKy5JWCBJdGVtICJwcm90b2NvbEF1dGhlbnRpY2F0aW9uID0gYmFzaWMgfCBudGxtIgorYXV0aGVudGljYXRpb24gdHlwZSBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zCisuU3AKK0N1cnJlbnRseSB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBvbmx5IGFwcGxpZXMgdG8gdGhlICdjb25uZWN0JyBwcm90b2NvbC4KKy5TcAorZGVmYXVsdDogYmFzaWMKKy5JUCAiXGZCcHJvdG9jb2xIb3N0XGZSID0gXHMtMUhPU1Q6UE9SVFxzMCIgNAorLklYIEl0ZW0gInByb3RvY29sSG9zdCA9IEhPU1Q6UE9SVCIKK2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucworLlNwCitcJlxmSXByb3RvY29sSG9zdFxmUiBzcGVjaWZpZXMgdGhlIGZpbmFsIFxzLTFTU0xcczAgc2VydmVyIHRvIGJlIGNvbm5lY3RlZCB0byBieSB0aGUgcHJveHksCithbmQgbm90IHRoZSBwcm94eSBzZXJ2ZXIgZGlyZWN0bHkgY29ubmVjdGVkIGJ5IFxmQnN0dW5uZWxcZlIuCitUaGUgcHJveHkgc2VydmVyIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgJ2Nvbm5lY3QnIG9wdGlvbi4KKy5TcAorQ3VycmVudGx5IHRoZSBwcm90b2NvbCBkZXN0aW5hdGlvbiBhZGRyZXNzIG9ubHkgYXBwbGllcyB0byAnY29ubmVjdCcgcHJvdG9jb2wuCisuSVAgIlxmQnByb3RvY29sUGFzc3dvcmRcZlIgPSBccy0xUEFTU1dPUkRcczAiIDQKKy5JWCBJdGVtICJwcm90b2NvbFBhc3N3b3JkID0gUEFTU1dPUkQiCitwYXNzd29yZCBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zCisuSVAgIlxmQnByb3RvY29sVXNlcm5hbWVcZlIgPSBccy0xVVNFUk5BTUVcczAiIDQKKy5JWCBJdGVtICJwcm90b2NvbFVzZXJuYW1lID0gVVNFUk5BTUUiCit1c2VybmFtZSBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zCisuSVAgIlxmQlBTS2lkZW50aXR5XGZSID0gXHMtMUlERU5USVRZXHMwIiA0CisuSVggSXRlbSAiUFNLaWRlbnRpdHkgPSBJREVOVElUWSIKK1wmXHMtMVBTS1xzMCBpZGVudGl0eSBmb3IgdGhlIFxzLTFQU0tcczAgY2xpZW50CisuU3AKK1wmXGZJUFNLaWRlbnRpdHlcZlIgY2FuIGJlIHVzZWQgb24gXGZCc3R1bm5lbFxmUiBjbGllbnRzIHRvIHNlbGVjdCB0aGUgXHMtMVBTS1xzMCBpZGVudGl0eQordXNlZCBmb3IgYXV0aGVudGljYXRpb24uICBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGluIHNlcnZlciBzZWN0aW9ucy4KKy5TcAorZGVmYXVsdDogdGhlIGZpcnN0IGlkZW50aXR5IHNwZWNpZmllZCBpbiB0aGUgXGZJUFNLc2VjcmV0c1xmUiBmaWxlLgorLklQICJcZkJQU0tzZWNyZXRzXGZSID0gXHMtMUZJTEVcczAiIDQKKy5JWCBJdGVtICJQU0tzZWNyZXRzID0gRklMRSIKK2ZpbGUgd2l0aCBccy0xUFNLXHMwIGlkZW50aXRpZXMgYW5kIGNvcnJlc3BvbmRpbmcga2V5cworLlNwCitFYWNoIGxpbmUgb2YgdGhlIGZpbGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisuU3AKKy5WYiAxCitcJiAgICBJREVOVElUWTpLRVkKKy5WZQorLlNwCitUaGUga2V5IGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDIwIGNoYXJhY3RlcnMgbG9uZy4KK1RoZSBmaWxlIHNob3VsZCBub3QgYmUgd29ybGQtcmVhZGFibGUgbm9yIHdvcmxkLXdyaXRhYmxlLgorLklQICJcZkJwdHlcZlIgPSB5ZXMgfCBubyAoVW5peCBvbmx5KSIgNAorLklYIEl0ZW0gInB0eSA9IHllcyB8IG5vIChVbml4IG9ubHkpIgorYWxsb2NhdGUgYSBwc2V1ZG90ZXJtaW5hbCBmb3IgJ2V4ZWMnIG9wdGlvbgorLklQICJcZkJyZWRpcmVjdFxmUiA9IFtccy0xSE9TVDpcczBdUE9SVCIgNAorLklYIEl0ZW0gInJlZGlyZWN0ID0gW0hPU1Q6XVBPUlQiCityZWRpcmVjdCBccy0xU1NMXHMwIGNsaWVudCBjb25uZWN0aW9ucyBvbiBjZXJ0aWZpY2F0ZS1iYXNlZCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlcworLlNwCitUaGlzIG9wdGlvbiBvbmx5IHdvcmtzIGluIHNlcnZlciBtb2RlLgorU29tZSBwcm90b2NvbCBuZWdvdGlhdGlvbnMgYXJlIGFsc28gaW5jb21wYXRpYmxlIHdpdGggdGhlIFxmSXJlZGlyZWN0XGZSIG9wdGlvbi4KKy5JUCAiXGZCcmVuZWdvdGlhdGlvblxmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAicmVuZWdvdGlhdGlvbiA9IHllcyB8IG5vIgorc3VwcG9ydCBccy0xU1NMXHMwIHJlbmVnb3RpYXRpb24KKy5TcAorQXBwbGljYXRpb25zIG9mIHRoZSBccy0xU1NMXHMwIHJlbmVnb3RpYXRpb24gaW5jbHVkZSBzb21lIGF1dGhlbnRpY2F0aW9uIHNjZW5hcmlvcywKK29yIHJlLWtleWluZyBsb25nIGxhc3RpbmcgY29ubmVjdGlvbnMuCisuU3AKK09uIHRoZSBvdGhlciBoYW5kIHRoaXMgZmVhdHVyZSBjYW4gZmFjaWxpdGF0ZSBhIHRyaXZpYWwgQ1BVLWV4aGF1c3Rpb24KK0RvUyBhdHRhY2s6CisuU3AKK1wmXGZJaHR0cDovL3ZpbmNlbnQuYmVybmF0LmltL2VuL2Jsb2cvMjAxMVwtc3NsXC1kb3NcLW1pdGlnYXRpb24uaHRtbFxmUgorLlNwCitQbGVhc2Ugbm90ZSB0aGF0IGRpc2FibGluZyBccy0xU1NMXHMwIHJlbmVnb3RpYXRpb24gZG9lcyBub3QgZnVsbHkgbWl0aWdhdGUKK3RoaXMgaXNzdWUuCisuU3AKK2RlZmF1bHQ6IHllcyAoaWYgc3VwcG9ydGVkIGJ5IFxmQk9wZW5TU0xcZlIpCisuSVAgIlxmQnJlc2V0XGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJyZXNldCA9IHllcyB8IG5vIgorYXR0ZW1wdCB0byB1c2UgdGhlIFxzLTFUQ1AgUlNUXHMwIGZsYWcgdG8gaW5kaWNhdGUgYW4gZXJyb3IKKy5TcAorVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBzb21lIHBsYXRmb3Jtcy4KKy5TcAorZGVmYXVsdDogeWVzCisuSVAgIlxmQnJldHJ5XGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJyZXRyeSA9IHllcyB8IG5vIgorcmVjb25uZWN0IGEgY29ubmVjdCtleGVjIHNlY3Rpb24gYWZ0ZXIgaXQncyBkaXNjb25uZWN0ZWQKKy5TcAorZGVmYXVsdDogbm8KKy5JUCAiXGZCc2Vzc2lvbkNhY2hlU2l6ZVxmUiA9IFxzLTFOVU1fRU5UUklFU1xzMCIgNAorLklYIEl0ZW0gInNlc3Npb25DYWNoZVNpemUgPSBOVU1fRU5UUklFUyIKK3Nlc3Npb24gY2FjaGUgc2l6ZQorLlNwCitcJlxmSXNlc3Npb25DYWNoZVNpemVcZlIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZQorZW50cmllcy4KKy5TcAorVGhlIHZhbHVlIG9mIDAgY2FuIGJlIHVzZWQgZm9yIHVubGltaXRlZCBzaXplLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkCitmb3IgcHJvZHVjdGlvbiB1c2UgZHVlIHRvIHRoZSByaXNrIG9mIGEgbWVtb3J5IGV4aGF1c3Rpb24gRG9TIGF0dGFjay4KKy5JUCAiXGZCc2Vzc2lvbkNhY2hlVGltZW91dFxmUiA9IFxzLTFUSU1FT1VUXHMwIiA0CisuSVggSXRlbSAic2Vzc2lvbkNhY2hlVGltZW91dCA9IFRJTUVPVVQiCitzZXNzaW9uIGNhY2hlIHRpbWVvdXQKKy5TcAorVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8ga2VlcCBjYWNoZWQgXHMtMVNTTFxzMCBzZXNzaW9ucy4KKy5JUCAiXGZCc2Vzc2lvbmRcZlIgPSBccy0xSE9TVDpQT1JUXHMwIiA0CisuSVggSXRlbSAic2Vzc2lvbmQgPSBIT1NUOlBPUlQiCithZGRyZXNzIG9mIHNlc3Npb25kIFxzLTFTU0xcczAgY2FjaGUgc2VydmVyCisuSVAgIlxmQnNzbFZlcnNpb25cZlIgPSBccy0xU1NMX1ZFUlNJT05cczAiIDQKKy5JWCBJdGVtICJzc2xWZXJzaW9uID0gU1NMX1ZFUlNJT04iCitzZWxlY3QgdGhlIFxzLTFTU0xcczAgcHJvdG9jb2wgdmVyc2lvbgorLlNwCitTdXBwb3J0ZWQgdmFsdWVzOiBhbGwsIFNTTHYyLCBTU0x2MywgVExTdjEsIFRMU3YxLjEsIFRMU3YxLjIKKy5TcAorQXZhaWxhYmlsaXR5IG9mIHNwZWNpZmljIHByb3RvY29scyBkZXBlbmRzIG9uIHRoZSBsaW5rZWQgT3BlblNTTCBsaWJyYXJ5LgorT2xkZXIgdmVyc2lvbnMgb2YgT3BlblNTTCBkbyBub3Qgc3VwcG9ydCBUTFN2MS4xIGFuZCBUTFN2MS4yLgorTmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTCBkbyBub3Qgc3VwcG9ydCBTU0x2Mi4KKy5TcAorT2Jzb2xldGUgU1NMdjIgYW5kIFNTTHYzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgYnkgZGVmYXVsdC4KK1NlZSB0aGUgXGZCb3B0aW9uc1xmUiBvcHRpb24gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKy5JUCAiXGZCc3RhY2tcZlIgPSBccy0xQllURVMgXHMwKGV4Y2VwdCBmb3IgXHMtMUZPUktcczAgbW9kZWwpIiA0CisuSVggSXRlbSAic3RhY2sgPSBCWVRFUyAoZXhjZXB0IGZvciBGT1JLIG1vZGVsKSIKK3RocmVhZCBzdGFjayBzaXplCisuSVAgIlxmQlRJTUVPVVRidXN5XGZSID0gXHMtMVNFQ09ORFNcczAiIDQKKy5JWCBJdGVtICJUSU1FT1VUYnVzeSA9IFNFQ09ORFMiCit0aW1lIHRvIHdhaXQgZm9yIGV4cGVjdGVkIGRhdGEKKy5JUCAiXGZCVElNRU9VVGNsb3NlXGZSID0gXHMtMVNFQ09ORFNcczAiIDQKKy5JWCBJdGVtICJUSU1FT1VUY2xvc2UgPSBTRUNPTkRTIgordGltZSB0byB3YWl0IGZvciBjbG9zZV9ub3RpZnkgKHNldCB0byAwIGZvciBidWdneSBccy0xTVNJRVxzMCkKKy5JUCAiXGZCVElNRU9VVGNvbm5lY3RcZlIgPSBccy0xU0VDT05EU1xzMCIgNAorLklYIEl0ZW0gIlRJTUVPVVRjb25uZWN0ID0gU0VDT05EUyIKK3RpbWUgdG8gd2FpdCB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QKKy5JUCAiXGZCVElNRU9VVGlkbGVcZlIgPSBccy0xU0VDT05EU1xzMCIgNAorLklYIEl0ZW0gIlRJTUVPVVRpZGxlID0gU0VDT05EUyIKK3RpbWUgdG8ga2VlcCBhbiBpZGxlIGNvbm5lY3Rpb24KKy5JUCAiXGZCdHJhbnNwYXJlbnRcZlIgPSBub25lIHwgc291cmNlIHwgZGVzdGluYXRpb24gfCBib3RoIChVbml4IG9ubHkpIiA0CisuSVggSXRlbSAidHJhbnNwYXJlbnQgPSBub25lIHwgc291cmNlIHwgZGVzdGluYXRpb24gfCBib3RoIChVbml4IG9ubHkpIgorZW5hYmxlIHRyYW5zcGFyZW50IHByb3h5IHN1cHBvcnQgb24gc2VsZWN0ZWQgcGxhdGZvcm1zCisuU3AKK1N1cHBvcnRlZCB2YWx1ZXM6CisuUlMgNAorLklQICJcZklub25lXGZSIiA0CisuSVggSXRlbSAibm9uZSIKK0Rpc2FibGUgdHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisuSVAgIlxmSXNvdXJjZVxmUiIgNAorLklYIEl0ZW0gInNvdXJjZSIKK1JlLXdyaXRlIHRoZSBhZGRyZXNzIHRvIGFwcGVhciBhcyBpZiBhIHdyYXBwZWQgZGFlbW9uIGlzIGNvbm5lY3RpbmcKK2Zyb20gdGhlIFxzLTFTU0xcczAgY2xpZW50IG1hY2hpbmUgaW5zdGVhZCBvZiB0aGUgbWFjaGluZSBydW5uaW5nIFxmQnN0dW5uZWxcZlIuCisuU3AKK1RoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgaW46CisuUlMgNAorLklQICJSZW1vdGUgbW9kZSAoXGZJY29ubmVjdFxmUiBvcHRpb24pIG9uIFxmSUxpbnV4ID49Mi42LjI4XGZSIiA0CisuSVggSXRlbSAiUmVtb3RlIG1vZGUgKGNvbm5lY3Qgb3B0aW9uKSBvbiBMaW51eCA+PTIuNi4yOCIKK1RoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBcZkJzdHVubmVsXGZSIHRvIGJlIGV4ZWN1dGVkIGFzIHJvb3QgYW5kIHdpdGhvdXQKK3RoZSBcZklzZXR1aWRcZlIgb3B0aW9uLgorLlNwCitUaGlzIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBzZXR1cCBmb3IgaXB0YWJsZXMgYW5kIHJvdXRpbmcKKyhwb3NzaWJseSBpbiAvZXRjL3JjLmxvY2FsIG9yIGVxdWl2YWxlbnQgZmlsZSk6CisuU3AKKy5WYiA3CitcJiAgICBpcHRhYmxlcyBcLXQgbWFuZ2xlIFwtTiBESVZFUlQKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIFBSRVJPVVRJTkcgXC1wIHRjcCBcLW0gc29ja2V0IFwtaiBESVZFUlQKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIERJVkVSVCBcLWogTUFSSyBcLVwtc2V0XC1tYXJrIDEKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIERJVkVSVCBcLWogQUNDRVBUCitcJiAgICBpcCBydWxlIGFkZCBmd21hcmsgMSBsb29rdXAgMTAwCitcJiAgICBpcCByb3V0ZSBhZGQgbG9jYWwgMC4wLjAuMC8wIGRldiBsbyB0YWJsZSAxMDAKK1wmICAgIGVjaG8gMCA+L3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvbG8vcnBfZmlsdGVyCisuVmUKKy5TcAorXCZcZkJzdHVubmVsXGZSIG11c3QgYWxzbyB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0IHRoZSBcZklzZXR1aWRcZlIgb3B0aW9uLgorLklQICJSZW1vdGUgbW9kZSAoXGZJY29ubmVjdFxmUiBvcHRpb24pIG9uIFxmSUxpbnV4IDIuMi54XGZSIiA0CisuSVggSXRlbSAiUmVtb3RlIG1vZGUgKGNvbm5lY3Qgb3B0aW9uKSBvbiBMaW51eCAyLjIueCIKK1RoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0aGUga2VybmVsIHRvIGJlIGNvbXBpbGVkIHdpdGggdGhlIFxmSXRyYW5zcGFyZW50IHByb3h5XGZSCitvcHRpb24uCitDb25uZWN0ZWQgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCBvbiBhIHNlcGFyYXRlIGhvc3QuCitSb3V0aW5nIHRvd2FyZHMgdGhlIGNsaWVudHMgaGFzIHRvIGdvIHRocm91Z2ggdGhlIFxmQnN0dW5uZWxcZlIgYm94LgorLlNwCitcJlxmQnN0dW5uZWxcZlIgbXVzdCBhbHNvIHRvIGJlIGV4ZWN1dGVkIGFzIHJvb3QgYW5kIHdpdGhvdXQgdGhlIFxmSXNldHVpZFxmUiBvcHRpb24uCisuSVAgIlJlbW90ZSBtb2RlIChcZkljb25uZWN0XGZSIG9wdGlvbikgb24gXGZJRnJlZUJTRCA+PTguMFxmUiIgNAorLklYIEl0ZW0gIlJlbW90ZSBtb2RlIChjb25uZWN0IG9wdGlvbikgb24gRnJlZUJTRCA+PTguMCIKK1RoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhZGRpdGlvbmFsIGZpcmV3YWxsIGFuZCByb3V0aW5nIHNldHVwLgorXCZcZkJzdHVubmVsXGZSIG11c3QgYWxzbyB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0IHRoZSBcZklzZXR1aWRcZlIgb3B0aW9uLgorLklQICJMb2NhbCBtb2RlIChcZklleGVjXGZSIG9wdGlvbikiIDQKKy5JWCBJdGVtICJMb2NhbCBtb2RlIChleGVjIG9wdGlvbikiCitUaGlzIGNvbmZpZ3VyYXRpb24gd29ya3MgYnkgcHJlLWxvYWRpbmcgdGhlIFxmSWxpYnN0dW5uZWwuc29cZlIgc2hhcmVkIGxpYnJhcnkuCitfUkxEX0xJU1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCBvbiBUcnU2NCwgYW5kIFxzLTFMRF9QUkVMT0FEXHMwIHZhcmlhYmxlIG9uCitvdGhlciBwbGF0Zm9ybXMuCisuUkUKKy5SUyA0CisuUkUKKy5JUCAiXGZJZGVzdGluYXRpb25cZlIiIDQKKy5JWCBJdGVtICJkZXN0aW5hdGlvbiIKK1RoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIFxmSWNvbm5lY3RcZlIgb3B0aW9uLgorLlNwCitBIHNlcnZpY2Ugc2VjdGlvbiBmb3IgdHJhbnNwYXJlbnQgZGVzdGluYXRpb24gbWF5IGxvb2sgbGlrZSB0aGlzOgorLlNwCisuVmIgNAorXCYgICAgW3RyYW5zcGFyZW50XQorXCYgICAgY2xpZW50PXllcworXCYgICAgYWNjZXB0PTxzdHVubmVsX3BvcnQ+CitcJiAgICB0cmFuc3BhcmVudD1kZXN0aW5hdGlvbgorLlZlCisuU3AKK1RoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBpcHRhYmxlcyBzZXR1cCB0byB3b3JrLAorcG9zc2libHkgaW4gL2V0Yy9yYy5sb2NhbCBvciBlcXVpdmFsZW50IGZpbGUuCisuU3AKK0ZvciBhIGNvbm5lY3QgdGFyZ2V0IGluc3RhbGxlZCBvbiB0aGUgc2FtZSBob3N0OgorLlNwCisuVmIgMworXCYgICAgL3NiaW4vaXB0YWJsZXMgXC10IG5hdCBcLUkgT1VUUFVUIFwtcCB0Y3AgXC1cLWRwb3J0IDxyZWRpcmVjdGVkX3BvcnQ+IFxlCitcJiAgICAgICAgXC1tICEgXC1cLXVpZFwtb3duZXIgPHN0dW5uZWxfdXNlcl9pZD4gXGUKK1wmICAgICAgICBcLWogRE5BVCBcLVwtdG9cLWRlc3RpbmF0aW9uIDxsb2NhbF9pcD46PHN0dW5uZWxfcG9ydD4KKy5WZQorLlNwCitGb3IgYSBjb25uZWN0IHRhcmdldCBpbnN0YWxsZWQgb24gYSByZW1vdGUgaG9zdDoKKy5TcAorLlZiIDMKK1wmICAgIC9zYmluL2lwdGFibGVzIFwtSSBJTlBVVCBcLWkgZXRoMCBcLXAgdGNwIFwtXC1kcG9ydCA8c3R1bm5lbF9wb3J0PiBcLWogQUNDRVBUCitcJiAgICAvc2Jpbi9pcHRhYmxlcyBcLXQgbmF0IFwtSSBQUkVST1VUSU5HIFwtcCB0Y3AgXC1cLWRwb3J0IDxyZWRpcmVjdGVkX3BvcnQ+IFxlCitcJiAgICAgICAgXC1pIGV0aDAgXC1qIEROQVQgXC1cLXRvXC1kZXN0aW5hdGlvbiA8bG9jYWxfaXA+OjxzdHVubmVsX3BvcnQ+CisuVmUKKy5TcAorVGhlIHRyYW5zcGFyZW50IGRlc3RpbmF0aW9uIG9wdGlvbiBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gTGludXguCisuSVAgIlxmSWJvdGhcZlIiIDQKKy5JWCBJdGVtICJib3RoIgorVXNlIGJvdGggXGZJc291cmNlXGZSIGFuZCBcZklkZXN0aW5hdGlvblxmUiB0cmFuc3BhcmVudCBwcm94eS4KKy5SRQorLlJTIDQKKy5TcAorVHdvIGxlZ2FjeSBvcHRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKy5JUCAiXGZJeWVzXGZSIiA0CisuSVggSXRlbSAieWVzIgorVGhpcyBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBcZklzb3VyY2VcZlIuCisuSVAgIlxmSW5vXGZSIiA0CisuSVggSXRlbSAibm8iCitUaGlzIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIFxmSW5vbmVcZlIuCisuUkUKKy5SUyA0CisuUkUKKy5JUCAiXGZCdmVyaWZ5XGZSID0gXHMtMUxFVkVMXHMwIiA0CisuSVggSXRlbSAidmVyaWZ5ID0gTEVWRUwiCit2ZXJpZnkgdGhlIHBlZXIgY2VydGlmaWNhdGUKKy5SUyA0CisuSVAgImxldmVsIDAiIDQKKy5JWCBJdGVtICJsZXZlbCAwIgorUmVxdWVzdCBhbmQgaWdub3JlIHRoZSBwZWVyIGNlcnRpZmljYXRlLgorLklQICJsZXZlbCAxIiA0CisuSVggSXRlbSAibGV2ZWwgMSIKK1ZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBpZiBwcmVzZW50LgorLklQICJsZXZlbCAyIiA0CisuSVggSXRlbSAibGV2ZWwgMiIKK1ZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZS4KKy5JUCAibGV2ZWwgMyIgNAorLklYIEl0ZW0gImxldmVsIDMiCitWZXJpZnkgdGhlIHBlZXIgd2l0aCBsb2NhbGx5IGluc3RhbGxlZCBjZXJ0aWZpY2F0ZS4KKy5JUCAibGV2ZWwgNCIgNAorLklYIEl0ZW0gImxldmVsIDQiCitJZ25vcmUgdGhlIFxzLTFDQVxzMCBjaGFpbiBhbmQgb25seSB2ZXJpZnkgdGhlIHBlZXIgY2VydGlmaWNhdGUuCisuSVAgImRlZmF1bHQiIDQKKy5JWCBJdGVtICJkZWZhdWx0IgorTm8gdmVyaWZ5LgorLlJFCisuUlMgNAorLlNwCitJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoaXMgb3B0aW9uIHdhcyBzb2xlbHkgZGVzaWduZWQgZm9yIGFjY2VzcworY29udHJvbCBhbmQgbm90IGZvciBhdXRob3JpemF0aW9uLiAgU3BlY2lmaWNhbGx5IGZvciBsZXZlbCAyIGV2ZXJ5IG5vbi1yZXZva2VkCitjZXJ0aWZpY2F0ZSBpcyBhY2NlcHRlZCByZWdhcmRsZXNzIG9mIGl0cyBDb21tb24gTmFtZS4gIEZvciB0aGlzIHJlYXNvbiBhCitkZWRpY2F0ZWQgXHMtMUNBXHMwIHNob3VsZCBiZSB1c2VkIHdpdGggbGV2ZWwgMiwgYW5kIG5vdCBhIGdlbmVyaWMgXHMtMUNBXHMwIGNvbW1vbmx5IHVzZWQKK2ZvciB3ZWJzZXJ2ZXJzLiAgTGV2ZWwgMyBpcyBwcmVmZXJyZWQgZm9yIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zLgorLlJFCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5JWCBIZWFkZXIgIlJFVFVSTiBWQUxVRSIKK1wmXGZCc3R1bm5lbFxmUiByZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisuU0ggIlNJR05BTFMiCisuSVggSGVhZGVyICJTSUdOQUxTIgorVGhlIGZvbGxvd2luZyBzaWduYWxzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgXGZCc3R1bm5lbFxmUiBpbiBVbml4IGVudmlyb25tZW50OgorLklQICJccy0xU0lHSFVQXHMwIiA0CisuSVggSXRlbSAiU0lHSFVQIgorRm9yY2UgYSByZWxvYWQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKy5TcAorU29tZSBnbG9iYWwgb3B0aW9ucyB3aWxsIG5vdCBiZSByZWxvYWRlZDoKKy5SUyA0CisuSVAgIlwoYnUiIDQKK2Nocm9vdAorLklQICJcKGJ1IiA0Citmb3JlZ3JvdW5kCisuSVAgIlwoYnUiIDQKK3BpZAorLklQICJcKGJ1IiA0CitzZXRnaWQKKy5JUCAiXChidSIgNAorc2V0dWlkCisuUkUKKy5SUyA0CisuU3AKK1RoZSB1c2Ugb2YgdGhlICdzZXR1aWQnIG9wdGlvbiB3aWxsIGFsc28gcHJldmVudCBcZkJzdHVubmVsXGZSIGZyb20gYmluZGluZyB0byBwcml2aWxlZ2VkCisoPDEwMjQpIHBvcnRzIGR1cmluZyBjb25maWd1cmF0aW9uIHJlbG9hZGluZy4KKy5TcAorV2hlbiB0aGUgJ2Nocm9vdCcgb3B0aW9uIGlzIHVzZWQsIFxmQnN0dW5uZWxcZlIgd2lsbCBsb29rIGZvciBhbGwgaXRzIGZpbGVzIChpbmNsdWRpbmcKK3RoZSBjb25maWd1cmF0aW9uIGZpbGUsIGNlcnRpZmljYXRlcywgdGhlIGxvZyBmaWxlIGFuZCB0aGUgcGlkIGZpbGUpIHdpdGhpbiB0aGUgY2hyb290CitqYWlsLgorLlJFCisuSVAgIlxzLTFTSUdVU1IxXHMwIiA0CisuSVggSXRlbSAiU0lHVVNSMSIKK0Nsb3NlIGFuZCByZW9wZW4gdGhlIFxmQnN0dW5uZWxcZlIgbG9nIGZpbGUuCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBsb2cgcm90YXRpb24uCisuSVAgIlxzLTFTSUdURVJNLCBTSUdRVUlULCBTSUdJTlRcczAiIDQKKy5JWCBJdGVtICJTSUdURVJNLCBTSUdRVUlULCBTSUdJTlQiCitTaHV0IFxmQnN0dW5uZWxcZlIgZG93bi4KKy5QUAorVGhlIHJlc3VsdCBvZiBzZW5kaW5nIGFueSBvdGhlciBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIgaXMgdW5kZWZpbmVkLgorLlNIICJFWEFNUExFUyIKKy5JWCBIZWFkZXIgIkVYQU1QTEVTIgorSW4gb3JkZXIgdG8gcHJvdmlkZSBccy0xU1NMXHMwIGVuY2Fwc3VsYXRpb24gdG8geW91ciBsb2NhbCBcZklpbWFwZFxmUiBzZXJ2aWNlLCB1c2U6CisuUFAKKy5WYiA0CitcJiAgICBbaW1hcGRdCitcJiAgICBhY2NlcHQgPSA5OTMKK1wmICAgIGV4ZWMgPSAvdXNyL3NiaW4vaW1hcGQKK1wmICAgIGV4ZWNBcmdzID0gaW1hcGQKKy5WZQorLlBQCitvciBpbiByZW1vdGUgbW9kZToKKy5QUAorLlZiIDMKK1wmICAgIFtpbWFwZF0KK1wmICAgIGFjY2VwdCA9IDk5MworXCYgICAgY29ubmVjdCA9IDE0MworLlZlCisuUFAKK0luIG9yZGVyIHRvIGxldCB5b3VyIGxvY2FsIGVcLW1haWwgY2xpZW50IGNvbm5lY3QgdG8gYW4gU1NMLWVuYWJsZWQgXGZJaW1hcGRcZlIKK3NlcnZpY2Ugb24gYW5vdGhlciBzZXJ2ZXIsIGNvbmZpZ3VyZSB0aGUgZVwtbWFpbCBjbGllbnQgdG8gY29ubmVjdCB0byBsb2NhbGhvc3QKK29uIHBvcnQgMTE5IGFuZCB1c2U6CisuUFAKKy5WYiA0CitcJiAgICBbaW1hcF0KK1wmICAgIGNsaWVudCA9IHllcworXCYgICAgYWNjZXB0ID0gMTQzCitcJiAgICBjb25uZWN0ID0gc2VydmVybmFtZTo5OTMKKy5WZQorLlBQCitJZiB5b3Ugd2FudCB0byBwcm92aWRlIHR1bm5lbGluZyB0byB5b3VyIFxmSXBwcGRcZlIgZGFlbW9uIG9uIHBvcnQgMjAyMCwKK3VzZSBzb21ldGhpbmcgbGlrZToKKy5QUAorLlZiIDUKK1wmICAgIFt2cG5dCitcJiAgICBhY2NlcHQgPSAyMDIwCitcJiAgICBleGVjID0gL3Vzci9zYmluL3BwcGQKK1wmICAgIGV4ZWNBcmdzID0gcHBwZCBsb2NhbAorXCYgICAgcHR5ID0geWVzCisuVmUKKy5QUAorSWYgeW91IHdhbnQgdG8gdXNlIFxmQnN0dW5uZWxcZlIgaW4gXGZJaW5ldGRcZlIgbW9kZSB0byBsYXVuY2ggeW91ciBpbWFwZAorcHJvY2VzcywgeW91J2QgdXNlIHRoaXMgXGZJc3R1bm5lbC5jb25mXGZSLgorTm90ZSB0aGVyZSBtdXN0IGJlIG5vIFxmSVtzZXJ2aWNlX25hbWVdXGZSIHNlY3Rpb24uCisuUFAKKy5WYiAyCitcJiAgICBleGVjID0gL3Vzci9zYmluL2ltYXBkCitcJiAgICBleGVjQXJncyA9IGltYXBkCisuVmUKKy5QUAorVG8gc2V0dXAgXHMtMVNPQ0tTIFZQTlxzMCBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBjbGllbnQgc2VydmljZToKKy5QUAorLlZiIDYKK1wmICAgIFtzb2Nrc19jbGllbnRdCitcJiAgICBjbGllbnQgPSB5ZXMKK1wmICAgIGFjY2VwdCA9IDEyNy4wLjAuMToxMDgwCitcJiAgICBjb25uZWN0ID0gdnBuX3NlcnZlcjo5MDgwCitcJiAgICB2ZXJpZnkgPSA0CitcJiAgICBDQWZpbGUgPSBzdHVubmVsLnBlbQorLlZlCisuUFAKK1RoZSBjb3JyZXNwb25kaW5nIGNvbmZpZ3VyYXRpb24gb24gdGhlIHZwbl9zZXJ2ZXIgaG9zdDoKKy5QUAorLlZiIDUKK1wmICAgIFtzb2Nrc19zZXJ2ZXJdCitcJiAgICBwcm90b2NvbCA9IHNvY2tzCitcJiAgICBhY2NlcHQgPSA5MDgwCitcJiAgICBjZXJ0ID0gc3R1bm5lbC5wZW0KK1wmICAgIGtleSA9IHN0dW5uZWwua2V5CisuVmUKKy5QUAorTm93IHRlc3QgeW91ciBjb25maWd1cmF0aW9uIG9uIHRoZSBjbGllbnQgbWFjaGluZSB3aXRoOgorLlBQCisuVmIgMQorXCYgICAgY3VybCBcLVwtc29ja3M0YSBsb2NhbGhvc3QgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8KKy5WZQorLlNIICJOT1RFUyIKKy5JWCBIZWFkZXIgIk5PVEVTIgorLlNTICJccy0xUkVTVFJJQ1RJT05TXHMwIgorLklYIFN1YnNlY3Rpb24gIlJFU1RSSUNUSU9OUyIKK1wmXGZCc3R1bm5lbFxmUiBjYW5ub3QgYmUgdXNlZCBmb3IgdGhlIFxzLTFGVFBcczAgZGFlbW9uIGJlY2F1c2Ugb2YgdGhlIG5hdHVyZQorb2YgdGhlIFxzLTFGVFBcczAgcHJvdG9jb2wgd2hpY2ggdXRpbGl6ZXMgbXVsdGlwbGUgcG9ydHMgZm9yIGRhdGEgdHJhbnNmZXJzLgorVGhlcmUgYXJlIGF2YWlsYWJsZSBTU0wtZW5hYmxlZCB2ZXJzaW9ucyBvZiBccy0xRlRQXHMwIGFuZCB0ZWxuZXQgZGFlbW9ucywgaG93ZXZlci4KKy5TUyAiXHMtMUlORVREIE1PREVcczAiCisuSVggU3Vic2VjdGlvbiAiSU5FVEQgTU9ERSIKK1RoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgXGZCc3R1bm5lbFxmUiBpcyB0byBsaXN0ZW4gb24gYSBuZXR3b3JrCitwb3J0IGFuZCBlc3RhYmxpc2ggY29tbXVuaWNhdGlvbiB3aXRoIGVpdGhlciBhIG5ldyBwb3J0Cit2aWEgdGhlIGNvbm5lY3Qgb3B0aW9uLCBvciBhIG5ldyBwcm9ncmFtIHZpYSB0aGUgXGZJZXhlY1xmUiBvcHRpb24uCitIb3dldmVyIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoZW4geW91IHdpc2ggdG8gaGF2ZQorc29tZSBvdGhlciBwcm9ncmFtIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQKK2xhdW5jaCBcZkJzdHVubmVsXGZSLCBmb3IgZXhhbXBsZSB3aXRoIFxmSWluZXRkXGZSLCBcZkl4aW5ldGRcZlIsCitvciBcZkl0Y3BzZXJ2ZXJcZlIuCisuUFAKK0ZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gXGZJaW5ldGQuY29uZlxmUjoKKy5QUAorLlZiIDEKK1wmICAgIGltYXBzIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgQGJpbmRpckAvc3R1bm5lbCBzdHVubmVsIEBzeXNjb25mZGlyQC9zdHVubmVsL2ltYXBzLmNvbmYKKy5WZQorLlBQCitJbiB0aGVzZSBjYXNlcywgdGhlIFxmSWluZXRkXGZSXC1zdHlsZSBwcm9ncmFtIGlzIHJlc3BvbnNpYmxlCitmb3IgYmluZGluZyBhIG5ldHdvcmsgc29ja2V0IChcZklpbWFwc1xmUiBhYm92ZSkgYW5kIGhhbmRpbmcKK2l0IHRvIFxmQnN0dW5uZWxcZlIgd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmVjZWl2ZWQuCitUaHVzIHlvdSBkbyBub3Qgd2FudCBcZkJzdHVubmVsXGZSIHRvIGhhdmUgYW55IFxmSWFjY2VwdFxmUiBvcHRpb24uCitBbGwgdGhlIFxmSVNlcnZpY2UgTGV2ZWwgT3B0aW9uc1xmUiBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQorZ2xvYmFsIG9wdGlvbnMgc2VjdGlvbiwgYW5kIG5vIFxmSVtzZXJ2aWNlX25hbWVdXGZSIHNlY3Rpb24KK3dpbGwgYmUgcHJlc2VudC4gIFNlZSB0aGUgXGZJXHMtMUVYQU1QTEVTXHMwXGZSIHNlY3Rpb24gZm9yIGV4YW1wbGUKK2NvbmZpZ3VyYXRpb25zLgorLlNTICJccy0xQ0VSVElGSUNBVEVTXHMwIgorLklYIFN1YnNlY3Rpb24gIkNFUlRJRklDQVRFUyIKK0VhY2ggU1NMLWVuYWJsZWQgZGFlbW9uIG5lZWRzIHRvIHByZXNlbnQgYSB2YWxpZCBYLjUwOSBjZXJ0aWZpY2F0ZQordG8gdGhlIHBlZXIuIEl0IGFsc28gbmVlZHMgYSBwcml2YXRlIGtleSB0byBkZWNyeXB0IHRoZSBpbmNvbWluZworZGF0YS4gVGhlIGVhc2llc3Qgd2F5IHRvIG9idGFpbiBhIGNlcnRpZmljYXRlIGFuZCBhIGtleSBpcyB0byAKK2dlbmVyYXRlIHRoZW0gd2l0aCB0aGUgZnJlZSBcZkJPcGVuU1NMXGZSIHBhY2thZ2UuIFlvdSBjYW4gZmluZCBtb3JlCitpbmZvcm1hdGlvbiBvbiBjZXJ0aWZpY2F0ZXMgZ2VuZXJhdGlvbiBvbiBwYWdlcyBsaXN0ZWQgYmVsb3cuCisuUFAKK1RoZSBvcmRlciBvZiBjb250ZW50cyBvZiB0aGUgXGZJLnBlbVxmUiBmaWxlIGlzIGltcG9ydGFudC4gIEl0IHNob3VsZCBjb250YWluIHRoZQordW5lbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgZmlyc3QsIHRoZW4gYSBzaWduZWQgY2VydGlmaWNhdGUgKG5vdCBjZXJ0aWZpY2F0ZQorcmVxdWVzdCkuICBUaGVyZSBzaG91bGQgYWxzbyBiZSBlbXB0eSBsaW5lcyBhZnRlciB0aGUgY2VydGlmaWNhdGUgYW5kIHRoZSBwcml2YXRlIGtleS4KK0FueSBwbGFpbnRleHQgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gYXBwZW5kZWQgb24gdGhlIHRvcCBvZiBnZW5lcmF0ZWQgY2VydGlmaWNhdGUKK3Nob3VsZCBiZSBkaXNjYXJkZWQuIFNvIHRoZSBmaWxlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKKy5QUAorLlZiIDgKK1wmICAgIFwtXC1cLVwtXC1CRUdJTiBSU0EgUFJJVkFURSBLRVlcLVwtXC1cLVwtCitcJiAgICBbZW5jb2RlZCBrZXldCitcJiAgICBcLVwtXC1cLVwtRU5EIFJTQSBQUklWQVRFIEtFWVwtXC1cLVwtXC0KK1wmICAgIFtlbXB0eSBsaW5lXQorXCYgICAgXC1cLVwtXC1cLUJFR0lOIENFUlRJRklDQVRFXC1cLVwtXC1cLQorXCYgICAgW2VuY29kZWQgY2VydGlmaWNhdGVdCitcJiAgICBcLVwtXC1cLVwtRU5EIENFUlRJRklDQVRFXC1cLVwtXC1cLQorXCYgICAgW2VtcHR5IGxpbmVdCisuVmUKKy5TUyAiXHMtMVJBTkRPTU5FU1NcczAiCisuSVggU3Vic2VjdGlvbiAiUkFORE9NTkVTUyIKK1wmXGZCc3R1bm5lbFxmUiBuZWVkcyB0byBzZWVkIHRoZSBccy0xUFJORyBcczAocHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yKSBpbgorb3JkZXIgZm9yIFxzLTFTU0xcczAgdG8gdXNlIGdvb2QgcmFuZG9tbmVzcy4gIFRoZSBmb2xsb3dpbmcgc291cmNlcyBhcmUgbG9hZGVkCitpbiBvcmRlciB1bnRpbCBzdWZmaWNpZW50IHJhbmRvbSBkYXRhIGhhcyBiZWVuIGdhdGhlcmVkOgorLklQICJcKGJ1IiA0CitUaGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgXGZJUk5EZmlsZVxmUiBmbGFnLgorLklQICJcKGJ1IiA0CitUaGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIFxzLTFSQU5ERklMRVxzMCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LgorLklQICJcKGJ1IiA0CitUaGUgZmlsZSAucm5kIGluIHlvdXIgaG9tZSBkaXJlY3RvcnksIGlmIFxzLTFSQU5ERklMRVxzMCBub3Qgc2V0LgorLklQICJcKGJ1IiA0CitUaGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAnXC1cLXdpdGhcLXJhbmRvbScgYXQgY29tcGlsZSB0aW1lLgorLklQICJcKGJ1IiA0CitUaGUgY29udGVudHMgb2YgdGhlIHNjcmVlbiBpZiBydW5uaW5nIG9uIFdpbmRvd3MuCisuSVAgIlwoYnUiIDQKK1RoZSBlZ2Qgc29ja2V0IHNwZWNpZmllZCB3aXRoIHRoZSBcZklccy0xRUdEXHMwXGZSIGZsYWcuCisuSVAgIlwoYnUiIDQKK1RoZSBlZ2Qgc29ja2V0IHNwZWNpZmllZCB3aXRoICdcLVwtd2l0aFwtZWdkXC1zb2NrJyBhdCBjb21waWxlIHRpbWUuCisuSVAgIlwoYnUiIDQKK1RoZSAvZGV2L3VyYW5kb20gZGV2aWNlLgorLlBQCitXaXRoIHJlY2VudCAoXGZCT3BlblNTTCAwLjkuNWFcZlIgb3IgbGF0ZXIpIHZlcnNpb24gb2YgXHMtMVNTTFxzMCBpdCB3aWxsIHN0b3AgbG9hZGluZworcmFuZG9tIGRhdGEgYXV0b21hdGljYWxseSB3aGVuIHN1ZmZpY2llbnQgZW50cm9weSBoYXMgYmVlbiBnYXRoZXJlZC4gIFdpdGgKK3ByZXZpb3VzIHZlcnNpb25zIGl0IHdpbGwgY29udGludWUgdG8gZ2F0aGVyIGZyb20gYWxsIHRoZSBhYm92ZSBzb3VyY2VzIHNpbmNlCitubyBccy0xU1NMXHMwIGZ1bmN0aW9uIGV4aXN0cyB0byB0ZWxsIHdoZW4gZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlLgorLlBQCitOb3RlIHRoYXQgb24gV2luZG93cyBtYWNoaW5lcyB0aGF0IGRvIG5vdCBoYXZlIGNvbnNvbGUgdXNlciBpbnRlcmFjdGlvbgorKG1vdXNlIG1vdmVtZW50cywgY3JlYXRpbmcgd2luZG93cywgZXRjLikgdGhlIHNjcmVlbiBjb250ZW50cyBhcmUgbm90Cit2YXJpYWJsZSBlbm91Z2ggdG8gYmUgc3VmZmljaWVudCwgYW5kIHlvdSBzaG91bGQgcHJvdmlkZSBhIHJhbmRvbSBmaWxlCitmb3IgdXNlIHdpdGggdGhlIFxmSVJORGZpbGVcZlIgZmxhZy4KKy5QUAorTm90ZSB0aGF0IHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSBcZklSTkRmaWxlXGZSIGZsYWcgc2hvdWxkIGNvbnRhaW4KK3JhbmRvbSBkYXRhIFwqKC0tIHRoYXQgbWVhbnMgaXQgc2hvdWxkIGNvbnRhaW4gZGlmZmVyZW50IGluZm9ybWF0aW9uCitlYWNoIHRpbWUgXGZCc3R1bm5lbFxmUiBpcyBydW4uICBUaGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseQordW5sZXNzIHRoZSBcZklSTkRvdmVyd3JpdGVcZlIgZmxhZyBpcyB1c2VkLiAgSWYgeW91IHdpc2ggdG8gdXBkYXRlIHRoaXMgZmlsZQorbWFudWFsbHksIHRoZSBcZklvcGVuc3NsIHJhbmRcZlIgY29tbWFuZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgXGZCT3BlblNTTFxmUiwKK3dvdWxkIGJlIHVzZWZ1bC4KKy5QUAorSW1wb3J0YW50IG5vdGU6IElmIC9kZXYvdXJhbmRvbSBpcyBhdmFpbGFibGUsIFxmQk9wZW5TU0xcZlIgb2Z0ZW4gc2VlZHMgdGhlIFxzLTFQUk5HXHMwCit3aXRoIGl0IHdoaWxlIGNoZWNraW5nIHRoZSByYW5kb20gc3RhdGUuICBPbiBzeXN0ZW1zIHdpdGggL2Rldi91cmFuZG9tCitcJlxmQk9wZW5TU0xcZlIgaXMgbGlrZWx5IHRvIHVzZSBpdCBldmVuIHRob3VnaCBpdCBpcyBsaXN0ZWQgYXQgdGhlIHZlcnkgYm90dG9tIG9mCit0aGUgbGlzdCBhYm92ZS4gIFRoaXMgaXMgdGhlIGJlaGF2aW91ciBvZiBcZkJPcGVuU1NMXGZSIGFuZCBub3QgXGZCc3R1bm5lbFxmUi4KKy5TUyAiXHMtMURIIFBBUkFNRVRFUlNcczAiCisuSVggU3Vic2VjdGlvbiAiREggUEFSQU1FVEVSUyIKK1wmXGZCc3R1bm5lbFxmUiA0LjQwIGFuZCBsYXRlciBjb250YWlucyBoYXJkY29kZWQgMjA0OFwtYml0IFxzLTFESFxzMCBwYXJhbWV0ZXJzLiAgU3RhcnRpbmcKK3dpdGggXGZCc3R1bm5lbFxmUiA1LjE4LCB0aGVzZSBoYXJkY29kZWQgXHMtMURIXHMwIHBhcmFtZXRlcnMgYXJlIHJlcGxhY2VkIGV2ZXJ5IDI0IGhvdXJzCit3aXRoIGF1dG9nZW5lcmF0ZWQgdGVtcG9yYXJ5IFxzLTFESFxzMCBwYXJhbWV0ZXJzLiAgXHMtMURIXHMwIHBhcmFtZXRlciBnZW5lcmF0aW9uIG1heSB0YWtlCitzZXZlcmFsIG1pbnV0ZXMuCisuUFAKK0FsdGVybmF0aXZlbHksIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgc3RhdGljIFxzLTFESFxzMCBwYXJhbWV0ZXJzIGluIHRoZQorY2VydGlmaWNhdGUgZmlsZSwgd2hpY2ggZGlzYWJsZXMgZ2VuZXJhdGluZyB0ZW1wb3JhcnkgXHMtMURIXHMwIHBhcmFtZXRlcnM6CisuUFAKKy5WYiAxCitcJiAgICBvcGVuc3NsIGRocGFyYW0gMjA0OCA+PiBzdHVubmVsLnBlbQorLlZlCisuU0ggIkZJTEVTIgorLklYIEhlYWRlciAiRklMRVMiCisuaWUgbiAuSVAgIlxmSVxmSUBzeXNjb25mZGlyXGZJQC9zdHVubmVsL3N0dW5uZWwuY29uZlxmUiIgNAorLmVsIC5JUCAiXGZJXGYoQ0lAc3lzY29uZmRpclxmSUAvc3R1bm5lbC9zdHVubmVsLmNvbmZcZlIiIDQKKy5JWCBJdGVtICJAc3lzY29uZmRpckAvc3R1bm5lbC9zdHVubmVsLmNvbmYiCitcJlxmQnN0dW5uZWxcZlIgY29uZmlndXJhdGlvbiBmaWxlCisuU0ggIkJVR1MiCisuSVggSGVhZGVyICJCVUdTIgorVGhlIFxmSWV4ZWNBcmdzXGZSIG9wdGlvbiBhbmQgdGhlIFdpbjMyIGNvbW1hbmQgbGluZSBkbyBub3Qgc3VwcG9ydCBxdW90aW5nLgorLlNIICJTRUUgQUxTTyIKKy5JWCBIZWFkZXIgIlNFRSBBTFNPIgorLklQICJcZkl0Y3BkXGZSXHwoOCkiIDQKKy5JWCBJdGVtICJ0Y3BkIgorYWNjZXNzIGNvbnRyb2wgZmFjaWxpdHkgZm9yIGludGVybmV0IHNlcnZpY2VzCisuSVAgIlxmSWluZXRkXGZSXHwoOCkiIDQKKy5JWCBJdGVtICJpbmV0ZCIKK2ludGVybmV0ICdzdXBlclwtc2VydmVyJworLklQICJcZklodHRwOi8vd3d3LnN0dW5uZWwub3JnL1xmUiIgNAorLklYIEl0ZW0gImh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvIgorXCZcZkJzdHVubmVsXGZSIGhvbWVwYWdlCisuSVAgIlxmSWh0dHA6Ly93d3cub3BlbnNzbC5vcmcvXGZSIiA0CisuSVggSXRlbSAiaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8iCitcJlxmQk9wZW5TU0xcZlIgcHJvamVjdCB3ZWJzaXRlCisuU0ggIkFVVEhPUiIKKy5JWCBIZWFkZXIgIkFVVEhPUiIKKy5JUCAiTWljaGHFgiBUcm9qbmFyYSIgNAorLklYIEl0ZW0gIk1pY2hhxYIgVHJvam5hcmEiCis8XGZJTWljaGFsLlRyb2puYXJhQG1pcnQubmV0XGZSPgpkaWZmIC0tZ2l0IGEvZG9jL3N0dW5uZWwuaHRtbC5pbiBiL2RvYy9zdHVubmVsLmh0bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5YWRkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdHVubmVsLmh0bWwuaW4KQEAgLTAsMCArMSwxNDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzx0aXRsZT5zdHVubmVsIFRMUyBQcm94eTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKzxsaW5rIHJldj0ibWFkZSIgaHJlZj0ibWFpbHRvOnJvb3RAbG9jYWxob3N0IiAvPgorPC9oZWFkPgorCis8Ym9keSBpZD0iX3BvZHRvcF8iPgorPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+Cis8dHI+PHRkIGNsYXNzPSJfcG9kYmxvY2tfIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsgY29sb3I6ICMwMDAiIHZhbGlnbj0ibWlkZGxlIj4KKzxiaWc+PHN0cm9uZz48c3BhbiBjbGFzcz0iX3BvZGJsb2NrXyI+Jm5ic3A7c3R1bm5lbCBUTFMgUHJveHk8L3NwYW4+PC9zdHJvbmc+PC9iaWc+Cis8L3RkPjwvdHI+Cis8L3RhYmxlPgorCisKKworPHVsIGlkPSJpbmRleCI+CisgIDxsaT48YSBocmVmPSIjTkFNRSI+TkFNRTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1NZTk9QU0lTIj5TWU5PUFNJUzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0RFU0NSSVBUSU9OIj5ERVNDUklQVElPTjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI09QVElPTlMiPk9QVElPTlM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNDT05GSUdVUkFUSU9OLUZJTEUiPkNPTkZJR1VSQVRJT04gRklMRTwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI0dMT0JBTC1PUFRJT05TIj5HTE9CQUwgT1BUSU9OUzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNTRVJWSUNFLUxFVkVMLU9QVElPTlMiPlNFUlZJQ0UtTEVWRUwgT1BUSU9OUzwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSIjUkVUVVJOLVZBTFVFIj5SRVRVUk4gVkFMVUU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNTSUdOQUxTIj5TSUdOQUxTPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjRVhBTVBMRVMiPkVYQU1QTEVTPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjTk9URVMiPk5PVEVTPC9hPgorICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjUkVTVFJJQ1RJT05TIj5SRVNUUklDVElPTlM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjSU5FVEQtTU9ERSI+SU5FVEQgTU9ERTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNDRVJUSUZJQ0FURVMiPkNFUlRJRklDQVRFUzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNSQU5ET01ORVNTIj5SQU5ET01ORVNTPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0RILVBBUkFNRVRFUlMiPkRIIFBBUkFNRVRFUlM8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iI0ZJTEVTIj5GSUxFUzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0JVR1MiPkJVR1M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNTRUUtQUxTTyI+U0VFIEFMU088L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNBVVRIT1IiPkFVVEhPUjwvYT48L2xpPgorPC91bD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9Ik5BTUUiPk5BTUU8L2gxPjwvYT4KKworPHA+c3R1bm5lbCAtIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eTwvcD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IlNZTk9QU0lTIj5TWU5PUFNJUzwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0iVW5peCI+PGI+VW5peDo8L2I+PC9kdD4KKzxkZD4KKworPHA+PGI+c3R1bm5lbDwvYj4gWzxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+RklMRTwvc3Bhbj5dIHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tZmQgTjwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1oZWxwPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LXZlcnNpb248L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tc29ja2V0czwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1vcHRpb25zPC9zcGFuPjwvcD4KKworPC9kZD4KKzxkdCBpZD0iV0lOMzIiPjxiPldJTjMyOjwvYj48L2R0PgorPGRkPgorCis8cD48Yj5zdHVubmVsPC9iPiBbIFsgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4taW5zdGFsbDwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi11bmluc3RhbGw8L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tc3RhcnQ8L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tc3RvcDwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1yZWxvYWQ8L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tcmVvcGVuPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LWV4aXQ8L3NwYW4+IF0gWzxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LXF1aWV0PC9zcGFuPl0gWzxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+RklMRTwvc3Bhbj5dIF0gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1oZWxwPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LXZlcnNpb248L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tc29ja2V0czwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1vcHRpb25zPC9zcGFuPjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJERVNDUklQVElPTiI+REVTQ1JJUFRJT048L2gxPjwvYT4KKworPHA+VGhlIDxiPnN0dW5uZWw8L2I+IHByb2dyYW0gaXMgZGVzaWduZWQgdG8gd29yayBhcyA8aT5TU0w8L2k+IGVuY3J5cHRpb24gd3JhcHBlciBiZXR3ZWVuIHJlbW90ZSBjbGllbnRzIGFuZCBsb2NhbCAoPGk+aW5ldGQ8L2k+LXN0YXJ0YWJsZSkgb3IgcmVtb3RlIHNlcnZlcnMuIFRoZSBjb25jZXB0IGlzIHRoYXQgaGF2aW5nIG5vbi1TU0wgYXdhcmUgZGFlbW9ucyBydW5uaW5nIG9uIHlvdXIgc3lzdGVtIHlvdSBjYW4gZWFzaWx5IHNldCB0aGVtIHVwIHRvIGNvbW11bmljYXRlIHdpdGggY2xpZW50cyBvdmVyIHNlY3VyZSBTU0wgY2hhbm5lbHMuPC9wPgorCis8cD48Yj5zdHVubmVsPC9iPiBjYW4gYmUgdXNlZCB0byBhZGQgU1NMIGZ1bmN0aW9uYWxpdHkgdG8gY29tbW9ubHkgdXNlZCA8aT5JbmV0ZDwvaT4gZGFlbW9ucyBsaWtlIFBPUC0yLCBQT1AtMywgYW5kIElNQVAgc2VydmVycywgdG8gc3RhbmRhbG9uZSBkYWVtb25zIGxpa2UgTk5UUCwgU01UUCBhbmQgSFRUUCwgYW5kIGluIHR1bm5lbGluZyBQUFAgb3ZlciBuZXR3b3JrIHNvY2tldHMgd2l0aG91dCBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgY29kZS48L3A+CisKKzxwPlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pPC9wPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iT1BUSU9OUyI+T1BUSU9OUzwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0iRklMRSI+PGI+RklMRTwvYj48L2R0PgorPGRkPgorCis8cD5Vc2Ugc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZmlsZTwvcD4KKworPC9kZD4KKzxkdCBpZD0iZmQtTi1Vbml4LW9ubHkiPjxiPi1mZCBOPC9iPiAoVW5peCBvbmx5KTwvZHQ+Cis8ZGQ+CisKKzxwPlJlYWQgdGhlIGNvbmZpZyBmaWxlIGZyb20gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcjwvcD4KKworPC9kZD4KKzxkdCBpZD0iaGVscCI+PGI+LWhlbHA8L2I+PC9kdD4KKzxkZD4KKworPHA+UHJpbnQgPGI+c3R1bm5lbDwvYj4gaGVscCBtZW51PC9wPgorCis8L2RkPgorPGR0IGlkPSJ2ZXJzaW9uIj48Yj4tdmVyc2lvbjwvYj48L2R0PgorPGRkPgorCis8cD5QcmludCA8Yj5zdHVubmVsPC9iPiB2ZXJzaW9uIGFuZCBjb21waWxlIHRpbWUgZGVmYXVsdHM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNvY2tldHMiPjxiPi1zb2NrZXRzPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPlByaW50IGRlZmF1bHQgc29ja2V0IG9wdGlvbnM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im9wdGlvbnMiPjxiPi1vcHRpb25zPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPlByaW50IHN1cHBvcnRlZCBTU0wgb3B0aW9uczwvcD4KKworPC9kZD4KKzxkdCBpZD0iaW5zdGFsbC1XaW5kb3dzLU5ULWFuZC1sYXRlci1vbmx5Ij48Yj4taW5zdGFsbDwvYj4gKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+SW5zdGFsbCBOVCBTZXJ2aWNlPC9wPgorCis8L2RkPgorPGR0IGlkPSJ1bmluc3RhbGwtV2luZG93cy1OVC1hbmQtbGF0ZXItb25seSI+PGI+LXVuaW5zdGFsbDwvYj4gKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+VW5pbnN0YWxsIE5UIFNlcnZpY2U8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InN0YXJ0LVdpbmRvd3MtTlQtYW5kLWxhdGVyLW9ubHkiPjxiPi1zdGFydDwvYj4gKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+U3RhcnQgTlQgU2VydmljZTwvcD4KKworPC9kZD4KKzxkdCBpZD0ic3RvcC1XaW5kb3dzLU5ULWFuZC1sYXRlci1vbmx5Ij48Yj4tc3RvcDwvYj4gKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+U3RvcCBOVCBTZXJ2aWNlPC9wPgorCis8L2RkPgorPGR0IGlkPSJyZWxvYWQtV2luZG93cy1OVC1hbmQtbGF0ZXItb25seSI+PGI+LXJlbG9hZDwvYj4gKFdpbmRvd3MgTlQgYW5kIGxhdGVyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+UmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIHJ1bm5pbmcgTlQgU2VydmljZTwvcD4KKworPC9kZD4KKzxkdCBpZD0icmVvcGVuLVdpbmRvd3MtTlQtYW5kLWxhdGVyLW9ubHkiPjxiPi1yZW9wZW48L2I+IChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KTwvZHQ+Cis8ZGQ+CisKKzxwPlJlb3BlbiB0aGUgbG9nIGZpbGUgb2YgdGhlIHJ1bm5pbmcgTlQgU2VydmljZTwvcD4KKworPC9kZD4KKzxkdCBpZD0iZXhpdC1XaW4zMi1vbmx5Ij48Yj4tZXhpdDwvYj4gKFdpbjMyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+RXhpdCBhbiBhbHJlYWR5IHN0YXJ0ZWQgc3R1bm5lbDwvcD4KKworPC9kZD4KKzxkdCBpZD0icXVpZXQtV2luMzItb25seSI+PGI+LXF1aWV0PC9iPiAoV2luMzIgb25seSk8L2R0PgorPGRkPgorCis8cD5Eb24mIzM5O3QgZGlzcGxheSBhbnkgbWVzc2FnZSBib3hlczwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJDT05GSUdVUkFUSU9OLUZJTEUiPkNPTkZJR1VSQVRJT04gRklMRTwvaDE+PC9hPgorCis8cD5FYWNoIGxpbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUgZWl0aGVyOjwvcD4KKworPHVsPgorCis8bGk+PHA+QW4gZW1wdHkgbGluZSAoaWdub3JlZCkuPC9wPgorCis8L2xpPgorPGxpPjxwPkEgY29tbWVudCBzdGFydGluZyB3aXRoICYjMzk7OyYjMzk7IChpZ25vcmVkKS48L3A+CisKKzwvbGk+Cis8bGk+PHA+QW4gJiMzOTtvcHRpb25fbmFtZSA9IG9wdGlvbl92YWx1ZSYjMzk7IHBhaXIuPC9wPgorCis8L2xpPgorPGxpPjxwPiYjMzk7W3NlcnZpY2VfbmFtZV0mIzM5OyBpbmRpY2F0aW5nIGEgc3RhcnQgb2YgYSBzZXJ2aWNlIGRlZmluaXRpb24uPC9wPgorCis8L2xpPgorPC91bD4KKworPHA+QW4gYWRkcmVzcyBwYXJhbWV0ZXIgb2YgYW4gb3B0aW9uIG1heSBiZSBlaXRoZXI6PC9wPgorCis8dWw+CisKKzxsaT48cD5BIHBvcnQgbnVtYmVyLjwvcD4KKworPC9saT4KKzxsaT48cD5BIGNvbG9uLXNlcGFyYXRlZCBwYWlyIG9mIElQIGFkZHJlc3MgKGVpdGhlciBJUHY0LCBJUHY2LCBvciBkb21haW4gbmFtZSkgYW5kIHBvcnQgbnVtYmVyLjwvcD4KKworPC9saT4KKzxsaT48cD5BIFVuaXggc29ja2V0IHBhdGggKFVuaXggb25seSkuPC9wPgorCis8L2xpPgorPC91bD4KKworPGgyIGlkPSJHTE9CQUwtT1BUSU9OUyI+R0xPQkFMIE9QVElPTlM8L2gyPgorCis8ZGw+CisKKzxkdCBpZD0iY2hyb290LURJUkVDVE9SWS1Vbml4LW9ubHkiPjxiPmNocm9vdDwvYj4gPSBESVJFQ1RPUlkgKFVuaXggb25seSk8L2R0PgorPGRkPgorCis8cD5kaXJlY3RvcnkgdG8gY2hyb290IDxiPnN0dW5uZWw8L2I+IHByb2Nlc3M8L3A+CisKKzxwPjxiPmNocm9vdDwvYj4ga2VlcHMgPGI+c3R1bm5lbDwvYj4gaW4gYSBjaHJvb3RlZCBqYWlsLiA8aT5DQXBhdGg8L2k+LCA8aT5DUkxwYXRoPC9pPiwgPGk+cGlkPC9pPiBhbmQgPGk+ZXhlYzwvaT4gYXJlIGxvY2F0ZWQgaW5zaWRlIHRoZSBqYWlsIGFuZCB0aGUgcGF0Y2hlcyBoYXZlIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHdpdGggPGI+Y2hyb290PC9iPi48L3A+CisKKzxwPlNldmVyYWwgZnVuY3Rpb25zIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFsc28gbmVlZCB0aGVpciBmaWxlcyB0byBiZSBsb2NhdGVkIHdpdGhpbiB0aGUgY2hyb290IGphaWwsIGUuZy46PC9wPgorCis8dWw+CisKKzxsaT48cD5EZWxheWVkIHJlc29sdmVyIHR5cGljYWxseSBuZWVkcyAvZXRjL25zc3dpdGNoLmNvbmYgYW5kIC9ldGMvcmVzb2x2LmNvbmYuPC9wPgorCis8L2xpPgorPGxpPjxwPkxvY2FsIHRpbWUgaW4gbG9nIGZpbGVzIG5lZWRzIC9ldGMvdGltZXpvbmUuPC9wPgorCis8L2xpPgorPGxpPjxwPlNvbWUgb3RoZXIgZnVuY3Rpb25zIG1heSBuZWVkIGRldmljZXMsIGUuZy4gL2Rldi96ZXJvIG9yIC9kZXYvbnVsbC48L3A+CisKKzwvbGk+Cis8L3VsPgorCis8L2RkPgorPGR0IGlkPSJjb21wcmVzc2lvbi1kZWZsYXRlLXpsaWIiPjxiPmNvbXByZXNzaW9uPC9iPiA9IGRlZmxhdGUgfCB6bGliPC9kdD4KKzxkZD4KKworPHA+c2VsZWN0IGRhdGEgY29tcHJlc3Npb24gYWxnb3JpdGhtPC9wPgorCis8cD5kZWZhdWx0OiBubyBjb21wcmVzc2lvbjwvcD4KKworPHA+ZGVmbGF0ZSBpcyB0aGUgc3RhbmRhcmQgY29tcHJlc3Npb24gbWV0aG9kIGFzIGRlc2NyaWJlZCBpbiBSRkMgMTk1MS48L3A+CisKKzxwPnpsaWIgY29tcHJlc3Npb24gb2YgPGI+T3BlblNTTCAwLjkuODwvYj4gb3IgYWJvdmUgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCA8Yj5PcGVuU1NMIDAuOS43PC9iPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImRlYnVnLUZBQ0lMSVRZLi1MRVZFTCI+PGI+ZGVidWc8L2I+ID0gW0ZBQ0lMSVRZLl1MRVZFTDwvZHQ+Cis8ZGQ+CisKKzxwPmRlYnVnZ2luZyBsZXZlbDwvcD4KKworPHA+TGV2ZWwgaXMgb25lIG9mIHRoZSBzeXNsb2cgbGV2ZWwgbmFtZXMgb3IgbnVtYmVycyBlbWVyZyAoMCksIGFsZXJ0ICgxKSwgY3JpdCAoMiksIGVyciAoMyksIHdhcm5pbmcgKDQpLCBub3RpY2UgKDUpLCBpbmZvICg2KSwgb3IgZGVidWcgKDcpLiBBbGwgbG9ncyBmb3IgdGhlIHNwZWNpZmllZCBsZXZlbCBhbmQgYWxsIGxldmVscyBudW1lcmljYWxseSBsZXNzIHRoYW4gaXQgd2lsbCBiZSBzaG93bi4gVXNlIDxpPmRlYnVnID0gZGVidWc8L2k+IG9yIDxpPmRlYnVnID0gNzwvaT4gZm9yIGdyZWF0ZXN0IGRlYnVnZ2luZyBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIG5vdGljZSAoNSkuPC9wPgorCis8cD5UaGUgc3lzbG9nIGZhY2lsaXR5ICYjMzk7ZGFlbW9uJiMzOTsgd2lsbCBiZSB1c2VkIHVubGVzcyBhIGZhY2lsaXR5IG5hbWUgaXMgc3VwcGxpZWQuIChGYWNpbGl0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbjMyLik8L3A+CisKKzxwPkNhc2UgaXMgaWdub3JlZCBmb3IgYm90aCBmYWNpbGl0aWVzIGFuZCBsZXZlbHMuPC9wPgorCis8L2RkPgorPGR0IGlkPSJFR0QtRUdEX1BBVEgtVW5peC1vbmx5Ij48Yj5FR0Q8L2I+ID0gRUdEX1BBVEggKFVuaXggb25seSk8L2R0PgorPGRkPgorCis8cD5wYXRoIHRvIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQ8L3A+CisKKzxwPkVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgdG8gdXNlIHRvIGZlZWQgdGhlIDxiPk9wZW5TU0w8L2I+IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAoQXZhaWxhYmxlIG9ubHkgaWYgY29tcGlsZWQgd2l0aCA8Yj5PcGVuU1NMIDAuOS41YTwvYj4gb3IgaGlnaGVyKTwvcD4KKworPC9kZD4KKzxkdCBpZD0iZW5naW5lLWF1dG8tRU5HSU5FX0lEIj48Yj5lbmdpbmU8L2I+ID0gYXV0byB8IEVOR0lORV9JRDwvZHQ+Cis8ZGQ+CisKKzxwPnNlbGVjdCBoYXJkd2FyZSBlbmdpbmU8L3A+CisKKzxwPmRlZmF1bHQ6IHNvZnR3YXJlLW9ubHkgY3J5cHRvZ3JhcGh5PC9wPgorCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYWR2YW5jZWQgZW5naW5lIGNvbmZpZ3VyYXRpb24gdG8gcmVhZCB0aGUgcHJpdmF0ZSBrZXkgZnJvbSBhbiBPcGVuU0MgZW5naW5lPC9wPgorCis8cHJlPjxjb2RlPiAgICBlbmdpbmU9ZHluYW1pYworICAgIGVuZ2luZUN0cmw9U09fUEFUSDovdXNyL2xpYi9vcGVuc2MvZW5naW5lX3BrY3MxMS5zbworICAgIGVuZ2luZUN0cmw9SUQ6cGtjczExCisgICAgZW5naW5lQ3RybD1MSVNUX0FERDoxCisgICAgZW5naW5lQ3RybD1MT0FECisgICAgZW5naW5lQ3RybD1NT0RVTEVfUEFUSDovdXNyL2xpYi9wa2NzMTEvb3BlbnNjLXBrY3MxMS5zbworICAgIGVuZ2luZUN0cmw9SU5JVAorCisgICAgW3NlcnZpY2VdCisgICAgZW5naW5lTnVtPTEKKyAgICBrZXk9aWRfNDU8L2NvZGU+PC9wcmU+CisKKzwvZGQ+Cis8ZHQgaWQ9ImVuZ2luZUN0cmwtQ09NTUFORC06UEFSQU1FVEVSIj48Yj5lbmdpbmVDdHJsPC9iPiA9IENPTU1BTkRbOlBBUkFNRVRFUl08L2R0PgorPGRkPgorCis8cD5jb250cm9sIGhhcmR3YXJlIGVuZ2luZTwvcD4KKworPHA+U3BlY2lhbCBjb21tYW5kcyAmcXVvdDtMT0FEJnF1b3Q7IGFuZCAmcXVvdDtJTklUJnF1b3Q7IGNhbiBiZSB1c2VkIHRvIGxvYWQgYW5kIGluaXRpYWxpemUgdGhlIGVuZ2luZSBjcnlwdG9nYXBoaWMgbW9kdWxlLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iZW5naW5lRGVmYXVsdC1UQVNLX0xJU1QiPjxiPmVuZ2luZURlZmF1bHQ8L2I+ID0gVEFTS19MSVNUPC9kdD4KKzxkZD4KKworPHA+c2V0IE9wZW5TU0wgdGFza3MgZGVsZWdhdGVkIHRvIHRoZSBjdXJyZW50IGVuZ2luZTwvcD4KKworPHA+VGhlIHBhcmFtZXRlciBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrIHRvIGJlIGRlbGVnYXRlZCB0byB0aGUgY3VycmVudCBlbmdpbmUuPC9wPgorCis8cD5UaGUgZm9sbG93aW5nIHRhc2tzIG1heSBiZSBhdmFpbGFibGUsIGlmIHN1cHBvcnRlZCBieSB0aGUgZW5naW5lOiBBTEwsIFJTQSwgRFNBLCBFQ0RILCBFQ0RTQSwgREgsIFJBTkQsIENJUEhFUlMsIERJR0VTVFMsIFBLRVksIFBLRVlfQ1JZUFRPLCBQS0VZX0FTTjEuPC9wPgorCis8L2RkPgorPGR0IGlkPSJmaXBzLXllcy1ubyI+PGI+ZmlwczwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPkVuYWJsZSBvciBkaXNhYmxlIEZJUFMgMTQwLTIgbW9kZS48L3A+CisKKzxwPlRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSBlbnRlcmluZyBGSVBTIG1vZGUgaWYgPGI+c3R1bm5lbDwvYj4gd2FzIGNvbXBpbGVkIHdpdGggRklQUyAxNDAtMiBzdXBwb3J0LjwvcD4KKworPHA+ZGVmYXVsdDogbm8gKHNpbmNlIHZlcnNpb24gNS4wMCk8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImZvcmVncm91bmQteWVzLW5vLVVuaXgtb25seSI+PGI+Zm9yZWdyb3VuZDwvYj4gPSB5ZXMgfCBubyAoVW5peCBvbmx5KTwvZHQ+Cis8ZGQ+CisKKzxwPmZvcmVncm91bmQgbW9kZTwvcD4KKworPHA+U3RheSBpbiBmb3JlZ3JvdW5kIChkb24mIzM5O3QgZm9yaykgYW5kIGxvZyB0byBzdGRlcnIgaW5zdGVhZCBvZiB2aWEgc3lzbG9nICh1bmxlc3MgPGk+b3V0cHV0PC9pPiBpcyBzcGVjaWZpZWQpLjwvcD4KKworPHA+ZGVmYXVsdDogYmFja2dyb3VuZCBpbiBkYWVtb24gbW9kZTwvcD4KKworPC9kZD4KKzxkdCBpZD0iaWNvbkFjdGl2ZS1JQ09OX0ZJTEUtR1VJLW9ubHkiPjxiPmljb25BY3RpdmU8L2I+ID0gSUNPTl9GSUxFIChHVUkgb25seSk8L2R0PgorPGRkPgorCis8cD5HVUkgaWNvbiB0byBiZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnM8L3A+CisKKzxwPk9uIFdpbmRvd3MgcGxhdGZvcm0gdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gLmljbyBmaWxlIGNvbnRhaW5pbmcgYSAxNngxNiBwaXhlbCBpbWFnZS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Imljb25FcnJvci1JQ09OX0ZJTEUtR1VJLW9ubHkiPjxiPmljb25FcnJvcjwvYj4gPSBJQ09OX0ZJTEUgKEdVSSBvbmx5KTwvZHQ+Cis8ZGQ+CisKKzxwPkdVSSBpY29uIHRvIGJlIGRpc3BsYXllZCB3aGVuIG5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkPC9wPgorCis8cD5PbiBXaW5kb3dzIHBsYXRmb3JtIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIC5pY28gZmlsZSBjb250YWluaW5nIGEgMTZ4MTYgcGl4ZWwgaW1hZ2UuPC9wPgorCis8L2RkPgorPGR0IGlkPSJpY29uSWRsZS1JQ09OX0ZJTEUtR1VJLW9ubHkiPjxiPmljb25JZGxlPC9iPiA9IElDT05fRklMRSAoR1VJIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+R1VJIGljb24gdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zPC9wPgorCis8cD5PbiBXaW5kb3dzIHBsYXRmb3JtIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIC5pY28gZmlsZSBjb250YWluaW5nIGEgMTZ4MTYgcGl4ZWwgaW1hZ2UuPC9wPgorCis8L2RkPgorPGR0IGlkPSJsb2ctYXBwZW5kLW92ZXJ3cml0ZSI+PGI+bG9nPC9iPiA9IGFwcGVuZCB8IG92ZXJ3cml0ZTwvZHQ+Cis8ZGQ+CisKKzxwPmxvZyBmaWxlIGhhbmRsaW5nPC9wPgorCis8cD5UaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNob29zZSB3aGV0aGVyIHRoZSBsb2cgZmlsZSAoc3BlY2lmaWVkIHdpdGggdGhlIDxpPm91dHB1dDwvaT4gb3B0aW9uKSBpcyBhcHBlbmRlZCBvciBvdmVyd3JpdHRlbiB3aGVuIG9wZW5lZCBvciByZS1vcGVuZWQuPC9wPgorCis8cD5kZWZhdWx0OiBhcHBlbmQ8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im91dHB1dC1GSUxFIj48Yj5vdXRwdXQ8L2I+ID0gRklMRTwvZHQ+Cis8ZGQ+CisKKzxwPmFwcGVuZCBsb2cgbWVzc2FnZXMgdG8gYSBmaWxlPC9wPgorCis8cD4vZGV2L3N0ZG91dCBkZXZpY2UgY2FuIGJlIHVzZWQgdG8gc2VuZCBsb2cgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCAoZm9yIGV4YW1wbGUgdG8gbG9nIHRoZW0gd2l0aCBkYWVtb250b29scyBzcGxvZ2dlcikuPC9wPgorCis8L2RkPgorPGR0IGlkPSJwaWQtRklMRS1Vbml4LW9ubHkiPjxiPnBpZDwvYj4gPSBGSUxFIChVbml4IG9ubHkpPC9kdD4KKzxkZD4KKworPHA+cGlkIGZpbGUgbG9jYXRpb248L3A+CisKKzxwPklmIHRoZSBhcmd1bWVudCBpcyBlbXB0eSwgdGhlbiBubyBwaWQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9wPgorCis8cD48aT5waWQ8L2k+IHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIDxpPmNocm9vdDwvaT4gZGlyZWN0b3J5IGlmIHNwZWNpZmllZC48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlJORGJ5dGVzLUJZVEVTIj48Yj5STkRieXRlczwvYj4gPSBCWVRFUzwvZHQ+Cis8ZGQ+CisKKzxwPmJ5dGVzIHRvIHJlYWQgZnJvbSByYW5kb20gc2VlZCBmaWxlczwvcD4KKworPHA+TnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgcmVhZCBmcm9tIHJhbmRvbSBzZWVkIGZpbGVzLiBXaXRoIFNTTCB2ZXJzaW9ucyBsZXNzIHRoYW4gPGI+MC45LjVhPC9iPiwgYWxzbyBkZXRlcm1pbmVzIGhvdyBtYW55IGJ5dGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgc3VmZmljaWVudCB0byBzZWVkIHRoZSBQUk5HLiBNb3JlIHJlY2VudCA8Yj5PcGVuU1NMPC9iPiB2ZXJzaW9ucyBoYXZlIGEgYnVpbHRpbiBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hlbiBzdWZmaWNpZW50IHJhbmRvbW5lc3MgaXMgYXZhaWxhYmxlLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iUk5EZmlsZS1GSUxFIj48Yj5STkRmaWxlPC9iPiA9IEZJTEU8L2R0PgorPGRkPgorCis8cD5wYXRoIHRvIGZpbGUgd2l0aCByYW5kb20gc2VlZCBkYXRhPC9wPgorCis8cD5UaGUgU1NMIGxpYnJhcnkgd2lsbCB1c2UgZGF0YSBmcm9tIHRoaXMgZmlsZSBmaXJzdCB0byBzZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlJORG92ZXJ3cml0ZS15ZXMtbm8iPjxiPlJORG92ZXJ3cml0ZTwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPm92ZXJ3cml0ZSB0aGUgcmFuZG9tIHNlZWQgZmlsZXMgd2l0aCBuZXcgcmFuZG9tIGRhdGE8L3A+CisKKzxwPmRlZmF1bHQ6IHllczwvcD4KKworPC9kZD4KKzxkdCBpZD0ic2VydmljZS1TRVJWSUNFLVVuaXgtb25seSI+PGI+c2VydmljZTwvYj4gPSBTRVJWSUNFIChVbml4IG9ubHkpPC9kdD4KKzxkZD4KKworPHA+c3R1bm5lbCBzZXJ2aWNlIG5hbWU8L3A+CisKKzxwPlRoZSBzcGVjaWZpZWQgc2VydmljZSBuYW1lIGlzIHVzZWQgZm9yIHN5c2xvZyBhbmQgYXMgdGhlIDxpPmluZXRkPC9pPiBtb2RlIHNlcnZpY2UgbmFtZSBmb3IgVENQIFdyYXBwZXJzLiBXaGlsZSB0aGlzIG9wdGlvbiBjYW4gdGVjaG5pY2FsbHkgYmUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlIHNlY3Rpb25zLCBpdCBpcyBvbmx5IHVzZWZ1bCBpbiBnbG9iYWwgb3B0aW9ucy48L3A+CisKKzxwPmRlZmF1bHQ6IHN0dW5uZWw8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNldGdpZC1HUk9VUC1Vbml4LW9ubHkiPjxiPnNldGdpZDwvYj4gPSBHUk9VUCAoVW5peCBvbmx5KTwvZHQ+Cis8ZGQ+CisKKzxwPnNldGdpZCgpIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaW4gZGFlbW9uIG1vZGUgYW5kIGNsZWFyIGFsbCBvdGhlciBncm91cHM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNldHVpZC1VU0VSLVVuaXgtb25seSI+PGI+c2V0dWlkPC9iPiA9IFVTRVIgKFVuaXggb25seSk8L2R0PgorPGRkPgorCis8cD5zZXR1aWQoKSB0byB0aGUgc3BlY2lmaWVkIHVzZXIgaW4gZGFlbW9uIG1vZGU8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNvY2tldC1hLWwtcjpPUFRJT04tVkFMVUUtOlZBTFVFIj48Yj5zb2NrZXQ8L2I+ID0gYXxsfHI6T1BUSU9OPVZBTFVFWzpWQUxVRV08L2R0PgorPGRkPgorCis8cD5TZXQgYW4gb3B0aW9uIG9uIHRoZSBhY2NlcHQvbG9jYWwvcmVtb3RlIHNvY2tldDwvcD4KKworPHA+VGhlIHZhbHVlcyBmb3IgdGhlIGxpbmdlciBvcHRpb24gYXJlIGxfb25vZjpsX2xpbmdlci4gVGhlIHZhbHVlcyBmb3IgdGhlIHRpbWUgYXJlIHR2X3NlYzp0dl91c2VjLjwvcD4KKworPHA+RXhhbXBsZXM6PC9wPgorCis8cHJlPjxjb2RlPiAgICBzb2NrZXQgPSBsOlNPX0xJTkdFUj0xOjYwCisgICAgICAgIHNldCBvbmUgbWludXRlIHRpbWVvdXQgZm9yIGNsb3NpbmcgbG9jYWwgc29ja2V0CisgICAgc29ja2V0ID0gcjpTT19PT0JJTkxJTkU9eWVzCisgICAgICAgIHBsYWNlIG91dC1vZi1iYW5kIGRhdGEgZGlyZWN0bHkgaW50byB0aGUKKyAgICAgICAgcmVjZWl2ZSBkYXRhIHN0cmVhbSBmb3IgcmVtb3RlIHNvY2tldHMKKyAgICBzb2NrZXQgPSBhOlNPX1JFVVNFQUREUj1ubworICAgICAgICBkaXNhYmxlIGFkZHJlc3MgcmV1c2UgKGVuYWJsZWQgYnkgZGVmYXVsdCkKKyAgICBzb2NrZXQgPSBhOlNPX0JJTkRUT0RFVklDRT1sbworICAgICAgICBvbmx5IGFjY2VwdCBjb25uZWN0aW9ucyBvbiBsb29wYmFjayBpbnRlcmZhY2U8L2NvZGU+PC9wcmU+CisKKzwvZGQ+Cis8ZHQgaWQ9InN5c2xvZy15ZXMtbm8tVW5peC1vbmx5Ij48Yj5zeXNsb2c8L2I+ID0geWVzIHwgbm8gKFVuaXggb25seSk8L2R0PgorPGRkPgorCis8cD5lbmFibGUgbG9nZ2luZyB2aWEgc3lzbG9nPC9wPgorCis8cD5kZWZhdWx0OiB5ZXM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InRhc2tiYXIteWVzLW5vLVdJTjMyLW9ubHkiPjxiPnRhc2tiYXI8L2I+ID0geWVzIHwgbm8gKFdJTjMyIG9ubHkpPC9kdD4KKzxkZD4KKworPHA+ZW5hYmxlIHRoZSB0YXNrYmFyIGljb248L3A+CisKKzxwPmRlZmF1bHQ6IHllczwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxoMiBpZD0iU0VSVklDRS1MRVZFTC1PUFRJT05TIj5TRVJWSUNFLUxFVkVMIE9QVElPTlM8L2gyPgorCis8cD5FYWNoIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBiZWdpbnMgd2l0aCBhIHNlcnZpY2UgbmFtZSBpbiBzcXVhcmUgYnJhY2tldHMuIFRoZSBzZXJ2aWNlIG5hbWUgaXMgdXNlZCBmb3IgbGlid3JhcCAoVENQIFdyYXBwZXJzKSBhY2Nlc3MgY29udHJvbCBhbmQgbGV0cyB5b3UgZGlzdGluZ3Vpc2ggPGI+c3R1bm5lbDwvYj4gc2VydmljZXMgaW4geW91ciBsb2cgZmlsZXMuPC9wPgorCis8cD5Ob3RlIHRoYXQgaWYgeW91IHdpc2ggdG8gcnVuIDxiPnN0dW5uZWw8L2I+IGluIDxpPmluZXRkPC9pPiBtb2RlICh3aGVyZSBpdCBpcyBwcm92aWRlZCBhIG5ldHdvcmsgc29ja2V0IGJ5IGEgc2VydmVyIHN1Y2ggYXMgPGk+aW5ldGQ8L2k+LCA8aT54aW5ldGQ8L2k+LCBvciA8aT50Y3BzZXJ2ZXI8L2k+KSB0aGVuIHlvdSBzaG91bGQgcmVhZCB0aGUgc2VjdGlvbiBlbnRpdGxlZCA8aT5JTkVURCBNT0RFPC9pPiBiZWxvdy48L3A+CisKKzxkbD4KKworPGR0IGlkPSJhY2NlcHQtSE9TVDotUE9SVCI+PGI+YWNjZXB0PC9iPiA9IFtIT1NUOl1QT1JUPC9kdD4KKzxkZD4KKworPHA+YWNjZXB0IGNvbm5lY3Rpb25zIG9uIHNwZWNpZmllZCBhZGRyZXNzPC9wPgorCis8cD5JZiBubyBob3N0IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gYWxsIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgbG9jYWwgaG9zdC48L3A+CisKKzxwPlRvIGxpc3RlbiBvbiBhbGwgSVB2NiBhZGRyZXNzZXMgdXNlOjwvcD4KKworPHByZT48Y29kZT4gICAgYWNjZXB0ID0gOjo6UE9SVDwvY29kZT48L3ByZT4KKworPC9kZD4KKzxkdCBpZD0iQ0FwYXRoLURJUkVDVE9SWSI+PGI+Q0FwYXRoPC9iPiA9IERJUkVDVE9SWTwvZHQ+Cis8ZGQ+CisKKzxwPkNlcnRpZmljYXRlIEF1dGhvcml0eSBkaXJlY3Rvcnk8L3A+CisKKzxwPlRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCA8Yj5zdHVubmVsPC9iPiB3aWxsIGxvb2sgZm9yIGNlcnRpZmljYXRlcyB3aGVuIHVzaW5nIHRoZSA8aT52ZXJpZnk8L2k+IG9wdGlvbi4gTm90ZSB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG5hbWVkIFhYWFhYWFhYLjAgd2hlcmUgWFhYWFhYWFggaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIERFUiBlbmNvZGVkIHN1YmplY3Qgb2YgdGhlIGNlcnQuPC9wPgorCis8cD5UaGUgaGFzaCBhbGdvcml0aG0gaGFzIGJlZW4gY2hhbmdlZCBpbiA8Yj5PcGVuU1NMIDEuMC4wPC9iPi4gSXQgaXMgcmVxdWlyZWQgdG8gY19yZWhhc2ggdGhlIGRpcmVjdG9yeSBvbiB1cGdyYWRlIGZyb20gPGI+T3BlblNTTCAwLngueDwvYj4gdG8gPGI+T3BlblNTTCAxLngueDwvYj4uPC9wPgorCis8cD48aT5DQXBhdGg8L2k+IHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIDxpPmNocm9vdDwvaT4gZGlyZWN0b3J5IGlmIHNwZWNpZmllZC48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IkNBZmlsZS1DRVJUX0ZJTEUiPjxiPkNBZmlsZTwvYj4gPSBDRVJUX0ZJTEU8L2R0PgorPGRkPgorCis8cD5DZXJ0aWZpY2F0ZSBBdXRob3JpdHkgZmlsZTwvcD4KKworPHA+VGhpcyBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIENBIGNlcnRpZmljYXRlcywgdXNlZCB3aXRoIHRoZSA8aT52ZXJpZnk8L2k+IG9wdGlvbi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImNlcnQtUEVNX0ZJTEUiPjxiPmNlcnQ8L2I+ID0gUEVNX0ZJTEU8L2R0PgorPGRkPgorCis8cD5jZXJ0aWZpY2F0ZSBjaGFpbiBQRU0gZmlsZSBuYW1lPC9wPgorCis8cD5UaGUgY2VydGlmaWNhdGVzIG11c3QgYmUgaW4gUEVNIGZvcm1hdCwgYW5kIG11c3QgYmUgZnJvbSB0aGUgYWN0dWFsIHNlcnZlci9jbGllbnQgY2VydGlmaWNhdGUgdG8gdGhlIHNlbGYtc2lnbmVkIHJvb3QgQ0EgY2VydGlmaWNhdGUuPC9wPgorCis8cD5BIGNlcnRpZmljYXRlIGlzIHJlcXVpcmVkIGluIHNlcnZlciBtb2RlLCBhbmQgb3B0aW9uYWwgaW4gY2xpZW50IG1vZGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaGVja0VtYWlsLUVNQUlMIj48Yj5jaGVja0VtYWlsPC9iPiA9IEVNQUlMPC9kdD4KKzxkZD4KKworPHA+ZW1haWwgYWRkcmVzcyBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBzdWJqZWN0PC9wPgorCis8cD5NdWx0aXBsZSA8aT5jaGVja0VtYWlsPC9pPiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi4gQ2VydGlmaWNhdGVzIGFyZSBhY2NlcHRlZCBpZiBubyA8aT5jaGVja0VtYWlsPC9pPiBvcHRpb24gd2FzIHNwZWNpZmllZCwgb3IgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbnkgb2YgdGhlIGVtYWlsIGFkZHJlc3NlcyBzcGVjaWZpZWQgd2l0aCA8aT5jaGVja0VtYWlsPC9pPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImNoZWNrSG9zdC1IT1NUIj48Yj5jaGVja0hvc3Q8L2I+ID0gSE9TVDwvZHQ+Cis8ZGQ+CisKKzxwPmhvc3Qgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgc3ViamVjdDwvcD4KKworPHA+TXVsdGlwbGUgPGk+Y2hlY2tIb3N0PC9pPiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi4gQ2VydGlmaWNhdGVzIGFyZSBhY2NlcHRlZCBpZiBubyA8aT5jaGVja0hvc3Q8L2k+IG9wdGlvbiB3YXMgc3BlY2lmaWVkLCBvciB0aGUgaG9zdCBuYW1lIG9mIHRoZSBwZWVyIGNlcnRpZmljYXRlIG1hdGNoZXMgYW55IG9mIHRoZSBob3N0cyBzcGVjaWZpZWQgd2l0aCA8aT5jaGVja0hvc3Q8L2k+LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iY2hlY2tJUC1JUCI+PGI+Y2hlY2tJUDwvYj4gPSBJUDwvZHQ+Cis8ZGQ+CisKKzxwPklQIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgc3ViamVjdDwvcD4KKworPHA+TXVsdGlwbGUgPGk+Y2hlY2tJUDwvaT4gb3B0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHNpbmdsZSBzZXJ2aWNlIHNlY3Rpb24uIENlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgaWYgbm8gPGk+Y2hlY2tJUDwvaT4gb3B0aW9uIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBwZWVyIGNlcnRpZmljYXRlIG1hdGNoZXMgYW55IG9mIHRoZSBJUCBhZGRyZXNzZXMgc3BlY2lmaWVkIHdpdGggPGk+Y2hlY2tJUDwvaT4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaXBoZXJzLUNJUEhFUl9MSVNUIj48Yj5jaXBoZXJzPC9iPiA9IENJUEhFUl9MSVNUPC9kdD4KKzxkZD4KKworPHA+U2VsZWN0IHBlcm1pdHRlZCBTU0wgY2lwaGVyczwvcD4KKworPHA+QSBjb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiB0aGUgY2lwaGVycyB0byBhbGxvdyBpbiB0aGUgU1NMIGNvbm5lY3Rpb24sIGZvciBleGFtcGxlIERFUy1DQkMzLVNIQTpJREVBLUNCQy1NRDUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJjbGllbnQteWVzLW5vIj48Yj5jbGllbnQ8L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5jbGllbnQgbW9kZSAocmVtb3RlIHNlcnZpY2UgdXNlcyBTU0wpPC9wPgorCis8cD5kZWZhdWx0OiBubyAoc2VydmVyIG1vZGUpPC9wPgorCis8L2RkPgorPGR0IGlkPSJjb25uZWN0LUhPU1Q6LVBPUlQiPjxiPmNvbm5lY3Q8L2I+ID0gW0hPU1Q6XVBPUlQ8L2R0PgorPGRkPgorCis8cD5jb25uZWN0IHRvIGEgcmVtb3RlIGFkZHJlc3M8L3A+CisKKzxwPklmIG5vIGhvc3QgaXMgc3BlY2lmaWVkLCB0aGUgaG9zdCBkZWZhdWx0cyB0byBsb2NhbGhvc3QuPC9wPgorCis8cD5NdWx0aXBsZSA8aT5jb25uZWN0PC9pPiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi48L3A+CisKKzxwPklmIGhvc3QgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgYWRkcmVzc2VzIGFuZC9vciBpZiBtdWx0aXBsZSA8aT5jb25uZWN0PC9pPiBvcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHJlbW90ZSBhZGRyZXNzIGlzIGNob3NlbiB1c2luZyBhIHJvdW5kLXJvYmluIGFsZ29yaXRobS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IkNSTHBhdGgtRElSRUNUT1JZIj48Yj5DUkxwYXRoPC9iPiA9IERJUkVDVE9SWTwvZHQ+Cis8ZGQ+CisKKzxwPkNlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgZGlyZWN0b3J5PC9wPgorCis8cD5UaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggPGI+c3R1bm5lbDwvYj4gd2lsbCBsb29rIGZvciBDUkxzIHdoZW4gdXNpbmcgdGhlIDxpPnZlcmlmeTwvaT4gb3B0aW9uLiBOb3RlIHRoYXQgdGhlIENSTHMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG5hbWVkIFhYWFhYWFhYLnIwIHdoZXJlIFhYWFhYWFhYIGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBDUkwuPC9wPgorCis8cD5UaGUgaGFzaCBhbGdvcml0aG0gaGFzIGJlZW4gY2hhbmdlZCBpbiA8Yj5PcGVuU1NMIDEuMC4wPC9iPi4gSXQgaXMgcmVxdWlyZWQgdG8gY19yZWhhc2ggdGhlIGRpcmVjdG9yeSBvbiB1cGdyYWRlIGZyb20gPGI+T3BlblNTTCAwLngueDwvYj4gdG8gPGI+T3BlblNTTCAxLngueDwvYj4uPC9wPgorCis8cD48aT5DUkxwYXRoPC9pPiBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSA8aT5jaHJvb3Q8L2k+IGRpcmVjdG9yeSBpZiBzcGVjaWZpZWQuPC9wPgorCis8L2RkPgorPGR0IGlkPSJDUkxmaWxlLUNFUlRfRklMRSI+PGI+Q1JMZmlsZTwvYj4gPSBDRVJUX0ZJTEU8L2R0PgorPGRkPgorCis8cD5DZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIGZpbGU8L3A+CisKKzxwPlRoaXMgZmlsZSBjb250YWlucyBtdWx0aXBsZSBDUkxzLCB1c2VkIHdpdGggdGhlIDxpPnZlcmlmeTwvaT4gb3B0aW9uLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iY3VydmUtTklEIj48Yj5jdXJ2ZTwvYj4gPSBOSUQ8L2R0PgorPGRkPgorCis8cD5zcGVjaWZ5IEVDREggY3VydmUgbmFtZTwvcD4KKworPHA+VG8gZ2V0IGEgbGlzdCBvZiBzdXBwb3J0ZWQgY3VydmVzIHVzZTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIG9wZW5zc2wgZWNwYXJhbSAtbGlzdF9jdXJ2ZXM8L2NvZGU+PC9wcmU+CisKKzxwPmRlZmF1bHQ6IHByaW1lMjU2djE8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImxvZ0lkLVRZUEUiPjxiPmxvZ0lkPC9iPiA9IFRZUEU8L2R0PgorPGRkPgorCis8cD5jb25uZWN0aW9uIGlkZW50aWZpZXIgdHlwZTwvcD4KKworPHA+VGhpcyBpZGVudGlmaWVyIGFsbG93cyB5b3UgdG8gZGlzdGluZ3Vpc2ggbG9nIGVudHJpZXMgZ2VuZXJhdGVkIGZvciBlYWNoIG9mIHRoZSBjb25uZWN0aW9ucy48L3A+CisKKzxwPkN1cnJlbnRseSBzdXBwb3J0ZWQgdHlwZXM6PC9wPgorCis8ZGw+CisKKzxkdCBpZD0ic2VxdWVudGlhbCI+PGk+c2VxdWVudGlhbDwvaT48L2R0PgorPGRkPgorCis8cD5UaGUgbnVtZXJpYyBzZXF1ZW50aWFsIGlkZW50aWZpZXIgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIGluc3RhbmNlIG9mIDxiPnN0dW5uZWw8L2I+LCBidXQgdmVyeSBjb21wYWN0LiBJdCBpcyBtb3N0IHVzZWZ1bCBmb3IgbWFudWFsIGxvZyBhbmFseXNpcy48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InVuaXF1ZSI+PGk+dW5pcXVlPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlRoaXMgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgaXMgZ2xvYmFsbHkgdW5pcXVlLCBidXQgbG9uZ2VyIHRoYW4gdGhlIHNlcXVlbnRpYWwgbnVtYmVyLiBJdCBpcyBtb3N0IHVzZWZ1bCBmb3IgYXV0b21hdGVkIGxvZyBhbmFseXNpcy48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InRocmVhZCI+PGk+dGhyZWFkPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlRoZSBvcGVyYXRpbmcgc3lzdGVtIHRocmVhZCBpZGVudGlmaWVyIGlzIG5laXRoZXIgdW5pcXVlIChldmVuIHdpdGhpbiBhIHNpbmdsZSBpbnN0YW5jZSBvZiA8Yj5zdHVubmVsPC9iPikgbm9yIHNob3J0LiBJdCBpcyBtb3N0IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHNvZnR3YXJlIG9yIGNvbmZpZ3VyYXRpb24gaXNzdWVzLjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxwPmRlZmF1bHQ6IHNlcXVlbnRpYWw8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImRlYnVnLUxFVkVMIj48Yj5kZWJ1ZzwvYj4gPSBMRVZFTDwvZHQ+Cis8ZGQ+CisKKzxwPmRlYnVnZ2luZyBsZXZlbDwvcD4KKworPHA+TGV2ZWwgaXMgYSBvbmUgb2YgdGhlIHN5c2xvZyBsZXZlbCBuYW1lcyBvciBudW1iZXJzIGVtZXJnICgwKSwgYWxlcnQgKDEpLCBjcml0ICgyKSwgZXJyICgzKSwgd2FybmluZyAoNCksIG5vdGljZSAoNSksIGluZm8gKDYpLCBvciBkZWJ1ZyAoNykuIEFsbCBsb2dzIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsIGFuZCBhbGwgbGV2ZWxzIG51bWVyaWNhbGx5IGxlc3MgdGhhbiBpdCB3aWxsIGJlIHNob3duLiBVc2UgPGk+ZGVidWcgPSBkZWJ1ZzwvaT4gb3IgPGk+ZGVidWcgPSA3PC9pPiBmb3IgZ3JlYXRlc3QgZGVidWdnaW5nIG91dHB1dC4gVGhlIGRlZmF1bHQgaXMgbm90aWNlICg1KS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImRlbGF5LXllcy1ubyI+PGI+ZGVsYXk8L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5kZWxheSBETlMgbG9va3VwIGZvciB0aGUgPGk+Y29ubmVjdDwvaT4gb3B0aW9uPC9wPgorCis8cD5UaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGR5bmFtaWMgRE5TLCBvciB3aGVuIEROUyBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyA8Yj5zdHVubmVsPC9iPiBzdGFydHVwIChyb2FkIHdhcnJpb3IgVlBOLCBkaWFsLXVwIGNvbmZpZ3VyYXRpb25zKS48L3A+CisKKzxwPkRlbGF5ZWQgcmVzb2x2ZXIgbW9kZSBpcyBhdXRvbWF0aWNhbGx5IGVuZ2FnZWQgd2hlbiBzdHVubmVsIGZhaWxzIHRvIHJlc29sdmUgb24gc3RhcnR1cCBhbnkgb2YgdGhlIDxpPmNvbm5lY3Q8L2k+IHRhcmdldHMgZm9yIGEgc2VydmljZS48L3A+CisKKzxwPkRlbGF5ZWQgcmVzb2x2ZXIgaW5mbGljdHMgPGk+ZmFpbG92ZXIgPSBwcmlvPC9pPi48L3A+CisKKzxwPmRlZmF1bHQ6IG5vPC9wPgorCis8L2RkPgorPGR0IGlkPSJlbmdpbmVJZC1FTkdJTkVfSUQiPjxiPmVuZ2luZUlkPC9iPiA9IEVOR0lORV9JRDwvZHQ+Cis8ZGQ+CisKKzxwPnNlbGVjdCBlbmdpbmUgSUQgZm9yIHRoZSBzZXJ2aWNlPC9wPgorCis8L2RkPgorPGR0IGlkPSJlbmdpbmVOdW0tRU5HSU5FX05VTUJFUiI+PGI+ZW5naW5lTnVtPC9iPiA9IEVOR0lORV9OVU1CRVI8L2R0PgorPGRkPgorCis8cD5zZWxlY3QgZW5naW5lIG51bWJlciBmb3IgdGhlIHNlcnZpY2U8L3A+CisKKzxwPlRoZSBlbmdpbmVzIGFyZSBudW1iZXJlZCBzdGFydGluZyBmcm9tIDEuPC9wPgorCis8L2RkPgorPGR0IGlkPSJleGVjLUVYRUNVVEFCTEVfUEFUSCI+PGI+ZXhlYzwvYj4gPSBFWEVDVVRBQkxFX1BBVEg8L2R0PgorPGRkPgorCis8cD5leGVjdXRlIGEgbG9jYWwgaW5ldGQtdHlwZSBwcm9ncmFtPC9wPgorCis8cD48aT5leGVjPC9pPiBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSA8aT5jaHJvb3Q8L2k+IGRpcmVjdG9yeSBpZiBzcGVjaWZpZWQuPC9wPgorCis8cD5UaGUgZm9sbG93aW5nIGVudmlyb25tZW50YWwgdmFyaWFibGVzIGFyZSBzZXQgb24gVW5peCBwbGF0Zm9ybXM6IFJFTU9URV9IT1NULCBSRU1PVEVfUE9SVCwgU1NMX0NMSUVOVF9ETiwgU1NMX0NMSUVOVF9JX0ROLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iZXhlY0FyZ3MtMC0xLTIiPjxiPmV4ZWNBcmdzPC9iPiA9ICQwICQxICQyIC4uLjwvZHQ+Cis8ZGQ+CisKKzxwPmFyZ3VtZW50cyBmb3IgPGk+ZXhlYzwvaT4gaW5jbHVkaW5nIHRoZSBwcm9ncmFtIG5hbWUgKCQwKTwvcD4KKworPHA+UXVvdGluZyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gQXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHdoaXRlc3BhY2UuPC9wPgorCis8L2RkPgorPGR0IGlkPSJmYWlsb3Zlci1yci1wcmlvIj48Yj5mYWlsb3ZlcjwvYj4gPSByciB8IHByaW88L2R0PgorPGRkPgorCis8cD5GYWlsb3ZlciBzdHJhdGVneSBmb3IgbXVsdGlwbGUgJnF1b3Q7Y29ubmVjdCZxdW90OyB0YXJnZXRzLjwvcD4KKworPHByZT48Y29kZT4gICAgcnIgKHJvdW5kIHJvYmluKSAtIGZhaXIgbG9hZCBkaXN0cmlidXRpb24KKyAgICBwcmlvIChwcmlvcml0eSkgLSB1c2UgdGhlIG9yZGVyIHNwZWNpZmllZCBpbiBjb25maWcgZmlsZTwvY29kZT48L3ByZT4KKworPHA+ZGVmYXVsdDogcnI8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImlkZW50LVVTRVJOQU1FIj48Yj5pZGVudDwvYj4gPSBVU0VSTkFNRTwvZHQ+Cis8ZGQ+CisKKzxwPnVzZSBJREVOVCAoUkZDIDE0MTMpIHVzZXJuYW1lIGNoZWNraW5nPC9wPgorCis8L2RkPgorPGR0IGlkPSJpbmNsdWRlLURJUkVDVE9SWSI+PGI+aW5jbHVkZTwvYj4gPSBESVJFQ1RPUlk8L2R0PgorPGRkPgorCis8cD5pbmNsdWRlIGFsbCBjb25maWd1cmF0aW9uIGZpbGUgcGFydHMgbG9jYXRlZCBpbiBESVJFQ1RPUlk8L3A+CisKKzxwPlRoZSBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFzY2VuZGluZyBhbHBoYWJldGljYWwgb3JkZXIgb2YgdGhlaXIgbmFtZXMuPC9wPgorCis8L2RkPgorPGR0IGlkPSJrZXktS0VZX0ZJTEUiPjxiPmtleTwvYj4gPSBLRVlfRklMRTwvZHQ+Cis8ZGQ+CisKKzxwPnByaXZhdGUga2V5IGZvciB0aGUgY2VydGlmaWNhdGUgc3BlY2lmaWVkIHdpdGggPGk+Y2VydDwvaT4gb3B0aW9uPC9wPgorCis8cD5BIHByaXZhdGUga2V5IGlzIG5lZWRlZCB0byBhdXRoZW50aWNhdGUgdGhlIGNlcnRpZmljYXRlIG93bmVyLiBTaW5jZSB0aGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgc2VjcmV0IGl0IHNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGJ5IGl0cyBvd25lci4gT24gVW5peCBzeXN0ZW1zIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIGNobW9kIDYwMCBrZXlmaWxlPC9jb2RlPjwvcHJlPgorCis8cD5kZWZhdWx0OiB0aGUgdmFsdWUgb2YgdGhlIDxpPmNlcnQ8L2k+IG9wdGlvbjwvcD4KKworPC9kZD4KKzxkdCBpZD0ibGlid3JhcC15ZXMtbm8iPjxiPmxpYndyYXA8L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5FbmFibGUgb3IgZGlzYWJsZSB0aGUgdXNlIG9mIC9ldGMvaG9zdHMuYWxsb3cgYW5kIC9ldGMvaG9zdHMuZGVueS48L3A+CisKKzxwPmRlZmF1bHQ6IG5vIChzaW5jZSB2ZXJzaW9uIDUuMDApPC9wPgorCis8L2RkPgorPGR0IGlkPSJsb2NhbC1IT1NUIj48Yj5sb2NhbDwvYj4gPSBIT1NUPC9kdD4KKzxkZD4KKworPHA+QnkgZGVmYXVsdCwgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG91dGdvaW5nIGludGVyZmFjZSBpcyB1c2VkIGFzIHRoZSBzb3VyY2UgZm9yIHJlbW90ZSBjb25uZWN0aW9ucy4gVXNlIHRoaXMgb3B0aW9uIHRvIGJpbmQgYSBzdGF0aWMgbG9jYWwgSVAgYWRkcmVzcyBpbnN0ZWFkLjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic25pLVNFUlZJQ0U6U0VSVkVSX1BBVFRFUk4tc2VydmVyLW1vZGUiPjxiPnNuaTwvYj4gPSBTRVJWSUNFOlNFUlZFUl9QQVRURVJOIChzZXJ2ZXIgbW9kZSk8L2R0PgorPGRkPgorCis8cD5Vc2UgdGhlIHNlcnZpY2UgYXMgYSBzbGF2ZSBzZXJ2aWNlIChhIG5hbWUtYmFzZWQgdmlydHVhbCBzZXJ2ZXIpIGZvciBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIFRMUyBleHRlbnNpb24gKFJGQyAzNTQ2KS48L3A+CisKKzxwPjxpPnNlcnZpY2VfbmFtZTwvaT4gc3BlY2lmaWVzIHRoZSBtYXN0ZXIgc2VydmljZSB0aGF0IGFjY2VwdHMgY2xpZW50IGNvbm5lY3Rpb25zIHdpdGggdGhlIDxpPmFjY2VwdDwvaT4gb3B0aW9uLiA8aT5zZXJ2ZXJfbmFtZV9wYXR0ZXJuPC9pPiBzcGVjaWZpZXMgdGhlIGhvc3QgbmFtZSB0byBiZSByZWRpcmVjdGVkLiBUaGUgcGF0dGVybiBtYXkgc3RhcnQgd2l0aCB0aGUgJiMzOTsqJiMzOTsgY2hhcmFjdGVyLCBlLmcuICYjMzk7Ki5leGFtcGxlLmNvbSYjMzk7LiBNdWx0aXBsZSBzbGF2ZSBzZXJ2aWNlcyBhcmUgbm9ybWFsbHkgc3BlY2lmaWVkIGZvciBhIHNpbmdsZSBtYXN0ZXIgc2VydmljZS4gVGhlIDxpPnNuaTwvaT4gb3B0aW9uIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSB3aXRoaW4gYSBzaW5nbGUgc2xhdmUgc2VydmljZS48L3A+CisKKzxwPlRoaXMgc2VydmljZSwgYXMgd2VsbCBhcyB0aGUgbWFzdGVyIHNlcnZpY2UsIG1heSBub3QgYmUgY29uZmlndXJlZCBpbiBjbGllbnQgbW9kZS48L3A+CisKKzxwPlRoZSA8aT5jb25uZWN0PC9pPiBvcHRpb24gb2YgdGhlIHNsYXZlIHNlcnZpY2UgaXMgaWdub3JlZCB3aGVuIHRoZSA8aT5wcm90b2NvbDwvaT4gb3B0aW9uIGlzIHNwZWNpZmllZCwgYXMgPGk+cHJvdG9jb2w8L2k+IGNvbm5lY3RzIHRvIHRoZSByZW1vdGUgaG9zdCBiZWZvcmUgVExTIGhhbmRzaGFrZS48L3A+CisKKzxwPkxpYndyYXAgY2hlY2tzIChVbml4IG9ubHkpIGFyZSBwZXJmb3JtZWQgdHdpY2U6IHdpdGggdGhlIG1hc3RlciBzZXJ2aWNlIG5hbWUgYWZ0ZXIgVENQIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIGFuZCB3aXRoIHRoZSBzbGF2ZSBzZXJ2aWNlIG5hbWUgZHVyaW5nIHRoZSBUTFMgaGFuZHNoYWtlLjwvcD4KKworPHA+VGhlIDxpPnNuaTwvaT4gb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCA8Yj5PcGVuU1NMIDEuMC4wPC9iPiBhbmQgbGF0ZXIuPC9wPgorCis8L2RkPgorPGR0IGlkPSJzbmktU0VSVkVSLWNsaWVudC1tb2RlIj48Yj5zbmk8L2I+ID0gU0VSVkVSIChjbGllbnQgbW9kZSk8L2R0PgorPGRkPgorCis8cD5Vc2UgdGhlIHBhcmFtZXRlciBhcyB0aGUgdmFsdWUgb2YgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFJGQyAzNTQ2KSBleHRlbnNpb24uPC9wPgorCis8cD5UaGUgPGk+c25pPC9pPiBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIDxiPk9wZW5TU0wgMS4wLjA8L2I+IGFuZCBsYXRlci48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Ik9DU1AtVVJMIj48Yj5PQ1NQPC9iPiA9IFVSTDwvZHQ+Cis8ZGQ+CisKKzxwPnNlbGVjdCBPQ1NQIHNlcnZlciBmb3IgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uPC9wPgorCis8L2RkPgorPGR0IGlkPSJPQ1NQYWlhLXllcy1ubyI+PGI+T0NTUGFpYTwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPnZhbGlkYXRlIGNlcnRpZmljYXRlcyB3aXRoIHRoZWlyIEFJQSBPQ1NQIHJlc3BvbmRlcnM8L3A+CisKKzxwPlRoaXMgb3B0aW9uIGVuYWJsZXMgPGk+c3R1bm5lbDwvaT4gdG8gdmFsaWRhdGUgY2VydGlmaWNhdGVzIHdpdGggdGhlIGxpc3Qgb2YgT0NTUCByZXNwb25kZXIgVVJMcyByZXRyaWV2ZWQgZnJvbSB0aGVpciBBSUEgKEF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MpIGV4dGVuc2lvbi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Ik9DU1BmbGFnLU9DU1BfRkxBRyI+PGI+T0NTUGZsYWc8L2I+ID0gT0NTUF9GTEFHPC9kdD4KKzxkZD4KKworPHA+c3BlY2lmeSBPQ1NQIHNlcnZlciBmbGFnPC9wPgorCis8cD5TZXZlcmFsIDxpPk9DU1BmbGFnPC9pPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIGZsYWdzLjwvcD4KKworPHA+Y3VycmVudGx5IHN1cHBvcnRlZCBmbGFnczogTk9DRVJUUywgTk9JTlRFUk4gTk9TSUdTLCBOT0NIQUlOLCBOT1ZFUklGWSwgTk9FWFBMSUNJVCwgTk9DQVNJR04sIE5PREVMRUdBVEVELCBOT0NIRUNLUywgVFJVU1RPVEhFUiwgUkVTUElEX0tFWSwgTk9USU1FPC9wPgorCis8L2RkPgorPGR0IGlkPSJvcHRpb25zLVNTTF9PUFRJT05TIj48Yj5vcHRpb25zPC9iPiA9IFNTTF9PUFRJT05TPC9kdD4KKzxkZD4KKworPHA+PGI+T3BlblNTTDwvYj4gbGlicmFyeSBvcHRpb25zPC9wPgorCis8cD5UaGUgcGFyYW1ldGVyIGlzIHRoZSA8Yj5PcGVuU1NMPC9iPiBvcHRpb24gbmFtZSBhcyBkZXNjcmliZWQgaW4gdGhlIDxpPlNTTF9DVFhfc2V0X29wdGlvbnMoM3NzbCk8L2k+IG1hbnVhbCwgYnV0IHdpdGhvdXQgPGk+U1NMX09QXzwvaT4gcHJlZml4LiA8aT5zdHVubmVsIC1vcHRpb25zPC9pPiBsaXN0cyB0aGUgb3B0aW9ucyBmb3VuZCB0byBiZSBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGNvbWJpbmF0aW9uIG9mIDxpPnN0dW5uZWw8L2k+IGFuZCB0aGUgPGk+T3BlblNTTDwvaT4gbGlicmFyeSB1c2VkIHRvIGJ1aWxkIGl0LjwvcD4KKworPHA+U2V2ZXJhbCA8aT5vcHRpb25zPC9pPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIG9wdGlvbnMuIEFuIG9wdGlvbiBuYW1lIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCBhIGRhc2ggKCZxdW90Oy0mcXVvdDspIHRvIGRpc2FibGUgdGhlIG9wdGlvbi48L3A+CisKKzxwPkZvciBleGFtcGxlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBlcnJvbmVvdXMgRXVkb3JhIFNTTCBpbXBsZW1lbnRhdGlvbiwgdGhlIGZvbGxvd2luZyBvcHRpb24gY2FuIGJlIHVzZWQ6PC9wPgorCis8cHJlPjxjb2RlPiAgICBvcHRpb25zID0gRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTPC9jb2RlPjwvcHJlPgorCis8cD5kZWZhdWx0OjwvcD4KKworPHByZT48Y29kZT4gICAgb3B0aW9ucyA9IE5PX1NTTHYyCisgICAgb3B0aW9ucyA9IE5PX1NTTHYzPC9jb2RlPjwvcHJlPgorCis8L2RkPgorPGR0IGlkPSJwcm90b2NvbC1QUk9UTyI+PGI+cHJvdG9jb2w8L2I+ID0gUFJPVE88L2R0PgorPGRkPgorCis8cD5hcHBsaWNhdGlvbiBwcm90b2NvbCB0byBuZWdvdGlhdGUgU1NMPC9wPgorCis8cD5UaGlzIG9wdGlvbiBlbmFibGVzIGluaXRpYWwsIHByb3RvY29sLXNwZWNpZmljIG5lZ290aWF0aW9uIG9mIHRoZSBTU0wvVExTIGVuY3J5cHRpb24uIFRoZSA8aT5wcm90b2NvbDwvaT4gb3B0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIFNTTCBlbmNyeXB0aW9uIG9uIGEgc2VwYXJhdGUgcG9ydC48L3A+CisKKzxwPkN1cnJlbnRseSBzdXBwb3J0ZWQgcHJvdG9jb2xzOjwvcD4KKworPGRsPgorCis8ZHQgaWQ9ImNpZnMiPjxpPmNpZnM8L2k+PC9kdD4KKzxkZD4KKworPHA+UHJvcHJpZXRhcnkgKHVuZG9jdW1tZW50ZWQpIGV4dGVuc2lvbiBvZiBDSUZTIHByb3RvY29sIGltcGxlbWVudGVkIGluIFNhbWJhLiBTdXBwb3J0IGZvciB0aGlzIGV4dGVuc2lvbiB3YXMgZHJvcHBlZCBpbiBTYW1iYSAzLjAuMC48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImNvbm5lY3QiPjxpPmNvbm5lY3Q8L2k+PC9kdD4KKzxkZD4KKworPHA+QmFzZWQgb24gUkZDIDI4MTcgLSA8aT5VcGdyYWRpbmcgdG8gVExTIFdpdGhpbiBIVFRQLzEuMTwvaT4sIHNlY3Rpb24gNS4yIC0gPGk+UmVxdWVzdGluZyBhIFR1bm5lbCB3aXRoIENPTk5FQ1Q8L2k+PC9wPgorCis8cD5UaGlzIHByb3RvY29sIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNsaWVudCBtb2RlLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iaW1hcCI+PGk+aW1hcDwvaT48L2R0PgorPGRkPgorCis8cD5CYXNlZCBvbiBSRkMgMjU5NSAtIDxpPlVzaW5nIFRMUyB3aXRoIElNQVAsIFBPUDMgYW5kIEFDQVA8L2k+PC9wPgorCis8L2RkPgorPGR0IGlkPSJubnRwIj48aT5ubnRwPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPkJhc2VkIG9uIFJGQyA0NjQyIC0gPGk+VXNpbmcgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHdpdGggTmV0d29yayBOZXdzIFRyYW5zZmVyIFByb3RvY29sIChOTlRQKTwvaT48L3A+CisKKzxwPlRoaXMgcHJvdG9jb2wgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2xpZW50IG1vZGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJwZ3NxbCI+PGk+cGdzcWw8L2k+PC9kdD4KKzxkZD4KKworPHA+QmFzZWQgb24gPGk+aHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzguMy9zdGF0aWMvcHJvdG9jb2wtZmxvdy5odG1sI0FFTjczOTgyPC9pPjwvcD4KKworPC9kZD4KKzxkdCBpZD0icG9wMyI+PGk+cG9wMzwvaT48L2R0PgorPGRkPgorCis8cD5CYXNlZCBvbiBSRkMgMjQ0OSAtIDxpPlBPUDMgRXh0ZW5zaW9uIE1lY2hhbmlzbTwvaT48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3h5Ij48aT5wcm94eTwvaT48L2R0PgorPGRkPgorCis8cD5IYXByb3h5IGNsaWVudCBJUCBhZGRyZXNzIDxpPmh0dHA6Ly9oYXByb3h5LjF3dC5ldS9kb3dubG9hZC8xLjUvZG9jL3Byb3h5LXByb3RvY29sLnR4dDwvaT48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNtdHAiPjxpPnNtdHA8L2k+PC9kdD4KKzxkZD4KKworPHA+QmFzZWQgb24gUkZDIDI0ODcgLSA8aT5TTVRQIFNlcnZpY2UgRXh0ZW5zaW9uIGZvciBTZWN1cmUgU01UUCBvdmVyIFRMUzwvaT48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNvY2tzIj48aT5zb2NrczwvaT48L2R0PgorPGRkPgorCis8cD5TT0NLUyB2ZXJzaW9ucyA0LCA0YSwgYW5kIDUgYXJlIHN1cHBvcnRlZC4gVGhlIFNPQ0tTIHByb3RvY29sIGl0c2VsZiBpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIFNTTC9UTFMgZW5jcnlwdGlvbiBsYXllciB0byBwcm90ZWN0IHRoZSBmaW5hbCBkZXN0aW5hdGlvbiBhZGRyZXNzLjwvcD4KKworPHA+PGk+aHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvc29ja3M0LnByb3RvY29sPC9pPjwvcD4KKworPHA+PGk+aHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvc29ja3M0YS5wcm90b2NvbDwvaT48L3A+CisKKzxwPlRoZSBCSU5EIGNvbW1hbmQgb2YgdGhlIFNPQ0tTIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBVU0VSSUQgcGFyYW1ldGVyIGlzIGlnbm9yZWQuPC9wPgorCis8cD5TZWUgRXhhbXBsZXMgc2VjdGlvbiBmb3Igc2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIFZQTiBiYXNlZCBvbiBTT0NLUyBlbmNyeXB0aW9uLjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sQXV0aGVudGljYXRpb24tYmFzaWMtbnRsbSI+PGI+cHJvdG9jb2xBdXRoZW50aWNhdGlvbjwvYj4gPSBiYXNpYyB8IG50bG08L2R0PgorPGRkPgorCis8cD5hdXRoZW50aWNhdGlvbiB0eXBlIGZvciBwcm90b2NvbCBuZWdvdGlhdGlvbnM8L3A+CisKKzxwPkN1cnJlbnRseSB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBvbmx5IGFwcGxpZXMgdG8gdGhlICYjMzk7Y29ubmVjdCYjMzk7IHByb3RvY29sLjwvcD4KKworPHA+ZGVmYXVsdDogYmFzaWM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sSG9zdC1IT1NUOlBPUlQiPjxiPnByb3RvY29sSG9zdDwvYj4gPSBIT1NUOlBPUlQ8L2R0PgorPGRkPgorCis8cD5kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBwcm90b2NvbCBuZWdvdGlhdGlvbnM8L3A+CisKKzxwPjxpPnByb3RvY29sSG9zdDwvaT4gc3BlY2lmaWVzIHRoZSBmaW5hbCBTU0wgc2VydmVyIHRvIGJlIGNvbm5lY3RlZCB0byBieSB0aGUgcHJveHksIGFuZCBub3QgdGhlIHByb3h5IHNlcnZlciBkaXJlY3RseSBjb25uZWN0ZWQgYnkgPGI+c3R1bm5lbDwvYj4uIFRoZSBwcm94eSBzZXJ2ZXIgc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRoIHRoZSAmIzM5O2Nvbm5lY3QmIzM5OyBvcHRpb24uPC9wPgorCis8cD5DdXJyZW50bHkgdGhlIHByb3RvY29sIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb25seSBhcHBsaWVzIHRvICYjMzk7Y29ubmVjdCYjMzk7IHByb3RvY29sLjwvcD4KKworPC9kZD4KKzxkdCBpZD0icHJvdG9jb2xQYXNzd29yZC1QQVNTV09SRCI+PGI+cHJvdG9jb2xQYXNzd29yZDwvYj4gPSBQQVNTV09SRDwvZHQ+Cis8ZGQ+CisKKzxwPnBhc3N3b3JkIGZvciBwcm90b2NvbCBuZWdvdGlhdGlvbnM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sVXNlcm5hbWUtVVNFUk5BTUUiPjxiPnByb3RvY29sVXNlcm5hbWU8L2I+ID0gVVNFUk5BTUU8L2R0PgorPGRkPgorCis8cD51c2VybmFtZSBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zPC9wPgorCis8L2RkPgorPGR0IGlkPSJQU0tpZGVudGl0eS1JREVOVElUWSI+PGI+UFNLaWRlbnRpdHk8L2I+ID0gSURFTlRJVFk8L2R0PgorPGRkPgorCis8cD5QU0sgaWRlbnRpdHkgZm9yIHRoZSBQU0sgY2xpZW50PC9wPgorCis8cD48aT5QU0tpZGVudGl0eTwvaT4gY2FuIGJlIHVzZWQgb24gPGI+c3R1bm5lbDwvYj4gY2xpZW50cyB0byBzZWxlY3QgdGhlIFBTSyBpZGVudGl0eSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpbiBzZXJ2ZXIgc2VjdGlvbnMuPC9wPgorCis8cD5kZWZhdWx0OiB0aGUgZmlyc3QgaWRlbnRpdHkgc3BlY2lmaWVkIGluIHRoZSA8aT5QU0tzZWNyZXRzPC9pPiBmaWxlLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iUFNLc2VjcmV0cy1GSUxFIj48Yj5QU0tzZWNyZXRzPC9iPiA9IEZJTEU8L2R0PgorPGRkPgorCis8cD5maWxlIHdpdGggUFNLIGlkZW50aXRpZXMgYW5kIGNvcnJlc3BvbmRpbmcga2V5czwvcD4KKworPHA+RWFjaCBsaW5lIG9mIHRoZSBmaWxlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OjwvcD4KKworPHByZT48Y29kZT4gICAgSURFTlRJVFk6S0VZPC9jb2RlPjwvcHJlPgorCis8cD5UaGUga2V5IGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDIwIGNoYXJhY3RlcnMgbG9uZy4gVGhlIGZpbGUgc2hvdWxkIG5vdCBiZSB3b3JsZC1yZWFkYWJsZSBub3Igd29ybGQtd3JpdGFibGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJwdHkteWVzLW5vLVVuaXgtb25seSI+PGI+cHR5PC9iPiA9IHllcyB8IG5vIChVbml4IG9ubHkpPC9kdD4KKzxkZD4KKworPHA+YWxsb2NhdGUgYSBwc2V1ZG90ZXJtaW5hbCBmb3IgJiMzOTtleGVjJiMzOTsgb3B0aW9uPC9wPgorCis8L2RkPgorPGR0IGlkPSJyZWRpcmVjdC1IT1NUOi1QT1JUIj48Yj5yZWRpcmVjdDwvYj4gPSBbSE9TVDpdUE9SVDwvZHQ+Cis8ZGQ+CisKKzxwPnJlZGlyZWN0IFNTTCBjbGllbnQgY29ubmVjdGlvbnMgb24gY2VydGlmaWNhdGUtYmFzZWQgYXV0aGVudGljYXRpb24gZmFpbHVyZXM8L3A+CisKKzxwPlRoaXMgb3B0aW9uIG9ubHkgd29ya3MgaW4gc2VydmVyIG1vZGUuIFNvbWUgcHJvdG9jb2wgbmVnb3RpYXRpb25zIGFyZSBhbHNvIGluY29tcGF0aWJsZSB3aXRoIHRoZSA8aT5yZWRpcmVjdDwvaT4gb3B0aW9uLjwvcD4KKworPC9kZD4KKzxkdCBpZD0icmVuZWdvdGlhdGlvbi15ZXMtbm8iPjxiPnJlbmVnb3RpYXRpb248L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5zdXBwb3J0IFNTTCByZW5lZ290aWF0aW9uPC9wPgorCis8cD5BcHBsaWNhdGlvbnMgb2YgdGhlIFNTTCByZW5lZ290aWF0aW9uIGluY2x1ZGUgc29tZSBhdXRoZW50aWNhdGlvbiBzY2VuYXJpb3MsIG9yIHJlLWtleWluZyBsb25nIGxhc3RpbmcgY29ubmVjdGlvbnMuPC9wPgorCis8cD5PbiB0aGUgb3RoZXIgaGFuZCB0aGlzIGZlYXR1cmUgY2FuIGZhY2lsaXRhdGUgYSB0cml2aWFsIENQVS1leGhhdXN0aW9uIERvUyBhdHRhY2s6PC9wPgorCis8cD48aT5odHRwOi8vdmluY2VudC5iZXJuYXQuaW0vZW4vYmxvZy8yMDExLXNzbC1kb3MtbWl0aWdhdGlvbi5odG1sPC9pPjwvcD4KKworPHA+UGxlYXNlIG5vdGUgdGhhdCBkaXNhYmxpbmcgU1NMIHJlbmVnb3RpYXRpb24gZG9lcyBub3QgZnVsbHkgbWl0aWdhdGUgdGhpcyBpc3N1ZS48L3A+CisKKzxwPmRlZmF1bHQ6IHllcyAoaWYgc3VwcG9ydGVkIGJ5IDxiPk9wZW5TU0w8L2I+KTwvcD4KKworPC9kZD4KKzxkdCBpZD0icmVzZXQteWVzLW5vIj48Yj5yZXNldDwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPmF0dGVtcHQgdG8gdXNlIHRoZSBUQ1AgUlNUIGZsYWcgdG8gaW5kaWNhdGUgYW4gZXJyb3I8L3A+CisKKzxwPlRoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMuPC9wPgorCis8cD5kZWZhdWx0OiB5ZXM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InJldHJ5LXllcy1ubyI+PGI+cmV0cnk8L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5yZWNvbm5lY3QgYSBjb25uZWN0K2V4ZWMgc2VjdGlvbiBhZnRlciBpdCYjMzk7cyBkaXNjb25uZWN0ZWQ8L3A+CisKKzxwPmRlZmF1bHQ6IG5vPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXNzaW9uQ2FjaGVTaXplLU5VTV9FTlRSSUVTIj48Yj5zZXNzaW9uQ2FjaGVTaXplPC9iPiA9IE5VTV9FTlRSSUVTPC9kdD4KKzxkZD4KKworPHA+c2Vzc2lvbiBjYWNoZSBzaXplPC9wPgorCis8cD48aT5zZXNzaW9uQ2FjaGVTaXplPC9pPiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlIGVudHJpZXMuPC9wPgorCis8cD5UaGUgdmFsdWUgb2YgMCBjYW4gYmUgdXNlZCBmb3IgdW5saW1pdGVkIHNpemUuIEl0IGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiB1c2UgZHVlIHRvIHRoZSByaXNrIG9mIGEgbWVtb3J5IGV4aGF1c3Rpb24gRG9TIGF0dGFjay48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNlc3Npb25DYWNoZVRpbWVvdXQtVElNRU9VVCI+PGI+c2Vzc2lvbkNhY2hlVGltZW91dDwvYj4gPSBUSU1FT1VUPC9kdD4KKzxkZD4KKworPHA+c2Vzc2lvbiBjYWNoZSB0aW1lb3V0PC9wPgorCis8cD5UaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBrZWVwIGNhY2hlZCBTU0wgc2Vzc2lvbnMuPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXNzaW9uZC1IT1NUOlBPUlQiPjxiPnNlc3Npb25kPC9iPiA9IEhPU1Q6UE9SVDwvZHQ+Cis8ZGQ+CisKKzxwPmFkZHJlc3Mgb2Ygc2Vzc2lvbmQgU1NMIGNhY2hlIHNlcnZlcjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic3NsVmVyc2lvbi1TU0xfVkVSU0lPTiI+PGI+c3NsVmVyc2lvbjwvYj4gPSBTU0xfVkVSU0lPTjwvZHQ+Cis8ZGQ+CisKKzxwPnNlbGVjdCB0aGUgU1NMIHByb3RvY29sIHZlcnNpb248L3A+CisKKzxwPlN1cHBvcnRlZCB2YWx1ZXM6IGFsbCwgU1NMdjIsIFNTTHYzLCBUTFN2MSwgVExTdjEuMSwgVExTdjEuMjwvcD4KKworPHA+QXZhaWxhYmlsaXR5IG9mIHNwZWNpZmljIHByb3RvY29scyBkZXBlbmRzIG9uIHRoZSBsaW5rZWQgT3BlblNTTCBsaWJyYXJ5LiBPbGRlciB2ZXJzaW9ucyBvZiBPcGVuU1NMIGRvIG5vdCBzdXBwb3J0IFRMU3YxLjEgYW5kIFRMU3YxLjIuIE5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wgZG8gbm90IHN1cHBvcnQgU1NMdjIuPC9wPgorCis8cD5PYnNvbGV0ZSBTU0x2MiBhbmQgU1NMdjMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCBieSBkZWZhdWx0LiBTZWUgdGhlIDxiPm9wdGlvbnM8L2I+IG9wdGlvbiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic3RhY2stQllURVMtZXhjZXB0LWZvci1GT1JLLW1vZGVsIj48Yj5zdGFjazwvYj4gPSBCWVRFUyAoZXhjZXB0IGZvciBGT1JLIG1vZGVsKTwvZHQ+Cis8ZGQ+CisKKzxwPnRocmVhZCBzdGFjayBzaXplPC9wPgorCis8L2RkPgorPGR0IGlkPSJUSU1FT1VUYnVzeS1TRUNPTkRTIj48Yj5USU1FT1VUYnVzeTwvYj4gPSBTRUNPTkRTPC9kdD4KKzxkZD4KKworPHA+dGltZSB0byB3YWl0IGZvciBleHBlY3RlZCBkYXRhPC9wPgorCis8L2RkPgorPGR0IGlkPSJUSU1FT1VUY2xvc2UtU0VDT05EUyI+PGI+VElNRU9VVGNsb3NlPC9iPiA9IFNFQ09ORFM8L2R0PgorPGRkPgorCis8cD50aW1lIHRvIHdhaXQgZm9yIGNsb3NlX25vdGlmeSAoc2V0IHRvIDAgZm9yIGJ1Z2d5IE1TSUUpPC9wPgorCis8L2RkPgorPGR0IGlkPSJUSU1FT1VUY29ubmVjdC1TRUNPTkRTIj48Yj5USU1FT1VUY29ubmVjdDwvYj4gPSBTRUNPTkRTPC9kdD4KKzxkZD4KKworPHA+dGltZSB0byB3YWl0IHRvIGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdDwvcD4KKworPC9kZD4KKzxkdCBpZD0iVElNRU9VVGlkbGUtU0VDT05EUyI+PGI+VElNRU9VVGlkbGU8L2I+ID0gU0VDT05EUzwvZHQ+Cis8ZGQ+CisKKzxwPnRpbWUgdG8ga2VlcCBhbiBpZGxlIGNvbm5lY3Rpb248L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InRyYW5zcGFyZW50LW5vbmUtc291cmNlLWRlc3RpbmF0aW9uLWJvdGgtVW5peC1vbmx5Ij48Yj50cmFuc3BhcmVudDwvYj4gPSBub25lIHwgc291cmNlIHwgZGVzdGluYXRpb24gfCBib3RoIChVbml4IG9ubHkpPC9kdD4KKzxkZD4KKworPHA+ZW5hYmxlIHRyYW5zcGFyZW50IHByb3h5IHN1cHBvcnQgb24gc2VsZWN0ZWQgcGxhdGZvcm1zPC9wPgorCis8cD5TdXBwb3J0ZWQgdmFsdWVzOjwvcD4KKworPGRsPgorCis8ZHQgaWQ9Im5vbmUiPjxpPm5vbmU8L2k+PC9kdD4KKzxkZD4KKworPHA+RGlzYWJsZSB0cmFuc3BhcmVudCBwcm94eSBzdXBwb3J0LiBUaGlzIGlzIHRoZSBkZWZhdWx0LjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic291cmNlIj48aT5zb3VyY2U8L2k+PC9kdD4KKzxkZD4KKworPHA+UmUtd3JpdGUgdGhlIGFkZHJlc3MgdG8gYXBwZWFyIGFzIGlmIGEgd3JhcHBlZCBkYWVtb24gaXMgY29ubmVjdGluZyBmcm9tIHRoZSBTU0wgY2xpZW50IG1hY2hpbmUgaW5zdGVhZCBvZiB0aGUgbWFjaGluZSBydW5uaW5nIDxiPnN0dW5uZWw8L2I+LjwvcD4KKworPHA+VGhpcyBvcHRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBpbjo8L3A+CisKKzxkbD4KKworPGR0IGlkPSJSZW1vdGUtbW9kZS1jb25uZWN0LW9wdGlvbi1vbi1MaW51eC0yLjYuMjgiPlJlbW90ZSBtb2RlICg8aT5jb25uZWN0PC9pPiBvcHRpb24pIG9uIDxpPkxpbnV4ICZndDs9Mi42LjI4PC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyA8Yj5zdHVubmVsPC9iPiB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0IHRoZSA8aT5zZXR1aWQ8L2k+IG9wdGlvbi48L3A+CisKKzxwPlRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHNldHVwIGZvciBpcHRhYmxlcyBhbmQgcm91dGluZyAocG9zc2libHkgaW4gL2V0Yy9yYy5sb2NhbCBvciBlcXVpdmFsZW50IGZpbGUpOjwvcD4KKworPHByZT48Y29kZT4gICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1OIERJVkVSVAorICAgIGlwdGFibGVzIC10IG1hbmdsZSAtQSBQUkVST1VUSU5HIC1wIHRjcCAtbSBzb2NrZXQgLWogRElWRVJUCisgICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIERJVkVSVCAtaiBNQVJLIC0tc2V0LW1hcmsgMQorICAgIGlwdGFibGVzIC10IG1hbmdsZSAtQSBESVZFUlQgLWogQUNDRVBUCisgICAgaXAgcnVsZSBhZGQgZndtYXJrIDEgbG9va3VwIDEwMAorICAgIGlwIHJvdXRlIGFkZCBsb2NhbCAwLjAuMC4wLzAgZGV2IGxvIHRhYmxlIDEwMAorICAgIGVjaG8gMCAmZ3Q7L3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvbG8vcnBfZmlsdGVyPC9jb2RlPjwvcHJlPgorCis8cD48Yj5zdHVubmVsPC9iPiBtdXN0IGFsc28gdG8gYmUgZXhlY3V0ZWQgYXMgcm9vdCBhbmQgd2l0aG91dCB0aGUgPGk+c2V0dWlkPC9pPiBvcHRpb24uPC9wPgorCis8L2RkPgorPGR0IGlkPSJSZW1vdGUtbW9kZS1jb25uZWN0LW9wdGlvbi1vbi1MaW51eC0yLjIueCI+UmVtb3RlIG1vZGUgKDxpPmNvbm5lY3Q8L2k+IG9wdGlvbikgb24gPGk+TGludXggMi4yLng8L2k+PC9kdD4KKzxkZD4KKworPHA+VGhpcyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIHRoZSBrZXJuZWwgdG8gYmUgY29tcGlsZWQgd2l0aCB0aGUgPGk+dHJhbnNwYXJlbnQgcHJveHk8L2k+IG9wdGlvbi4gQ29ubmVjdGVkIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQgb24gYSBzZXBhcmF0ZSBob3N0LiBSb3V0aW5nIHRvd2FyZHMgdGhlIGNsaWVudHMgaGFzIHRvIGdvIHRocm91Z2ggdGhlIDxiPnN0dW5uZWw8L2I+IGJveC48L3A+CisKKzxwPjxiPnN0dW5uZWw8L2I+IG11c3QgYWxzbyB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0IHRoZSA8aT5zZXR1aWQ8L2k+IG9wdGlvbi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlJlbW90ZS1tb2RlLWNvbm5lY3Qtb3B0aW9uLW9uLUZyZWVCU0QtOC4wIj5SZW1vdGUgbW9kZSAoPGk+Y29ubmVjdDwvaT4gb3B0aW9uKSBvbiA8aT5GcmVlQlNEICZndDs9OC4wPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBhZGRpdGlvbmFsIGZpcmV3YWxsIGFuZCByb3V0aW5nIHNldHVwLiA8Yj5zdHVubmVsPC9iPiBtdXN0IGFsc28gdG8gYmUgZXhlY3V0ZWQgYXMgcm9vdCBhbmQgd2l0aG91dCB0aGUgPGk+c2V0dWlkPC9pPiBvcHRpb24uPC9wPgorCis8L2RkPgorPGR0IGlkPSJMb2NhbC1tb2RlLWV4ZWMtb3B0aW9uIj5Mb2NhbCBtb2RlICg8aT5leGVjPC9pPiBvcHRpb24pPC9kdD4KKzxkZD4KKworPHA+VGhpcyBjb25maWd1cmF0aW9uIHdvcmtzIGJ5IHByZS1sb2FkaW5nIHRoZSA8aT5saWJzdHVubmVsLnNvPC9pPiBzaGFyZWQgbGlicmFyeS4gX1JMRF9MSVNUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgb24gVHJ1NjQsIGFuZCBMRF9QUkVMT0FEIHZhcmlhYmxlIG9uIG90aGVyIHBsYXRmb3Jtcy48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8L2RkPgorPGR0IGlkPSJkZXN0aW5hdGlvbiI+PGk+ZGVzdGluYXRpb248L2k+PC9kdD4KKzxkZD4KKworPHA+VGhlIG9yaWdpbmFsIGRlc3RpbmF0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgPGk+Y29ubmVjdDwvaT4gb3B0aW9uLjwvcD4KKworPHA+QSBzZXJ2aWNlIHNlY3Rpb24gZm9yIHRyYW5zcGFyZW50IGRlc3RpbmF0aW9uIG1heSBsb29rIGxpa2UgdGhpczo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIFt0cmFuc3BhcmVudF0KKyAgICBjbGllbnQ9eWVzCisgICAgYWNjZXB0PSZsdDtzdHVubmVsX3BvcnQmZ3Q7CisgICAgdHJhbnNwYXJlbnQ9ZGVzdGluYXRpb248L2NvZGU+PC9wcmU+CisKKzxwPlRoaXMgY29uZmlndXJhdGlvbiByZXF1aXJlcyBpcHRhYmxlcyBzZXR1cCB0byB3b3JrLCBwb3NzaWJseSBpbiAvZXRjL3JjLmxvY2FsIG9yIGVxdWl2YWxlbnQgZmlsZS48L3A+CisKKzxwPkZvciBhIGNvbm5lY3QgdGFyZ2V0IGluc3RhbGxlZCBvbiB0aGUgc2FtZSBob3N0OjwvcD4KKworPHByZT48Y29kZT4gICAgL3NiaW4vaXB0YWJsZXMgLXQgbmF0IC1JIE9VVFBVVCAtcCB0Y3AgLS1kcG9ydCAmbHQ7cmVkaXJlY3RlZF9wb3J0Jmd0OyBcCisgICAgICAgIC1tICEgLS11aWQtb3duZXIgJmx0O3N0dW5uZWxfdXNlcl9pZCZndDsgXAorICAgICAgICAtaiBETkFUIC0tdG8tZGVzdGluYXRpb24gJmx0O2xvY2FsX2lwJmd0OzombHQ7c3R1bm5lbF9wb3J0Jmd0OzwvY29kZT48L3ByZT4KKworPHA+Rm9yIGEgY29ubmVjdCB0YXJnZXQgaW5zdGFsbGVkIG9uIGEgcmVtb3RlIGhvc3Q6PC9wPgorCis8cHJlPjxjb2RlPiAgICAvc2Jpbi9pcHRhYmxlcyAtSSBJTlBVVCAtaSBldGgwIC1wIHRjcCAtLWRwb3J0ICZsdDtzdHVubmVsX3BvcnQmZ3Q7IC1qIEFDQ0VQVAorICAgIC9zYmluL2lwdGFibGVzIC10IG5hdCAtSSBQUkVST1VUSU5HIC1wIHRjcCAtLWRwb3J0ICZsdDtyZWRpcmVjdGVkX3BvcnQmZ3Q7IFwKKyAgICAgICAgLWkgZXRoMCAtaiBETkFUIC0tdG8tZGVzdGluYXRpb24gJmx0O2xvY2FsX2lwJmd0OzombHQ7c3R1bm5lbF9wb3J0Jmd0OzwvY29kZT48L3ByZT4KKworPHA+VGhlIHRyYW5zcGFyZW50IGRlc3RpbmF0aW9uIG9wdGlvbiBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gTGludXguPC9wPgorCis8L2RkPgorPGR0IGlkPSJib3RoIj48aT5ib3RoPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlVzZSBib3RoIDxpPnNvdXJjZTwvaT4gYW5kIDxpPmRlc3RpbmF0aW9uPC9pPiB0cmFuc3BhcmVudCBwcm94eS48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8cD5Ud28gbGVnYWN5IG9wdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OjwvcD4KKworPGRsPgorCis8ZHQgaWQ9InllcyI+PGk+eWVzPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlRoaXMgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gPGk+c291cmNlPC9pPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im5vIj48aT5ubzwvaT48L2R0PgorPGRkPgorCis8cD5UaGlzIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIDxpPm5vbmU8L2k+LjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzwvZGQ+Cis8ZHQgaWQ9InZlcmlmeS1MRVZFTCI+PGI+dmVyaWZ5PC9iPiA9IExFVkVMPC9kdD4KKzxkZD4KKworPHA+dmVyaWZ5IHRoZSBwZWVyIGNlcnRpZmljYXRlPC9wPgorCis8ZGw+CisKKzxkdCBpZD0ibGV2ZWwtMCI+bGV2ZWwgMDwvZHQ+Cis8ZGQ+CisKKzxwPlJlcXVlc3QgYW5kIGlnbm9yZSB0aGUgcGVlciBjZXJ0aWZpY2F0ZS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImxldmVsLTEiPmxldmVsIDE8L2R0PgorPGRkPgorCis8cD5WZXJpZnkgdGhlIHBlZXIgY2VydGlmaWNhdGUgaWYgcHJlc2VudC48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImxldmVsLTIiPmxldmVsIDI8L2R0PgorPGRkPgorCis8cD5WZXJpZnkgdGhlIHBlZXIgY2VydGlmaWNhdGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJsZXZlbC0zIj5sZXZlbCAzPC9kdD4KKzxkZD4KKworPHA+VmVyaWZ5IHRoZSBwZWVyIHdpdGggbG9jYWxseSBpbnN0YWxsZWQgY2VydGlmaWNhdGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJsZXZlbC00Ij5sZXZlbCA0PC9kdD4KKzxkZD4KKworPHA+SWdub3JlIHRoZSBDQSBjaGFpbiBhbmQgb25seSB2ZXJpZnkgdGhlIHBlZXIgY2VydGlmaWNhdGUuPC9wPgorCis8L2RkPgorPGR0IGlkPSJkZWZhdWx0Ij5kZWZhdWx0PC9kdD4KKzxkZD4KKworPHA+Tm8gdmVyaWZ5LjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxwPkl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoYXQgdGhpcyBvcHRpb24gd2FzIHNvbGVseSBkZXNpZ25lZCBmb3IgYWNjZXNzIGNvbnRyb2wgYW5kIG5vdCBmb3IgYXV0aG9yaXphdGlvbi4gU3BlY2lmaWNhbGx5IGZvciBsZXZlbCAyIGV2ZXJ5IG5vbi1yZXZva2VkIGNlcnRpZmljYXRlIGlzIGFjY2VwdGVkIHJlZ2FyZGxlc3Mgb2YgaXRzIENvbW1vbiBOYW1lLiBGb3IgdGhpcyByZWFzb24gYSBkZWRpY2F0ZWQgQ0Egc2hvdWxkIGJlIHVzZWQgd2l0aCBsZXZlbCAyLCBhbmQgbm90IGEgZ2VuZXJpYyBDQSBjb21tb25seSB1c2VkIGZvciB3ZWJzZXJ2ZXJzLiBMZXZlbCAzIGlzIHByZWZlcnJlZCBmb3IgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbnMuPC9wPgorCis8L2RkPgorPC9kbD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IlJFVFVSTi1WQUxVRSI+UkVUVVJOIFZBTFVFPC9oMT48L2E+CisKKzxwPjxiPnN0dW5uZWw8L2I+IHJldHVybnMgemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvci48L3A+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJTSUdOQUxTIj5TSUdOQUxTPC9oMT48L2E+CisKKzxwPlRoZSBmb2xsb3dpbmcgc2lnbmFscyBjYW4gYmUgdXNlZCB0byBjb250cm9sIDxiPnN0dW5uZWw8L2I+IGluIFVuaXggZW52aXJvbm1lbnQ6PC9wPgorCis8ZGw+CisKKzxkdCBpZD0iU0lHSFVQIj5TSUdIVVA8L2R0PgorPGRkPgorCis8cD5Gb3JjZSBhIHJlbG9hZCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLjwvcD4KKworPHA+U29tZSBnbG9iYWwgb3B0aW9ucyB3aWxsIG5vdCBiZSByZWxvYWRlZDo8L3A+CisKKzx1bD4KKworPGxpPjxwPmNocm9vdDwvcD4KKworPC9saT4KKzxsaT48cD5mb3JlZ3JvdW5kPC9wPgorCis8L2xpPgorPGxpPjxwPnBpZDwvcD4KKworPC9saT4KKzxsaT48cD5zZXRnaWQ8L3A+CisKKzwvbGk+Cis8bGk+PHA+c2V0dWlkPC9wPgorCis8L2xpPgorPC91bD4KKworPHA+VGhlIHVzZSBvZiB0aGUgJiMzOTtzZXR1aWQmIzM5OyBvcHRpb24gd2lsbCBhbHNvIHByZXZlbnQgPGI+c3R1bm5lbDwvYj4gZnJvbSBiaW5kaW5nIHRvIHByaXZpbGVnZWQgKCZsdDsxMDI0KSBwb3J0cyBkdXJpbmcgY29uZmlndXJhdGlvbiByZWxvYWRpbmcuPC9wPgorCis8cD5XaGVuIHRoZSAmIzM5O2Nocm9vdCYjMzk7IG9wdGlvbiBpcyB1c2VkLCA8Yj5zdHVubmVsPC9iPiB3aWxsIGxvb2sgZm9yIGFsbCBpdHMgZmlsZXMgKGluY2x1ZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBjZXJ0aWZpY2F0ZXMsIHRoZSBsb2cgZmlsZSBhbmQgdGhlIHBpZCBmaWxlKSB3aXRoaW4gdGhlIGNocm9vdCBqYWlsLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iU0lHVVNSMSI+U0lHVVNSMTwvZHQ+Cis8ZGQ+CisKKzxwPkNsb3NlIGFuZCByZW9wZW4gdGhlIDxiPnN0dW5uZWw8L2I+IGxvZyBmaWxlLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBsb2cgcm90YXRpb24uPC9wPgorCis8L2RkPgorPGR0IGlkPSJTSUdURVJNLVNJR1FVSVQtU0lHSU5UIj5TSUdURVJNLCBTSUdRVUlULCBTSUdJTlQ8L2R0PgorPGRkPgorCis8cD5TaHV0IDxiPnN0dW5uZWw8L2I+IGRvd24uPC9wPgorCis8L2RkPgorPC9kbD4KKworPHA+VGhlIHJlc3VsdCBvZiBzZW5kaW5nIGFueSBvdGhlciBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIgaXMgdW5kZWZpbmVkLjwvcD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IkVYQU1QTEVTIj5FWEFNUExFUzwvaDE+PC9hPgorCis8cD5JbiBvcmRlciB0byBwcm92aWRlIFNTTCBlbmNhcHN1bGF0aW9uIHRvIHlvdXIgbG9jYWwgPGk+aW1hcGQ8L2k+IHNlcnZpY2UsIHVzZTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIFtpbWFwZF0KKyAgICBhY2NlcHQgPSA5OTMKKyAgICBleGVjID0gL3Vzci9zYmluL2ltYXBkCisgICAgZXhlY0FyZ3MgPSBpbWFwZDwvY29kZT48L3ByZT4KKworPHA+b3IgaW4gcmVtb3RlIG1vZGU6PC9wPgorCis8cHJlPjxjb2RlPiAgICBbaW1hcGRdCisgICAgYWNjZXB0ID0gOTkzCisgICAgY29ubmVjdCA9IDE0MzwvY29kZT48L3ByZT4KKworPHA+SW4gb3JkZXIgdG8gbGV0IHlvdXIgbG9jYWwgZS1tYWlsIGNsaWVudCBjb25uZWN0IHRvIGFuIFNTTC1lbmFibGVkIDxpPmltYXBkPC9pPiBzZXJ2aWNlIG9uIGFub3RoZXIgc2VydmVyLCBjb25maWd1cmUgdGhlIGUtbWFpbCBjbGllbnQgdG8gY29ubmVjdCB0byBsb2NhbGhvc3Qgb24gcG9ydCAxMTkgYW5kIHVzZTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIFtpbWFwXQorICAgIGNsaWVudCA9IHllcworICAgIGFjY2VwdCA9IDE0MworICAgIGNvbm5lY3QgPSBzZXJ2ZXJuYW1lOjk5MzwvY29kZT48L3ByZT4KKworPHA+SWYgeW91IHdhbnQgdG8gcHJvdmlkZSB0dW5uZWxpbmcgdG8geW91ciA8aT5wcHBkPC9pPiBkYWVtb24gb24gcG9ydCAyMDIwLCB1c2Ugc29tZXRoaW5nIGxpa2U6PC9wPgorCis8cHJlPjxjb2RlPiAgICBbdnBuXQorICAgIGFjY2VwdCA9IDIwMjAKKyAgICBleGVjID0gL3Vzci9zYmluL3BwcGQKKyAgICBleGVjQXJncyA9IHBwcGQgbG9jYWwKKyAgICBwdHkgPSB5ZXM8L2NvZGU+PC9wcmU+CisKKzxwPklmIHlvdSB3YW50IHRvIHVzZSA8Yj5zdHVubmVsPC9iPiBpbiA8aT5pbmV0ZDwvaT4gbW9kZSB0byBsYXVuY2ggeW91ciBpbWFwZCBwcm9jZXNzLCB5b3UmIzM5O2QgdXNlIHRoaXMgPGk+c3R1bm5lbC5jb25mPC9pPi4gTm90ZSB0aGVyZSBtdXN0IGJlIG5vIDxpPltzZXJ2aWNlX25hbWVdPC9pPiBzZWN0aW9uLjwvcD4KKworPHByZT48Y29kZT4gICAgZXhlYyA9IC91c3Ivc2Jpbi9pbWFwZAorICAgIGV4ZWNBcmdzID0gaW1hcGQ8L2NvZGU+PC9wcmU+CisKKzxwPlRvIHNldHVwIFNPQ0tTIFZQTiBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBjbGllbnQgc2VydmljZTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIFtzb2Nrc19jbGllbnRdCisgICAgY2xpZW50ID0geWVzCisgICAgYWNjZXB0ID0gMTI3LjAuMC4xOjEwODAKKyAgICBjb25uZWN0ID0gdnBuX3NlcnZlcjo5MDgwCisgICAgdmVyaWZ5ID0gNAorICAgIENBZmlsZSA9IHN0dW5uZWwucGVtPC9jb2RlPjwvcHJlPgorCis8cD5UaGUgY29ycmVzcG9uZGluZyBjb25maWd1cmF0aW9uIG9uIHRoZSB2cG5fc2VydmVyIGhvc3Q6PC9wPgorCis8cHJlPjxjb2RlPiAgICBbc29ja3Nfc2VydmVyXQorICAgIHByb3RvY29sID0gc29ja3MKKyAgICBhY2NlcHQgPSA5MDgwCisgICAgY2VydCA9IHN0dW5uZWwucGVtCisgICAga2V5ID0gc3R1bm5lbC5rZXk8L2NvZGU+PC9wcmU+CisKKzxwPk5vdyB0ZXN0IHlvdXIgY29uZmlndXJhdGlvbiBvbiB0aGUgY2xpZW50IG1hY2hpbmUgd2l0aDo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIGN1cmwgLS1zb2NrczRhIGxvY2FsaG9zdCBodHRwOi8vd3d3LmV4YW1wbGUuY29tLzwvY29kZT48L3ByZT4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9Ik5PVEVTIj5OT1RFUzwvaDE+PC9hPgorCis8aDIgaWQ9IlJFU1RSSUNUSU9OUyI+UkVTVFJJQ1RJT05TPC9oMj4KKworPHA+PGI+c3R1bm5lbDwvYj4gY2Fubm90IGJlIHVzZWQgZm9yIHRoZSBGVFAgZGFlbW9uIGJlY2F1c2Ugb2YgdGhlIG5hdHVyZSBvZiB0aGUgRlRQIHByb3RvY29sIHdoaWNoIHV0aWxpemVzIG11bHRpcGxlIHBvcnRzIGZvciBkYXRhIHRyYW5zZmVycy4gVGhlcmUgYXJlIGF2YWlsYWJsZSBTU0wtZW5hYmxlZCB2ZXJzaW9ucyBvZiBGVFAgYW5kIHRlbG5ldCBkYWVtb25zLCBob3dldmVyLjwvcD4KKworPGgyIGlkPSJJTkVURC1NT0RFIj5JTkVURCBNT0RFPC9oMj4KKworPHA+VGhlIG1vc3QgY29tbW9uIHVzZSBvZiA8Yj5zdHVubmVsPC9iPiBpcyB0byBsaXN0ZW4gb24gYSBuZXR3b3JrIHBvcnQgYW5kIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHdpdGggZWl0aGVyIGEgbmV3IHBvcnQgdmlhIHRoZSBjb25uZWN0IG9wdGlvbiwgb3IgYSBuZXcgcHJvZ3JhbSB2aWEgdGhlIDxpPmV4ZWM8L2k+IG9wdGlvbi4gSG93ZXZlciB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVuIHlvdSB3aXNoIHRvIGhhdmUgc29tZSBvdGhlciBwcm9ncmFtIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQgbGF1bmNoIDxiPnN0dW5uZWw8L2I+LCBmb3IgZXhhbXBsZSB3aXRoIDxpPmluZXRkPC9pPiwgPGk+eGluZXRkPC9pPiwgb3IgPGk+dGNwc2VydmVyPC9pPi48L3A+CisKKzxwPkZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gPGk+aW5ldGQuY29uZjwvaT46PC9wPgorCis8cHJlPjxjb2RlPiAgICBpbWFwcyBzdHJlYW0gdGNwIG5vd2FpdCByb290IEBiaW5kaXJAL3N0dW5uZWwgc3R1bm5lbCBAc3lzY29uZmRpckAvc3R1bm5lbC9pbWFwcy5jb25mPC9jb2RlPjwvcHJlPgorCis8cD5JbiB0aGVzZSBjYXNlcywgdGhlIDxpPmluZXRkPC9pPi1zdHlsZSBwcm9ncmFtIGlzIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIGEgbmV0d29yayBzb2NrZXQgKDxpPmltYXBzPC9pPiBhYm92ZSkgYW5kIGhhbmRpbmcgaXQgdG8gPGI+c3R1bm5lbDwvYj4gd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmVjZWl2ZWQuIFRodXMgeW91IGRvIG5vdCB3YW50IDxiPnN0dW5uZWw8L2I+IHRvIGhhdmUgYW55IDxpPmFjY2VwdDwvaT4gb3B0aW9uLiBBbGwgdGhlIDxpPlNlcnZpY2UgTGV2ZWwgT3B0aW9uczwvaT4gc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgZ2xvYmFsIG9wdGlvbnMgc2VjdGlvbiwgYW5kIG5vIDxpPltzZXJ2aWNlX25hbWVdPC9pPiBzZWN0aW9uIHdpbGwgYmUgcHJlc2VudC4gU2VlIHRoZSA8aT5FWEFNUExFUzwvaT4gc2VjdGlvbiBmb3IgZXhhbXBsZSBjb25maWd1cmF0aW9ucy48L3A+CisKKzxoMiBpZD0iQ0VSVElGSUNBVEVTIj5DRVJUSUZJQ0FURVM8L2gyPgorCis8cD5FYWNoIFNTTC1lbmFibGVkIGRhZW1vbiBuZWVkcyB0byBwcmVzZW50IGEgdmFsaWQgWC41MDkgY2VydGlmaWNhdGUgdG8gdGhlIHBlZXIuIEl0IGFsc28gbmVlZHMgYSBwcml2YXRlIGtleSB0byBkZWNyeXB0IHRoZSBpbmNvbWluZyBkYXRhLiBUaGUgZWFzaWVzdCB3YXkgdG8gb2J0YWluIGEgY2VydGlmaWNhdGUgYW5kIGEga2V5IGlzIHRvIGdlbmVyYXRlIHRoZW0gd2l0aCB0aGUgZnJlZSA8Yj5PcGVuU1NMPC9iPiBwYWNrYWdlLiBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBvbiBjZXJ0aWZpY2F0ZXMgZ2VuZXJhdGlvbiBvbiBwYWdlcyBsaXN0ZWQgYmVsb3cuPC9wPgorCis8cD5UaGUgb3JkZXIgb2YgY29udGVudHMgb2YgdGhlIDxpPi5wZW08L2k+IGZpbGUgaXMgaW1wb3J0YW50LiBJdCBzaG91bGQgY29udGFpbiB0aGUgdW5lbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgZmlyc3QsIHRoZW4gYSBzaWduZWQgY2VydGlmaWNhdGUgKG5vdCBjZXJ0aWZpY2F0ZSByZXF1ZXN0KS4gVGhlcmUgc2hvdWxkIGFsc28gYmUgZW1wdHkgbGluZXMgYWZ0ZXIgdGhlIGNlcnRpZmljYXRlIGFuZCB0aGUgcHJpdmF0ZSBrZXkuIEFueSBwbGFpbnRleHQgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gYXBwZW5kZWQgb24gdGhlIHRvcCBvZiBnZW5lcmF0ZWQgY2VydGlmaWNhdGUgc2hvdWxkIGJlIGRpc2NhcmRlZC4gU28gdGhlIGZpbGUgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOjwvcD4KKworPHByZT48Y29kZT4gICAgLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFtlbmNvZGVkIGtleV0KKyAgICAtLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFtlbXB0eSBsaW5lXQorICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorICAgIFtlbmNvZGVkIGNlcnRpZmljYXRlXQorICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAgICBbZW1wdHkgbGluZV08L2NvZGU+PC9wcmU+CisKKzxoMiBpZD0iUkFORE9NTkVTUyI+UkFORE9NTkVTUzwvaDI+CisKKzxwPjxiPnN0dW5uZWw8L2I+IG5lZWRzIHRvIHNlZWQgdGhlIFBSTkcgKHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcikgaW4gb3JkZXIgZm9yIFNTTCB0byB1c2UgZ29vZCByYW5kb21uZXNzLiBUaGUgZm9sbG93aW5nIHNvdXJjZXMgYXJlIGxvYWRlZCBpbiBvcmRlciB1bnRpbCBzdWZmaWNpZW50IHJhbmRvbSBkYXRhIGhhcyBiZWVuIGdhdGhlcmVkOjwvcD4KKworPHVsPgorCis8bGk+PHA+VGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIDxpPlJORGZpbGU8L2k+IGZsYWcuPC9wPgorCis8L2xpPgorPGxpPjxwPlRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgUkFOREZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldC48L3A+CisKKzwvbGk+Cis8bGk+PHA+VGhlIGZpbGUgLnJuZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LCBpZiBSQU5ERklMRSBub3Qgc2V0LjwvcD4KKworPC9saT4KKzxsaT48cD5UaGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAmIzM5Oy0td2l0aC1yYW5kb20mIzM5OyBhdCBjb21waWxlIHRpbWUuPC9wPgorCis8L2xpPgorPGxpPjxwPlRoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuIGlmIHJ1bm5pbmcgb24gV2luZG93cy48L3A+CisKKzwvbGk+Cis8bGk+PHA+VGhlIGVnZCBzb2NrZXQgc3BlY2lmaWVkIHdpdGggdGhlIDxpPkVHRDwvaT4gZmxhZy48L3A+CisKKzwvbGk+Cis8bGk+PHA+VGhlIGVnZCBzb2NrZXQgc3BlY2lmaWVkIHdpdGggJiMzOTstLXdpdGgtZWdkLXNvY2smIzM5OyBhdCBjb21waWxlIHRpbWUuPC9wPgorCis8L2xpPgorPGxpPjxwPlRoZSAvZGV2L3VyYW5kb20gZGV2aWNlLjwvcD4KKworPC9saT4KKzwvdWw+CisKKzxwPldpdGggcmVjZW50ICg8Yj5PcGVuU1NMIDAuOS41YTwvYj4gb3IgbGF0ZXIpIHZlcnNpb24gb2YgU1NMIGl0IHdpbGwgc3RvcCBsb2FkaW5nIHJhbmRvbSBkYXRhIGF1dG9tYXRpY2FsbHkgd2hlbiBzdWZmaWNpZW50IGVudHJvcHkgaGFzIGJlZW4gZ2F0aGVyZWQuIFdpdGggcHJldmlvdXMgdmVyc2lvbnMgaXQgd2lsbCBjb250aW51ZSB0byBnYXRoZXIgZnJvbSBhbGwgdGhlIGFib3ZlIHNvdXJjZXMgc2luY2Ugbm8gU1NMIGZ1bmN0aW9uIGV4aXN0cyB0byB0ZWxsIHdoZW4gZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlLjwvcD4KKworPHA+Tm90ZSB0aGF0IG9uIFdpbmRvd3MgbWFjaGluZXMgdGhhdCBkbyBub3QgaGF2ZSBjb25zb2xlIHVzZXIgaW50ZXJhY3Rpb24gKG1vdXNlIG1vdmVtZW50cywgY3JlYXRpbmcgd2luZG93cywgZXRjLikgdGhlIHNjcmVlbiBjb250ZW50cyBhcmUgbm90IHZhcmlhYmxlIGVub3VnaCB0byBiZSBzdWZmaWNpZW50LCBhbmQgeW91IHNob3VsZCBwcm92aWRlIGEgcmFuZG9tIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSA8aT5STkRmaWxlPC9pPiBmbGFnLjwvcD4KKworPHA+Tm90ZSB0aGF0IHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSA8aT5STkRmaWxlPC9pPiBmbGFnIHNob3VsZCBjb250YWluIHJhbmRvbSBkYXRhIC0tIHRoYXQgbWVhbnMgaXQgc2hvdWxkIGNvbnRhaW4gZGlmZmVyZW50IGluZm9ybWF0aW9uIGVhY2ggdGltZSA8Yj5zdHVubmVsPC9iPiBpcyBydW4uIFRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IHVubGVzcyB0aGUgPGk+Uk5Eb3ZlcndyaXRlPC9pPiBmbGFnIGlzIHVzZWQuIElmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGlzIGZpbGUgbWFudWFsbHksIHRoZSA8aT5vcGVuc3NsIHJhbmQ8L2k+IGNvbW1hbmQgaW4gcmVjZW50IHZlcnNpb25zIG9mIDxiPk9wZW5TU0w8L2I+LCB3b3VsZCBiZSB1c2VmdWwuPC9wPgorCis8cD5JbXBvcnRhbnQgbm90ZTogSWYgL2Rldi91cmFuZG9tIGlzIGF2YWlsYWJsZSwgPGI+T3BlblNTTDwvYj4gb2Z0ZW4gc2VlZHMgdGhlIFBSTkcgd2l0aCBpdCB3aGlsZSBjaGVja2luZyB0aGUgcmFuZG9tIHN0YXRlLiBPbiBzeXN0ZW1zIHdpdGggL2Rldi91cmFuZG9tIDxiPk9wZW5TU0w8L2I+IGlzIGxpa2VseSB0byB1c2UgaXQgZXZlbiB0aG91Z2ggaXQgaXMgbGlzdGVkIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgbGlzdCBhYm92ZS4gVGhpcyBpcyB0aGUgYmVoYXZpb3VyIG9mIDxiPk9wZW5TU0w8L2I+IGFuZCBub3QgPGI+c3R1bm5lbDwvYj4uPC9wPgorCis8aDIgaWQ9IkRILVBBUkFNRVRFUlMiPkRIIFBBUkFNRVRFUlM8L2gyPgorCis8cD48Yj5zdHVubmVsPC9iPiA0LjQwIGFuZCBsYXRlciBjb250YWlucyBoYXJkY29kZWQgMjA0OC1iaXQgREggcGFyYW1ldGVycy4gU3RhcnRpbmcgd2l0aCA8Yj5zdHVubmVsPC9iPiA1LjE4LCB0aGVzZSBoYXJkY29kZWQgREggcGFyYW1ldGVycyBhcmUgcmVwbGFjZWQgZXZlcnkgMjQgaG91cnMgd2l0aCBhdXRvZ2VuZXJhdGVkIHRlbXBvcmFyeSBESCBwYXJhbWV0ZXJzLiBESCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBtYXkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuPC9wPgorCis8cD5BbHRlcm5hdGl2ZWx5LCBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IHN0YXRpYyBESCBwYXJhbWV0ZXJzIGluIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLCB3aGljaCBkaXNhYmxlcyBnZW5lcmF0aW5nIHRlbXBvcmFyeSBESCBwYXJhbWV0ZXJzOjwvcD4KKworPHByZT48Y29kZT4gICAgb3BlbnNzbCBkaHBhcmFtIDIwNDggJmd0OyZndDsgc3R1bm5lbC5wZW08L2NvZGU+PC9wcmU+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJGSUxFUyI+RklMRVM8L2gxPjwvYT4KKworPGRsPgorCis8ZHQgaWQ9InN5c2NvbmZkaXItc3R1bm5lbC1zdHVubmVsLmNvbmYiPjxpPkBzeXNjb25mZGlyQC9zdHVubmVsL3N0dW5uZWwuY29uZjwvaT48L2R0PgorPGRkPgorCis8cD48Yj5zdHVubmVsPC9iPiBjb25maWd1cmF0aW9uIGZpbGU8L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iQlVHUyI+QlVHUzwvaDE+PC9hPgorCis8cD5UaGUgPGk+ZXhlY0FyZ3M8L2k+IG9wdGlvbiBhbmQgdGhlIFdpbjMyIGNvbW1hbmQgbGluZSBkbyBub3Qgc3VwcG9ydCBxdW90aW5nLjwvcD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IlNFRS1BTFNPIj5TRUUgQUxTTzwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0idGNwZC04Ij48YSBocmVmPSJodHRwOi8vbWFuLmhlLm5ldC9tYW44L3RjcGQiPnRjcGQoOCk8L2E+PC9kdD4KKzxkZD4KKworPHA+YWNjZXNzIGNvbnRyb2wgZmFjaWxpdHkgZm9yIGludGVybmV0IHNlcnZpY2VzPC9wPgorCis8L2RkPgorPGR0IGlkPSJpbmV0ZC04Ij48YSBocmVmPSJodHRwOi8vbWFuLmhlLm5ldC9tYW44L2luZXRkIj5pbmV0ZCg4KTwvYT48L2R0PgorPGRkPgorCis8cD5pbnRlcm5ldCAmIzM5O3N1cGVyLXNlcnZlciYjMzk7PC9wPgorCis8L2RkPgorPGR0IGlkPSJodHRwOi13d3cuc3R1bm5lbC5vcmciPjxpPmh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPjxiPnN0dW5uZWw8L2I+IGhvbWVwYWdlPC9wPgorCis8L2RkPgorPGR0IGlkPSJodHRwOi13d3cub3BlbnNzbC5vcmciPjxpPmh0dHA6Ly93d3cub3BlbnNzbC5vcmcvPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPjxiPk9wZW5TU0w8L2I+IHByb2plY3Qgd2Vic2l0ZTwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJBVVRIT1IiPkFVVEhPUjwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0iTWljaGEtVHJvam5hcmEiPk1pY2hhJiN4MTQyOyBUcm9qbmFyYTwvZHQ+Cis8ZGQ+CisKKzxwPiZsdDs8aT5NaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ8L2k+Jmd0OzwvcD4KKworPC9kZD4KKzwvZGw+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgorPHRyPjx0ZCBjbGFzcz0iX3BvZGJsb2NrXyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7IGNvbG9yOiAjMDAwIiB2YWxpZ249Im1pZGRsZSI+Cis8YmlnPjxzdHJvbmc+PHNwYW4gY2xhc3M9Il9wb2RibG9ja18iPiZuYnNwO3N0dW5uZWwgVExTIFByb3h5PC9zcGFuPjwvc3Ryb25nPjwvYmlnPgorPC90ZD48L3RyPgorPC90YWJsZT4KKworPC9ib2R5PgorCis8L2h0bWw+CisKKwpkaWZmIC0tZ2l0IGEvZG9jL3N0dW5uZWwucGwuOC5pbiBiL2RvYy9zdHVubmVsLnBsLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNzFjMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zdHVubmVsLnBsLjguaW4KQEAgLTAsMCArMSwxMjgzIEBACisuXCIgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgUG9kOjpNYW4gMi4yOCAoUG9kOjpTaW1wbGUgMy4yOCkKKy5cIgorLlwiIFN0YW5kYXJkIHByZWFtYmxlOgorLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLmRlIFNwIFwiIFZlcnRpY2FsIHNwYWNlICh3aGVuIHdlIGNhbid0IHVzZSAuUFApCisuaWYgdCAuc3AgLjV2CisuaWYgbiAuc3AKKy4uCisuZGUgVmIgXCIgQmVnaW4gdmVyYmF0aW0gdGV4dAorLmZ0IENXCisubmYKKy5uZSBcXCQxCisuLgorLmRlIFZlIFwiIEVuZCB2ZXJiYXRpbSB0ZXh0CisuZnQgUgorLmZpCisuLgorLlwiIFNldCB1cCBzb21lIGNoYXJhY3RlciB0cmFuc2xhdGlvbnMgYW5kIHByZWRlZmluZWQgc3RyaW5ncy4gIFwqKC0tIHdpbGwKKy5cIiBnaXZlIGFuIHVuYnJlYWthYmxlIGRhc2gsIFwqKFBJIHdpbGwgZ2l2ZSBwaSwgXCooTCIgd2lsbCBnaXZlIGEgbGVmdAorLlwiIGRvdWJsZSBxdW90ZSwgYW5kIFwqKFIiIHdpbGwgZ2l2ZSBhIHJpZ2h0IGRvdWJsZSBxdW90ZS4gIFwqKEMrIHdpbGwKKy5cIiBnaXZlIGEgbmljZXIgQysrLiAgQ2FwaXRhbCBvbWVnYSBpcyB1c2VkIHRvIGRvIHVuYnJlYWthYmxlIGRhc2hlcyBhbmQKKy5cIiB0aGVyZWZvcmUgd29uJ3QgYmUgYXZhaWxhYmxlLiAgXCooQ2AgYW5kIFwqKEMnIGV4cGFuZCB0byBgJyBpbiBucm9mZiwKKy5cIiBub3RoaW5nIGluIHRyb2ZmLCBmb3IgdXNlIHdpdGggQzw+LgorLnRyIFwoKlctCisuZHMgQysgQ1x2Jy0uMXYnXGgnLTFwJ1xzLTIrXGgnLTFwJytcczBcdicuMXYnXGgnLTFwJworLmllIG4gXHtcCisuICAgIGRzIC0tIFwoKlctCisuICAgIGRzIFBJIHBpCisuICAgIGlmIChcbiguSD00dSkmKDFtPTI0dSkgLmRzIC0tIFwoKldcaCctMTJ1J1woKldcaCctMTJ1Jy1cIiBkaWFibG8gMTAgcGl0Y2gKKy4gICAgaWYgKFxuKC5IPTR1KSYoMW09MjB1KSAuZHMgLS0gXCgqV1xoJy0xMnUnXCgqV1xoJy04dSctXCIgIGRpYWJsbyAxMiBwaXRjaAorLiAgICBkcyBMIiAiIgorLiAgICBkcyBSIiAiIgorLiAgICBkcyBDYCAiIgorLiAgICBkcyBDJyAiIgorJ2JyXH0KKy5lbFx7XAorLiAgICBkcyAtLSBcfFwoZW1cfAorLiAgICBkcyBQSSBcKCpwCisuICAgIGRzIEwiIGBgCisuICAgIGRzIFIiICcnCisuICAgIGRzIENgCisuICAgIGRzIEMnCisnYnJcfQorLlwiCisuXCIgRXNjYXBlIHNpbmdsZSBxdW90ZXMgaW4gbGl0ZXJhbCBzdHJpbmdzIGZyb20gZ3JvZmYncyBVbmljb2RlIHRyYW5zZm9ybS4KKy5pZSBcbiguZyAuZHMgQXEgXChhcQorLmVsICAgICAgIC5kcyBBcSAnCisuXCIKKy5cIiBJZiB0aGUgRiByZWdpc3RlciBpcyB0dXJuZWQgb24sIHdlJ2xsIGdlbmVyYXRlIGluZGV4IGVudHJpZXMgb24gc3RkZXJyIGZvcgorLlwiIHRpdGxlcyAoLlRIKSwgaGVhZGVycyAoLlNIKSwgc3Vic2VjdGlvbnMgKC5TUyksIGl0ZW1zICguSXApLCBhbmQgaW5kZXgKKy5cIiBlbnRyaWVzIG1hcmtlZCB3aXRoIFg8PiBpbiBQT0QuICBPZiBjb3Vyc2UsIHlvdSdsbCBoYXZlIHRvIHByb2Nlc3MgdGhlCisuXCIgb3V0cHV0IHlvdXJzZWxmIGluIHNvbWUgbWVhbmluZ2Z1bCBmYXNoaW9uLgorLlwiCisuXCIgQXZvaWQgd2FybmluZyBmcm9tIGdyb2ZmIGFib3V0IHVuZGVmaW5lZCByZWdpc3RlciAnRicuCisuZGUgSVgKKy4uCisubnIgckYgMAorLmlmIFxuKC5nIC5pZiByRiAubnIgckYgMQorLmlmIChcbihyRjooXG4oLmc9PTApKSBceworLiAgICBpZiBcbkYgXHsKKy4gICAgICAgIGRlIElYCisuICAgICAgICB0bSBJbmRleDpcXCQxXHRcXG4lXHQiXFwkMiIKKy4uCisuICAgICAgICBpZiAhXG5GPT0yIFx7CisuICAgICAgICAgICAgbnIgJSAwCisuICAgICAgICAgICAgbnIgRiAyCisuICAgICAgICBcfQorLiAgICBcfQorLlx9CisucnIgckYKKy5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy5cIgorLklYIFRpdGxlICJzdHVubmVsIDgiCisuVEggc3R1bm5lbCA4ICIyMDE1LjA3LjI3IiAiNS4yMiIgInN0dW5uZWwgVExTIFByb3h5IgorLlwiIEZvciBucm9mZiwgdHVybiBvZmYganVzdGlmaWNhdGlvbi4gIEFsd2F5cyB0dXJuIG9mZiBoeXBoZW5hdGlvbjsgaXQgbWFrZXMKKy5cIiB3YXkgdG9vIG1hbnkgbWlzdGFrZXMgaW4gdGVjaG5pY2FsIGRvY3VtZW50cy4KKy5pZiBuIC5hZCBsCisubmgKKy5TSCAiTkFaV0EiCisuSVggSGVhZGVyICJOQVpXQSIKK3N0dW5uZWwgXC0gdW5pd2Vyc2FsbnkgdHVuZWwgcHJvdG9rb8WCdSBccy0xU1NMXHMwCisuU0ggIlNLxYFBRE5JQSIKKy5JWCBIZWFkZXIgIlNLxYFBRE5JQSIKKy5JUCAiXGZCVW5peDpcZlIiIDQKKy5JWCBJdGVtICJVbml4OiIKK1wmXGZCc3R1bm5lbFxmUiBbXHMtMVBMSUtcczBdIHwgXC1mZMKgTiB8IFwtaGVscCB8IFwtdmVyc2lvbiB8IFwtc29ja2V0cyB8IFwtb3B0aW9ucworLklQICJcZkJccy0xV0lOMzI6XHMwXGZSIiA0CisuSVggSXRlbSAiV0lOMzI6IgorXCZcZkJzdHVubmVsXGZSIFsgWyBcLWluc3RhbGwgfCBcLXVuaW5zdGFsbCB8IFwtc3RhcnQgfCBcLXN0b3AgfAorICAgIFwtcmVsb2FkIHwgXC1yZW9wZW4gfCBcLWV4aXQgXSBbXC1xdWlldF0gW1xzLTFQTElLXHMwXSBdIHwKKyAgICBcLWhlbHAgfCBcLXZlcnNpb24gfCBcLXNvY2tldHMgfCBcLW9wdGlvbnMKKy5TSCAiT1BJUyIKKy5JWCBIZWFkZXIgIk9QSVMiCitQcm9ncmFtIFxmQnN0dW5uZWxcZlIgem9zdGHFgiB6YXByb2pla3Rvd2FueSBkbyBvcGFrb3d5d2FuaWEgdyBwcm90b2vDs8WCIFxmSVxzLTFTU0xcczBcZlIKK3BvxYLEhWN6ZcWEIHBvbWnEmWR6eSB6ZGFsbnltaSBrbGllbnRhbWkgYSBsb2thbG55bWkgbHViIHpkYWxueW1pIHNlcndlcmFtaS4KK1ByemV6IHNlcndlciBsb2thbG55IHJvenVtaWFuYSBqZXN0IGFwbGlrYWNqYSBwcnplem5hY3pvbmEgZG8gdXJ1Y2hhbWlhbmlhCitwcnp5IHBvbW9jeSBcZklpbmV0ZFxmUi4KK1N0dW5uZWwgcG96d2FsYSBuYSBwcm9zdGUgemVzdGF3aWVuaWUga29tdW5pa2Fjamkgc2Vyd2Vyw7N3IG5pZSBwb3NpYWRhasSFY3ljaAorZnVua2Nqb25hbG5vxZtjaSBcZklccy0xU1NMXHMwXGZSIHBvcHJ6ZXogYmV6cGllY3puZSBrYW5hxYJ5IFxmSVxzLTFTU0xcczBcZlIuCisuUFAKK1wmXGZCc3R1bm5lbFxmUiBwb3p3YWxhIGRvZGHEhyBmdW5rY2pvbmFsbm/Fm8SHIFxmSVxzLTFTU0xcczBcZlIgZG8gcG93c3plY2huaWUgc3Rvc293YW55Y2gKK2RlbW9uw7N3IFxmSWluZXRkXGZSLCBucC4gXGZJcG9wM1xmUiBsdWIgXGZJaW1hcFxmUiwgZG8gc2Ftb2R6aWVsbnljaCBkZW1vbsOzdywKK25wLiBcZklubnRwXGZSLCBcZklzbXRwXGZSIGx1YiBcZklodHRwXGZSLCBhIG5hd2V0IHR1bmVsb3dhxIcgcHBwIHBvcHJ6ZXogZ25pYXpkYSBzaWVjaW93ZQorYmV6IHptaWFuIHcga29kemllIMW6csOzZMWCb3d5bS4KKy5TSCAiT1BDSkUiCisuSVggSGVhZGVyICJPUENKRSIKKy5JUCAiXGZCXHMtMVBMSUtcczBcZlIiIDQKKy5JWCBJdGVtICJQTElLIgordcW8eWogcG9kYW5lZ28gcGxpa3Uga29uZmlndXJhY3lqbmVnbworLklQICJcZkJcLWZkIE5cZlIgKHR5bGtvIFVuaXgpIiA0CisuSVggSXRlbSAiLWZkIE4gKHR5bGtvIFVuaXgpIgord2N6eXRhaiBrb25maWd1cmFjasSZIHogcG9kYW5lZ28gZGVza3J5cHRvcmEgcGxpa3UKKy5JUCAiXGZCXC1oZWxwXGZSIiA0CisuSVggSXRlbSAiLWhlbHAiCitkcnVrdWogbGlzdMSZIHdzcGllcmFueWNoIG9wY2ppCisuSVAgIlxmQlwtdmVyc2lvblxmUiIgNAorLklYIEl0ZW0gIi12ZXJzaW9uIgorZHJ1a3VqIHdlcnNqxJkgcHJvZ3JhbXUgaSBkb215xZtsbmUgd2FydG/Fm2NpIHBhcmFtZXRyw7N3CisuSVAgIlxmQlwtc29ja2V0c1xmUiIgNAorLklYIEl0ZW0gIi1zb2NrZXRzIgorZHJ1a3VqIGRvbXnFm2xuZSBvcGNqZSBnbmlhemQKKy5JUCAiXGZCXC1vcHRpb25zXGZSIiA0CisuSVggSXRlbSAiLW9wdGlvbnMiCitkcnVrdWogd3NwaWVyYW5lIG9wY2plIFxzLTFTU0xcczAKKy5JUCAiXGZCXC1pbnN0YWxsXGZSICh0eWxrbyBXaW5kb3dzIFxzLTFOVFxzMCBsdWIgbm93c3p5KSIgNAorLklYIEl0ZW0gIi1pbnN0YWxsICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpIgoraW5zdGFsdWogc2Vyd2lzIFxzLTFOVFxzMAorLklQICJcZkJcLXVuaW5zdGFsbFxmUiAodHlsa28gV2luZG93cyBccy0xTlRcczAgbHViIG5vd3N6eSkiIDQKKy5JWCBJdGVtICItdW5pbnN0YWxsICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpIgorb2RpbnN0YWx1aiBzZXJ3aXMgXHMtMU5UXHMwCisuSVAgIlxmQlwtc3RhcnRcZlIgKHR5bGtvIFdpbmRvd3MgXHMtMU5UXHMwIGx1YiBub3dzenkpIiA0CisuSVggSXRlbSAiLXN0YXJ0ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpIgordXJ1Y2hvbSBzZXJ3aXMgXHMtMU5UXHMwCisuSVAgIlxmQlwtc3RvcFxmUiAodHlsa28gV2luZG93cyBccy0xTlRcczAgbHViIG5vd3N6eSkiIDQKKy5JWCBJdGVtICItc3RvcCAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KSIKK3phdHJ6eW1haiBzZXJ3aXMgXHMtMU5UXHMwCisuSVAgIlxmQlwtcmVsb2FkXGZSICh0eWxrbyBXaW5kb3dzIFxzLTFOVFxzMCBsdWIgbm93c3p5KSIgNAorLklYIEl0ZW0gIi1yZWxvYWQgKHR5bGtvIFdpbmRvd3MgTlQgbHViIG5vd3N6eSkiCitwcnplxYJhZHVqIHBsaWsga29uZmlndXJhY3lqbnkgdXJ1Y2hvbWlvbmVnbyBzZXJ3aXN1IFxzLTFOVFxzMAorLklQICJcZkJcLXJlb3BlblxmUiAodHlsa28gV2luZG93cyBccy0xTlRcczAgbHViIG5vd3N6eSkiIDQKKy5JWCBJdGVtICItcmVvcGVuICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpIgorb3R3w7NyeiBwb25vd25pZSBsb2cgdXJ1Y2hvbWlvbmVnbyBzZXJ3aXN1IFxzLTFOVFxzMAorLklQICJcZkJcLWV4aXRcZlIgKHR5bGtvIFdpbjMyKSIgNAorLklYIEl0ZW0gIi1leGl0ICh0eWxrbyBXaW4zMikiCit6YXRyenltYWogdXJ1Y2hvbWlvbnkgcHJvZ3JhbQorLklQICJcZkJcLXF1aWV0XGZSICh0eWxrbyBXaW4zMikiIDQKKy5JWCBJdGVtICItcXVpZXQgKHR5bGtvIFdpbjMyKSIKK25pZSB3ecWbd2lldGxhaiBva2llbmVrIHoga29tdW5pa2F0YW1pCisuU0ggIlBMSUsgS09ORklHVVJBQ1lKTlkiCisuSVggSGVhZGVyICJQTElLIEtPTkZJR1VSQUNZSk5ZIgorTGluaWEgdyBwbGlrdSBrb25maWd1cmFjeWpueW0gbW/FvGUgYnnEhzoKKy5JUCAiXChidSIgNAorcHVzdGEgKGlnbm9yb3dhbmEpCisuSVAgIlwoYnUiIDQKK2tvbWVudGFyemVtIHJvenBvY3p5bmFqxIVjeW0gc2nEmSB6bmFraWVtICc7JyAoaWdub3Jvd2FuYSkKKy5JUCAiXChidSIgNAorcGFyxIUgJ25hendhX29wY2ppID0gd2FydG/Fm8SHX29wY2ppJworLklQICJcKGJ1IiA0Cit0ZWtzdGVtICdbbmF6d2FfdXPFgnVnaV0nIHdza2F6dWrEhWN5bSBwb2N6xIV0ZWsgZGVmaW5pY2ppIHVzxYJ1Z2kKKy5QUAorUGFyYW1ldHIgYWRyZXMgbW/FvGUgYnnEhzoKKy5JUCAiXChidSIgNAorbnVtZXJlbSBwb3J0dQorLklQICJcKGJ1IiA0CitvZGR6aWVsb27EhSDFm3JlZG5pa2llbSBwYXLEhSBhZHJlc3UgKElQdjQsIElQdjYsIGx1YiBuYXp3xIUgZG9tZW5vd8SFKSBpIG51bWVydSBwb3J0dQorLklQICJcKGJ1IiA0CivFm2NpZcW8a8SFIGRvIGduaWF6ZGEgVW5peCAodHlsa28gVW5peCkKKy5TUyAiXHMtMU9QQ0pFIEdMT0JBTE5FXHMwIgorLklYIFN1YnNlY3Rpb24gIk9QQ0pFIEdMT0JBTE5FIgorLklQICJcZkJjaHJvb3RcZlIgPSBccy0xS0FUQUxPRyBcczAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJjaHJvb3QgPSBLQVRBTE9HICh0eWxrbyBVbml4KSIKK2thdGFsb2cgcm9ib2N6ZWdvIGtvcnplbmlhIHN5c3RlbXUgcGxpa8OzdworLlNwCitPcGNqYSBva3JlxZtsYSBrYXRhbG9nLCB3IGt0w7NyeW0gdXdpxJl6aW9ueSB6b3N0YW5pZSBwcm9jZXMgcHJvZ3JhbXUKK1wmXGZCc3R1bm5lbFxmUiB0dcW8IHBvIGplZ28gaW5pY2phbGl6YWNqaSwgYSBwcnplZCByb3pwb2N6xJljaWVtIG9kYmllcmFuaWEKK3BvxYLEhWN6ZcWELiAgxZpjaWXFvGtpIHBvZGFuZSB3IG9wY2phY2ggXGZJQ0FwYXRoXGZSLCBcZklDUkxwYXRoXGZSLCBcZklwaWRcZlIKK29yYXogXGZJZXhlY1xmUiBtdXN6xIUgYnnEhyB1bWllc3pjem9uZSB3ZXduxIV0cnoga2F0YWxvZ3UgcG9kYW5lZ28gdyBvcGNqaQorXCZcZkljaHJvb3RcZlIgaSBva3JlxZtsb25lIHd6Z2zEmWRlbSB0ZWdvIGthdGFsb2d1LgorLlNwCitOaWVrdMOzcmUgZnVua2NqZSBzeXN0ZW11IG9wZXJhY3lqbmVnbyBtb2fEhSB3eW1hZ2HEhyBkb2RhdGtvd3ljaCBwbGlrw7N3IHVtaWVzemN6b255Y2ggdyBrYXRhbG9ndSBwb2RhbmVnbyB3IHBhcmFtZXRyemUgY2hyb290OgorLlJTIDQKKy5JUCAiXChidSIgNAorb3DDs8W6bmlvbmUgcm96d2luacSZY2llIGFkcmVzw7N3IFxzLTFETlNcczAgdHlwb3dvIHd5bWFnYSAvZXRjL25zc3dpdGNoLmNvbmYgaSAvZXRjL3Jlc29sdi5jb25mCisuSVAgIlwoYnUiIDQKK2xva2FsaXphY2phIHN0cmVmeSBjemFzb3dlaiB3IGxvZ2FjaCB3eW1hZ2EgcGxpa3UgL2V0Yy90aW1lem9uZQorLklQICJcKGJ1IiA0CituaWVrdMOzcmUgaW5uZSBwbGlraSBtb2fEhSBwb3RyemVib3dhxIcgcGxpa8OzdyB1cnrEhWR6ZcWELCBucC4gL2Rldi96ZXJvIGx1YiAvZGV2L251bGwKKy5SRQorLlJTIDQKKy5SRQorLklQICJcZkJjb21wcmVzc2lvblxmUiA9IGRlZmxhdGUgfCB6bGliIiA0CisuSVggSXRlbSAiY29tcHJlc3Npb24gPSBkZWZsYXRlIHwgemxpYiIKK3d5YsOzciBhbGdvcnl0bXUga29tcHJlc2ppIHByemVzecWCYW55Y2ggZGFueWNoCisuU3AKK2RvbXnFm2xuaWU6IGJleiBrb21wcmVzamkKKy5TcAorQWxnb3J5dG0gZGVmbGF0ZSBqZXN0IHN0YW5kYXJkb3fEhSBtZXRvZMSFIGtvbXByZXNqaSB6Z29kbmllIHogXHMtMVJGQyAxOTUxLlxzMAorLlNwCitLb21wcmVzamEgemxpYiB6YWltcGxlbWVudG93YW5hIHcgXGZCT3BlblNTTCAwLjkuOFxmUiBpIG5vd3N6eWNoIG5pZSBqZXN0Citrb21wYXR5YmlsbmEgaW1wbGVtZW50YWNqxIUgXGZCT3BlblNTTCAwLjkuN1xmUi4KKy5JUCAiXGZCZGVidWdcZlIgPSBbXHMtMVBPRFNZU1RFTVxzMF0uUE9aSU9NIiA0CisuSVggSXRlbSAiZGVidWcgPSBbUE9EU1lTVEVNXS5QT1pJT00iCitzemN6ZWfDs8WCb3dvxZvEhyBsb2dvd2FuaWEKKy5TcAorUG96aW9tIGxvZ293YW5pYSBtb8W8bmEgb2tyZcWbbGnEhyBwcnp5IHBvbW9jeSBqZWRuZWogeiBuYXp3IGx1YiBsaWN6YjoKK2VtZXJnICgwKSwgYWxlcnQgKDEpLCBjcml0ICgyKSwgZXJyICgzKSwgd2FybmluZyAoNCksIG5vdGljZSAoNSksCitpbmZvICg2KSBsdWIgZGVidWcgKDcpLgorWmFwaXN5d2FuZSBzxIUga29tdW5pa2F0eSBvIHBvemlvbWllIG5pxbxzenltIChudW1lcnljem5pZSkgbHViIHLDs3dueW0gcG9kYW5lbXUuCitEbyB1enlza2FuaWEgbmFqd3nFvHN6ZWdvIHBvemlvbXUgc3pjemVnw7PFgm93b8WbY2kgbW/FvG5hIHXFvHnEhyBvcGNqaQorXCZcZklkZWJ1ZyA9IGRlYnVnXGZSIGx1YiBcZklkZWJ1ZyA9IDdcZlIuICBEb215xZtsbnltIHBvemlvbWVtIGplc3Qgbm90aWNlICg1KS4KKy5TcAorTyBpbGUgbmllIHd5c3BlY3lmaWtvd2FubyBwb2RzeXN0ZW11IHXFvHl0eSBixJlkemllIGRvbXnFm2xueTogZGFlbW9uLgorUG9kc3lzdGVteSBuaWUgc8SFIHdzcGllcmFuZSBwcnpleiBwbGF0Zm9ybcSZIFdpbjMyLgorLlNwCitXaWVsa2/Fm8SHIGxpdGVyIGplc3QgaWdub3Jvd2FuYSB6YXLDs3dubyBkbGEgcG96aW9tdSBqYWsgcG9kc3lzdGVtdS4KKy5JUCAiXGZCXHMtMUVHRFxzMFxmUiA9IMWaQ0lFxbtLQV9ET19FR0QgKHR5bGtvIFVuaXgpIiA0CisuSVggSXRlbSAiRUdEID0gxZpDSUXFu0tBX0RPX0VHRCAodHlsa28gVW5peCkiCivFm2NpZcW8a2EgZG8gZ25pYXpkYSBwcm9ncmFtdSBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24KKy5TcAorT3BjamEgcG96d2FsYSBva3JlxZtsacSHIMWbY2llxbxrxJkgZG8gZ25pYXpkYSBwcm9ncmFtdSBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24KK3XFvHl3YW5lZ28gZG8gemFpbmljamFsaXpvd2FuaWEgZ2VuZXJhdG9yYSBjacSFZ8OzdyBwc2V1ZG9sb3Nvd3ljaCBiaWJsaW90ZWtpCitcJlxmQk9wZW5TU0xcZlIuICBPcGNqYSBqZXN0IGRvc3TEmXBuYSB6IGJpYmxpb3Rla8SFIFxmQk9wZW5TU0wgMC45LjVhXGZSIGx1YiBub3dzesSFLgorLklQICJcZkJlbmdpbmVcZlIgPSBhdXRvIHwgSURFTlRZRklLQVRPUl9VUlrEhERaRU5JQSIgNAorLklYIEl0ZW0gImVuZ2luZSA9IGF1dG8gfCBJREVOVFlGSUtBVE9SX1VSWsSERFpFTklBIgord3liw7NyIHNwcnrEmXRvd2VnbyB1cnrEhWR6ZW5pYSBrcnlwdG9ncmFmaWN6bmVnbworLlNwCitkb215xZtsbmllOiBiZXogd3lrb3J6eXN0YW5pYSB1cnrEhWR6ZcWEIGtyeXB0b2dyYWZpY3pueWNoCisuU3AKK1ByenlrxYJhZG93YSBrb25maWd1cmFjamEgdW1vxbxsaXdpYWrEhWNhIG9kY3p5dGFuaWUga2x1Y3phIHByeXdhdG5lZ28gegordXJ6xIVkemVuaWEgemdvZG5lZ28geiBPcGVuU0M6CisuU3AKKy5WYiA3CitcJiAgICBlbmdpbmU9ZHluYW1pYworXCYgICAgZW5naW5lQ3RybD1TT19QQVRIOi91c3IvbGliL29wZW5zYy9lbmdpbmVfcGtjczExLnNvCitcJiAgICBlbmdpbmVDdHJsPUlEOnBrY3MxMQorXCYgICAgZW5naW5lQ3RybD1MSVNUX0FERDoxCitcJiAgICBlbmdpbmVDdHJsPUxPQUQKK1wmICAgIGVuZ2luZUN0cmw9TU9EVUxFX1BBVEg6L3Vzci9saWIvcGtjczExL29wZW5zY1wtcGtjczExLnNvCitcJiAgICBlbmdpbmVDdHJsPUlOSVQKK1wmCitcJiAgICBbc2VydmljZV0KK1wmICAgIGVuZ2luZU51bT0xCitcJiAgICBrZXk9aWRfNDUKKy5WZQorLklQICJcZkJlbmdpbmVDdHJsXGZSID0gS09NRU5EQVs6UEFSQU1FVFJdIiA0CisuSVggSXRlbSAiZW5naW5lQ3RybCA9IEtPTUVOREFbOlBBUkFNRVRSXSIKK2tvbmZpZ3VyYWNqYSB1cnrEhWR6ZW5pYSBrcnlwdG9ncmFmaWN6bmVnbworLlNwCitTcGVjamFsbmUga29tZW5keSBcKihMIlxzLTFMT0FEXCooUiJcczAgaSBcKihMIlxzLTFJTklUXCooUiJcczAgcG96d2FsYWrEhSBuYSB6YcWCYWRvd2FuaWUgaSBpbmljamFsaXphY2rEmQorbW9kdcWCdSBrcnlwdG9ncmFmaWN6bmVnbyB1cnrEhWR6ZW5pYS4KKy5JUCAiXGZCZW5naW5lRGVmYXVsdFxmUiA9IExJU1RBX1pBREHFgyIgNAorLklYIEl0ZW0gImVuZ2luZURlZmF1bHQgPSBMSVNUQV9aQURBxYMiCitsaXN0YSB6YWRhxYQgT3BlblNTTCBvZGRlbGVnb3dhbnljaCBkbyBiaWXFvMSFY2VnbyB1cnrEhWR6ZW5pYQorLlNwCitQYXJhbWV0cmVtIGplc3QgbGlzdGEgb2RkemllbG9ueWNoIHByemVjaW5rYW1pIHphZGHFhCBPcGVuU1NMLCBrdMOzcmUgbWFqxIUKK3pvc3RhxIcgb2RkZWxlZ293YW5lIGRvIGJpZcW8xIVjZWdvIHVyesSFZHplbmlhIGtyeXB0b2dyYWZpY3puZWdvLgorLlNwCitXIHphbGXFvG5vxZtjaSBvZCBrb25rcmV0bmVnbyB1cnrEhWR6ZW5pYSBkb3N0xJlwbmUgbW9nxIUgYnnEhyBuYXN0xJlwdWrEhWNlIHphZGFuaWE6CitcJlxzLTFBTEwsIFJTQSwgRFNBLCBFQ0RILCBFQ0RTQSwgREgsIFJBTkQsIENJUEhFUlMsIERJR0VTVFMsIFBLRVksIFBLRVlfQ1JZUFRPLAorUEtFWV9BU04xLlxzMAorLklQICJcZkJmaXBzXGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJmaXBzID0geWVzIHwgbm8iCit0cnliIFxzLTFGSVBTIDE0MFwtMlxzMAorLlNwCitPcGNqYSBwb3p3YWxhIHd5xYLEhWN6ecSHIHdlasWbY2llIHcgdHJ5YiBccy0xRklQUyxcczAgamXFm2xpIFxmQnN0dW5uZWxcZlIgem9zdGHFggorc2tvbXBpbG93YW55IHplIHdzcGFyY2llbSBkbGEgXHMtMUZJUFMgMTQwXC0yLlxzMAorLlNwCitkb215xZtsbmllOiBubyAob2Qgd2Vyc2ppIDUuMDApCisuSVAgIlxmQmZvcmVncm91bmRcZlIgPSB5ZXMgfCBubyAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJmb3JlZ3JvdW5kID0geWVzIHwgbm8gKHR5bGtvIFVuaXgpIgordHJ5YiBwaWVyd3N6b3BsYW5vd3kKKy5TcAorVcW8eWNpZSB0ZWogb3BjamkgcG93b2R1amUsIMW8ZSBcZkJzdHVubmVsXGZSIG5pZSBwcnplY2hvZHppIHcgdMWCbyBsb2d1asSFYworc3dvamUga29tdW5pa2F0eSBuYSBrb25zb2zEmSB6YW1pYXN0IHByemV6IFxmSXN5c2xvZ1xmUiAobyBpbGUgbmllIHXFvHl0bworb3BjamkgXGZJb3V0cHV0XGZSKS4KKy5JUCAiXGZCaWNvbkFjdGl2ZVxmUiA9IFBMSUtfWl9JS09OS8SEICh0eWxrbyBccy0xR1VJXHMwKSIgNAorLklYIEl0ZW0gImljb25BY3RpdmUgPSBQTElLX1pfSUtPTkvEhCAodHlsa28gR1VJKSIKK2lrb25rYSB3ecWbd2lldGxhbmEgcHJ6eSBvYmVjbm/Fm2NpIGFrdHl3bnljaCBwb8WCxIVjemXFhCBkbyB1c8WCdWdpCisuU3AKK1cgc3lzdGVtaWUgV2luZG93cyBpa29ua2EgdG8gcGxpayAuaWNvIHphd2llcmFqxIVjeSBvYnJhemVrIDE2eDE2IHBpa3NlbGkuCisuSVAgIlxmQmljb25FcnJvclxmUiA9IFBMSUtfWl9JS09OS8SEICh0eWxrbyBccy0xR1VJXHMwKSIgNAorLklYIEl0ZW0gImljb25FcnJvciA9IFBMSUtfWl9JS09OS8SEICh0eWxrbyBHVUkpIgoraWtvbmthIHd5xZt3aWV0bGFuYSwgamXFvGVsaSBuaWUgem9zdGHFgiB6YcWCYWRvd2FueSBwb3ByYXdueSBwbGlrIGtvbmZpZ3VyYWN5am55CisuU3AKK1cgc3lzdGVtaWUgV2luZG93cyBpa29ua2EgdG8gcGxpayAuaWNvIHphd2llcmFqxIVjeSBvYnJhemVrIDE2eDE2IHBpa3NlbGkuCisuSVAgIlxmQmljb25JZGxlXGZSID0gUExJS19aX0lLT05LxIQgKHR5bGtvIFxzLTFHVUlcczApIiA0CisuSVggSXRlbSAiaWNvbklkbGUgPSBQTElLX1pfSUtPTkvEhCAodHlsa28gR1VJKSIKK2lrb25rYSB3ecWbd2lldGxhbmEgcHJ6eSBicmFrdSBha3R5d255Y2ggcG/FgsSFY3plxYQgZG8gdXPFgnVnaQorLlNwCitXIHN5c3RlbWllIFdpbmRvd3MgaWtvbmthIHRvIHBsaWsgLmljbyB6YXdpZXJhasSFY3kgb2JyYXplayAxNngxNiBwaWtzZWxpLgorLklQICJcZkJsb2dcZlIgPSBhcHBlbmQgfCBvdmVyd3JpdGUiIDQKKy5JWCBJdGVtICJsb2cgPSBhcHBlbmQgfCBvdmVyd3JpdGUiCitsb2cgZmlsZSBoYW5kbGluZworLlNwCitUaGlzIG9wdGlvbiBhbGxvd3MgdG8gY2hvb3NlIHdoZXRoZXIgdGhlIGxvZyBmaWxlIChzcGVjaWZpZWQgd2l0aCB0aGUgXGZJb3V0cHV0XGZSCitvcHRpb24pIGlzIGFwcGVuZGVkIG9yIG92ZXJ3cml0dGVuIHdoZW4gb3BlbmVkIG9yIHJlLW9wZW5lZC4KKy5TcAorZG9tecWbbG5pZTogYXBwZW5kCisuSVAgIlxmQm91dHB1dFxmUiA9IFxzLTFQTElLXHMwIiA0CisuSVggSXRlbSAib3V0cHV0ID0gUExJSyIKK3BsaWssIGRvIGt0w7NyZWdvIGRvcGlzYW5lIHpvc3RhbsSFIGxvZ2kKKy5TcAorVcW8eWNpZSB0ZWogb3BjamkgcG93b2R1amUgZG9waXNhbmllIGxvZ8OzdyBkbyBwb2RhbmVnbyBwbGlrdS4KKy5TcAorRG8ga2llcm93YW5pYWtvbXVuaWthdMOzdyBuYSBzdGFuZGFyZG93ZSB3eWrFm2NpZSAobmEgcHJ6eWvFgmFkIHBvIHRvLCDFvGVieQoremFsb2dvd2HEhyBqZSBwcm9ncmFtZW0gc3Bsb2dnZXIgeiBwYWtpZXR1IGRhZW1vbnRvb2xzKSBtb8W8bmEgcG9kYcSHIGpha28KK3BhcmFtZXRyIHVyesSFZHplbmllIC9kZXYvc3Rkb3V0LgorLklQICJcZkJwaWRcZlIgPSBccy0xUExJSyBcczAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJwaWQgPSBQTElLICh0eWxrbyBVbml4KSIKK3BvxYJvxbxlbmllIHBsaWt1IHogbnVtZXJlbSBwcm9jZXN1CisuU3AKK0plxbxlbGkgYXJndW1lbnQgamVzdCBwdXN0eSBwbGlrIG5pZSB6b3N0YW5pZSBzdHdvcnpvbnkuCisuU3AKK0plxbxlbGkgemRlZmluaW93YW5vIGthdGFsb2cgXGZJY2hyb290XGZSLCB0byDFm2NpZcW8a2EgZG8gXGZJcGlkXGZSIGplc3Qgb2tyZcWbbG9uYQord3pnbMSZZGVtIHRlZ28ga2F0YWxvZ3UuCisuSVAgIlxmQlJORGJ5dGVzXGZSID0gTElDWkJBX0JBSlTDk1ciIDQKKy5JWCBJdGVtICJSTkRieXRlcyA9IExJQ1pCQV9CQUpUw5NXIgorbGljemJhIGJhanTDs3cgZG8gemFpbmljam93YW5pYSBnZW5lcmF0b3JhIHBzZXVkb2xvc293ZWdvCisuU3AKK1cgd2Vyc2phY2ggYmlibGlvdGVraSBcZkJPcGVuU1NMXGZSIHN0YXJzenljaCBuacW8IFxmQjAuOS41YVxmUiBvcGNqYSB0YSBva3JlxZtsYQorcsOzd25pZcW8IGxpY3pixJkgYmFqdMOzdyB3eXN0YXJjemFqxIVjeWNoIGRvIHphaW5pY2pvd2FuaWEgXHMtMVBSTkcuXHMwCitOb3dzemUgd2Vyc2plIGJpYmxpb3Rla2kgbWFqxIUgd2J1ZG93YW7EhSBmdW5rY2rEmSBva3JlxZtsYWrEhWPEhSwgY3p5Citkb3N0YXJjem9uYSBpbG/Fm8SHIGxvc293b8WbY2kgamVzdCB3eXN0YXJjemFqxIVjYSBkbyB6YWluaWNqb3dhbmlhIGdlbmVyYXRvcmEuCisuSVAgIlxmQlJORGZpbGVcZlIgPSBccy0xUExJS1xzMCIgNAorLklYIEl0ZW0gIlJORGZpbGUgPSBQTElLIgorxZtjaWXFvGthIGRvIHBsaWt1IHphd2llcmFqxIVjZWdvIGxvc293ZSBkYW5lCisuU3AKK0JpYmxpb3Rla2EgXGZCT3BlblNTTFxmUiB1xbx5amUgZGFueWNoIHogdGVnbyBwbGlrdSBkbyB6YWluaWNqb3dhbmlhCitnZW5lcmF0b3JhIHBzZXVkb2xvc293ZWdvLgorLklQICJcZkJSTkRvdmVyd3JpdGVcZlIgPSB5ZXMgfCBubyIgNAorLklYIEl0ZW0gIlJORG92ZXJ3cml0ZSA9IHllcyB8IG5vIgorbmFkcGlzeiBwbGlrIG5vd3ltaSB3YXJ0b8WbY2lhbWkgcHNldWRvbG9zb3d5bWkKKy5TcAorZG9tecWbbG5pZTogeWVzIChuYWRwaXN6KQorLklQICJcZkJzZXJ2aWNlXGZSID0gXHMtMVNFUldJUyBcczAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJzZXJ2aWNlID0gU0VSV0lTICh0eWxrbyBVbml4KSIKK25hendhIHVzxYJ1Z2kKKy5TcAorUG9kYW5hIG5hendhIHVzxYJ1Z2kgYsSZZHppZSB1xbx5d2FuYSBqYWtvIG5hendhIHVzxYJ1Z2kgZGxhIGluaWNqYWxpemFjamkgc3lzbG9nYSwKK29yYXogZGxhIGJpYmxpb3Rla2kgXHMtMVRDUFxzMCBXcmFwcGVyIHcgdHJ5YmllIFxmSWluZXRkXGZSLiAgQ2hvY2lhxbwgdGVjaG5pY3puaWUgbW/FvG5hCit1xbx5xIcgdGVqIG9wY2ppIHcgdHJ5YmllIHcgc2VrY2ppIHVzxYJ1ZywgdG8gamVzdCBvbmEgdcW8eXRlY3puYSBqZWR5bmllIHcgb3BjamFjaAorZ2xvYmFsbnljaC4KKy5TcAorZG9tecWbbG5pZTogc3R1bm5lbAorLklQICJcZkJzZXRnaWRcZlIgPSBccy0xSURFTlRZRklLQVRPUl9HUlVQWSBcczAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJzZXRnaWQgPSBJREVOVFlGSUtBVE9SX0dSVVBZICh0eWxrbyBVbml4KSIKK2dydXBhIHoga3TDs3JlaiBwcmF3YW1pIHByYWNvd2HFgiBixJlkemllIFxmQnN0dW5uZWxcZlIKKy5JUCAiXGZCc2V0dWlkXGZSID0gSURFTlRZRklLQVRPUl9VxbtZVEtPV05JS0EgKHR5bGtvIFVuaXgpIiA0CisuSVggSXRlbSAic2V0dWlkID0gSURFTlRZRklLQVRPUl9VxbtZVEtPV05JS0EgKHR5bGtvIFVuaXgpIgordcW8eXRrb3duaWssIHoga3TDs3JlZ28gcHJhd2FtaSBwcmFjb3dhxYIgYsSZZHppZSBcZkJzdHVubmVsXGZSCisuSVAgIlxmQnNvY2tldFxmUiA9IGF8bHxyOk9QQ0pBPVdBUlRPxZrEhls6V0FSVE/FmsSGXSIgNAorLklYIEl0ZW0gInNvY2tldCA9IGF8bHxyOk9QQ0pBPVdBUlRPxZrEhls6V0FSVE/FmsSGXSIKK3VzdGF3IG9wY2rEmSBuYSBha2NlcHR1asSFY3ltL2xva2FsbnltL3pkYWxueW0gZ25pZcW6ZHppZQorLlNwCitEbGEgb3BjamkgbGluZ2VyIHdhcnRvxZtjaSBtYWrEhSBwb3N0YcSHIGxfb25vZjpsX2xpbmdlci4KK0RsYSBvcGNqaSB0aW1lIHdhcnRvxZtjaSBtYWrEhSBwb3N0YcSHIHR2X3NlYzp0dl91c2VjLgorLlNwCitQcnp5a8WCYWR5OgorLlNwCisuVmIgMTAKK1wmICAgIHNvY2tldCA9IGw6U09fTElOR0VSPTE6NjAKK1wmICAgICAgICB1c3RhdyBqZWRub21pbnV0b3dlIHByemV0ZXJtaW5vd2FuaWUKK1wmICAgICAgICBwcnp5IHphbXlrYW5pdSBsb2thbG5lZ28gZ25pYXpkYQorXCYgICAgc29ja2V0ID0gcjpTT19PT0JJTkxJTkU9eWVzCitcJiAgICAgICAgdW1pZcWbxIcgZGFuZSBwb3phcGFzbW93ZSAob3V0XC1vZlwtYmFuZCkKK1wmICAgICAgICBiZXpwb8WbcmVkbmlvIHcgc3RydW1pZW5pdSBkYW55Y2gKK1wmICAgICAgICB3ZWrFm2Npb3d5Y2ggZGxhIHpkYWxueWNoIGduaWF6ZAorXCYgICAgc29ja2V0ID0gYTpTT19SRVVTRUFERFI9bm8KK1wmICAgICAgICB6YWJsb2t1aiBwb25vd25lIHXFvHl3YW5pZSBwb3J0dQorXCYgICAgICAgIChkb215xZtsbmllIHfFgsSFY3pvbmUpCitcJiAgICBzb2NrZXQgPSBhOlNPX0JJTkRUT0RFVklDRT1sbworXCYgICAgICAgIHByenlqbXVqIHBvxYLEhWN6ZW5pYSB3ecWCxIVjem5pZSBuYQorXCYgICAgICAgIGludGVyZmVqc2llIHp3cm90bnltIChhbmcuIGxvb3BiYWNrKQorLlZlCisuSVAgIlxmQnN5c2xvZ1xmUiA9IHllcyB8IG5vICh0eWxrbyBVbml4KSIgNAorLklYIEl0ZW0gInN5c2xvZyA9IHllcyB8IG5vICh0eWxrbyBVbml4KSIKK3fFgsSFY3ogbG9nb3dhbmllIHBvcHJ6ZXogbWVjaGFuaXptIHN5c2xvZworLlNwCitkb215xZtsbmllOiB5ZXMgKHfFgsSFY3opCisuSVAgIlxmQnRhc2tiYXJcZlIgPSB5ZXMgfCBubyAodHlsa28gXHMtMVdJTjMyXHMwKSIgNAorLklYIEl0ZW0gInRhc2tiYXIgPSB5ZXMgfCBubyAodHlsa28gV0lOMzIpIgord8WCxIVjeiBpa29ua8SZIHcgcHJhd3ltIGRvbG55bSByb2d1IGVrcmFudQorLlNwCitkb215xZtsbmllOiB5ZXMgKHfFgsSFY3opCisuU1MgIlxzLTFPUENKRVxzMCBVU8WBVUciCisuSVggU3Vic2VjdGlvbiAiT1BDSkUgVVPFgVVHIgorS2HFvGRhIHNla2NqYSBrb25maWd1cmFjamkgdXPFgnVnaSB6YWN6eW5hIHNpxJkgamVqIG5henfEhSB1asSZdMSFIHcgbmF3aWFzCitrd2FkcmF0b3d5LiAgTmF6d2EgdXPFgnVnaSB1xbx5d2FuYSBqZXN0IGRvIGtvbnRyb2xpIGRvc3TEmXB1IHByemV6CitiaWJsaW90ZWvEmSBsaWJ3cmFwIChccy0xVENQXHMwIHdyYXBwZXJzKSBvcmF6IHBvendhbGEgcm96csOzxbxuacSHIHBvc3pjemVnw7NsbmUKK3VzxYJ1Z2kgdyBsb2dhY2guCisuUFAKK0plxbxlbGkgXGZCc3R1bm5lbFxmUiBtYSB6b3N0YcSHIHXFvHl0eSB3IHRyeWJpZSBcZklpbmV0ZFxmUiwgZ2R6aWUgemEgb2RlYnJhbmllCitwb8WCxIVjemVuaWEgb2Rwb3dpYWRhIG9zb2JueSBwcm9ncmFtICh6d3lrbGUgXGZJaW5ldGRcZlIsIFxmSXhpbmV0ZFxmUgorbHViIFxmSXRjcHNlcnZlclxmUiksIG5hbGXFvHkgcHJ6ZWN6eXRhxIcgc2VrY2rEmSBcZklccy0xVFJZQiBJTkVURFxzMFxmUiBwb25pxbxlai4KKy5JUCAiXGZCYWNjZXB0XGZSID0gW1xzLTFIT1NUOlxzMF1QT1JUIiA0CisuSVggSXRlbSAiYWNjZXB0ID0gW0hPU1Q6XVBPUlQiCituYXPFgnVjaHVqZSBuYSBwb8WCxIVjemVuaWEgbmEgcG9kYW55bSBhZHJlc2llIGkgcG9yY2llCisuU3AKK0plxbxlbGkgbmllIHpvc3RhxYIgcG9kYW55IGFkcmVzLCBcZkJzdHVubmVsXGZSIGRvbXnFm2xuaWUgbmFzxYJ1Y2h1amUKK25hIHdzenlzdGtpY2ggYWRyZXNhY2ggSVB2NCBsb2thbG55Y2ggaW50ZXJmZWpzw7N3LgorLlNwCitBYnkgbmFzxYJ1Y2hpd2HEhyBuYSB3c3p5c3RraWNoIGFkcmVzYWNoIElQdjYgbmFsZcW8eSB1xbx5xIc6CisuU3AKKy5WYiAxCitcJiAgICBhY2NlcHQgPSA6Ojpwb3J0CisuVmUKKy5JUCAiXGZCQ0FwYXRoXGZSID0gXHMtMUtBVEFMT0dfQ0FcczAiIDQKKy5JWCBJdGVtICJDQXBhdGggPSBLQVRBTE9HX0NBIgora2F0YWxvZyBDZW50cnVtIENlcnR5ZmlrYWNqaQorLlNwCitPcGNqYSBva3JlxZtsYSBrYXRhbG9nLCB3IGt0w7NyeW0gXGZCc3R1bm5lbFxmUiBixJlkemllIHN6dWthxYIgY2VydHlmaWthdMOzdywKK2plxbxlbGkgdcW8eXRhIHpvc3RhxYJhIG9wY2phIFxmSXZlcmlmeVxmUi4gIFBsaWtpIHogY2VydHlmaWthdGFtaSBtdXN6xIUKK3Bvc2lhZGHEhyBzcGVjamFsbmUgbmF6d3kgXHMtMVhYWFhYWFhYLjAsXHMwIGdkemllIFxzLTFYWFhYWFhYWFxzMCBqZXN0IHNrcsOzdGVtCitrcnlwdG9ncmFmaWN6bnltIHJlcHJlemVudGFjamkgXHMtMURFUlxzMCBuYXp3eSBwb2RtaW90dSBjZXJ0eWZpa2F0dS4KKy5TcAorRnVua2NqYSBza3LDs3R1IHpvc3RhxYJhIHptaWVuaW9uYSB3IFxmQk9wZW5TU0wgMS4wLjBcZlIuCitOYWxlxbx5IHd5a29uYcSHIGNfcmVoYXNoIHByenkgem1pYW5pZSBcZkJPcGVuU1NMIDAueC54XGZSIG5hIFxmQjEueC54XGZSLgorLlNwCitKZcW8ZWxpIHpkZWZpbmlvd2FubyBrYXRhbG9nIFxmSWNocm9vdFxmUiwgdG8gxZtjaWXFvGthIGRvIFxmSUNBcGF0aFxmUiBqZXN0IG9rcmXFm2xvbmEKK3d6Z2zEmWRlbSB0ZWdvIGthdGFsb2d1LgorLklQICJcZkJDQWZpbGVcZlIgPSBccy0xUExJS19DQVxzMCIgNAorLklYIEl0ZW0gIkNBZmlsZSA9IFBMSUtfQ0EiCitwbGlrIENlbnRydW0gQ2VydHlmaWthY2ppCisuU3AKK09wY2phIHBvendhbGEgb2tyZcWbbGnEhyBwb8WCb8W8ZW5pZSBwbGlrdSB6YXdpZXJhasSFY2VnbyBjZXJ0eWZpa2F0eSB1xbx5d2FuZQorcHJ6ZXogb3BjasSZIFxmSXZlcmlmeVxmUi4KKy5JUCAiXGZCY2VydFxmUiA9IFxzLTFQTElLX1BFTVxzMCIgNAorLklYIEl0ZW0gImNlcnQgPSBQTElLX1BFTSIKK3BsaWsgeiDFgmHFhGN1Y2hlbSBjZXJ0eWZpa2F0w7N3CisuU3AKK09wY2phIG9rcmXFm2xhIHBvxYJvxbxlbmllIHBsaWt1IHphd2llcmFqxIVjZWdvIGNlcnR5ZmlrYXR5IHXFvHl3YW5lIHByemV6Citwcm9ncmFtIFxmQnN0dW5uZWxcZlIgZG8gdXdpZXJ6eXRlbG5pZW5pYSBzacSZIHByemVkIGRydWfEhSBzdHJvbsSFIHBvxYLEhWN6ZW5pYS4KK0NlcnR5ZmlrYXQgamVzdCBrb25pZWN6bnksIGFieSB1xbx5d2HEhyBwcm9ncmFtdSB3IHRyeWJpZSBzZXJ3ZXJhLgorVyB0cnliaWUga2xpZW50YSBjZXJ0eWZpa2F0IGplc3Qgb3Bjam9uYWxueS4KKy5JUCAiXGZCY2hlY2tFbWFpbFxmUiA9IFxzLTFFTUFJTFxzMCIgNAorLklYIEl0ZW0gImNoZWNrRW1haWwgPSBFTUFJTCIKK2FkcmVzIGVtYWlsIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dQorLlNwCitQb2plZHluY3phIHNla2NqYSBtb8W8ZSB6YXdpZXJhxIcgd2llbGUgd3lzdMSFcGllxYQgb3BjamkgXGZCY2hlY2tFbWFpbFxmUi4KK0NlcnR5ZmlrYXR5IHPEhSBha2NlcHRvd2FuZSwgamXFvGVsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgXGZCY2hlY2tFbWFpbFxmUiwKK2FsYm8gYWRyZXMgZW1haWwgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1IHBhc3VqZSBkbyBqZWRuZWdvIHogYWRyZXPDs3cKK2VtYWlsIG9rcmXFm2xvbnljaCBwcnp5IHBvbW9jeSBcZkJjaGVja0VtYWlsXGZSLgorLklQICJcZkJjaGVja0hvc3RcZlIgPSBccy0xTkFaV0FfU0VSV0VSQVxzMCIgNAorLklYIEl0ZW0gImNoZWNrSG9zdCA9IE5BWldBX1NFUldFUkEiCituYXp3YSBzZXJ3ZXJhIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dQorLlNwCitQb2plZHluY3phIHNla2NqYSBtb8W8ZSB6YXdpZXJhxIcgd2llbGUgd3lzdMSFcGllxYQgb3BjamkgXGZCY2hlY2tIb3N0XGZSLgorQ2VydHlmaWthdHkgc8SFIGFrY2VwdG93YW5lLCBqZcW8ZWxpIHNla2NqYSBuaWUgemF3aWVyYSBvcGNqaSBcZkJjaGVja0hvc3RcZlIsIGFsYm8KK25hendhIHNlcndlcmEgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1IHBhc3VqZSBkbyBqZWRuZWdvIG5hencgb2tyZcWbbG9ueWNoCitwcnp5IHBvbW9jeSBcZkJjaGVja0hvc3RcZlIuCisuSVAgIlxmQmNoZWNrSVBcZlIgPSBccy0xSVBcczAiIDQKKy5JWCBJdGVtICJjaGVja0lQID0gSVAiCithZHJlcyBccy0xSVBcczAgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1CisuU3AKK1BvamVkeW5jemEgc2VrY2phIG1vxbxlIHphd2llcmHEhyB3aWVsZSB3eXN0xIVwaWXFhCBvcGNqaSBcZkJjaGVja0lQXGZSLiAgQ2VydHlmaWthdHkKK3PEhSBha2NlcHRvd2FuZSwgamXFvGVsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgXGZCY2hlY2tJUFxmUiwgYWxibyBhZHJlcyBccy0xSVBcczAKK3ByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dSBwYXN1amUgZG8gamVkbmVnbyB6IGFkcmVzw7N3IFxzLTFJUFxzMCBva3JlxZtsb255Y2ggcHJ6eQorcG9tb2N5IFxmQmNoZWNrSVBcZlIuCisuSVAgIlxmQmNpcGhlcnNcZlIgPSBMSVNUQV9TWllGUsOTVyIgNAorLklYIEl0ZW0gImNpcGhlcnMgPSBMSVNUQV9TWllGUsOTVyIKK2xpc3RhIGRvendvbG9ueWNoIHN6eWZyw7N3IFxzLTFTU0xcczAKKy5TcAorUGFyYW1ldHJlbSB0ZWogb3BjamkgamVzdCBsaXN0YSBzenlmcsOzdywga3TDs3JlIGLEmWTEhSB1xbx5dGUgcHJ6eQorb3R3aWVyYW5pdSBub3d5Y2ggcG/FgsSFY3plxYQgXHMtMVNTTCxcczAgbnAuOiAgXHMtMURFU1wtQ0JDM1wtU0hBOklERUFcLUNCQ1wtTUQ1XHMwCisuSVAgIlxmQmNsaWVudFxmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAiY2xpZW50ID0geWVzIHwgbm8iCit0cnliIGtsaWVuY2tpICh6ZGFsbmEgdXPFgnVnYSB1xbx5d2EgXHMtMVNTTFxzMCkKKy5TcAorZG9tecWbbG5pZTogbm8gKHRyeWIgc2Vyd2Vyb3d5KQorLklQICJcZkJjb25uZWN0XGZSID0gW1xzLTFIT1NUOlxzMF1QT1JUIiA0CisuSVggSXRlbSAiY29ubmVjdCA9IFtIT1NUOl1QT1JUIgorcG/FgsSFY3ogc2nEmSB6ZSB6ZGFsbnltIHNlcndlcmVtIG5hIHBvZGFueSBwb3J0CisuU3AKK0plxbxlbGkgbmllIHpvc3RhxYIgcG9kYW55IGFkcmVzLCBcZkJzdHVubmVsXGZSIGRvbXnFm2xuaWUgxYLEhWN6eSBzacSZCit6IGxva2FsbnltIHNlcndlcmVtLgorLlNwCitLb21lbmRhIG1vxbxlIGJ5YyB1xbx5dGEgd2llbG9rcm90bmllIHcgcG9qZWR5bmN6ZWogc2VrY2ppCitjZWxlbSB6YXBld25pZW5pYSB3eXNva2llaiBuaWV6YXdvZG5vxZtjaSBsdWIgcm96xYJvxbxlbmlhCitydWNodSBwb21pxJlkenkgd2llbGUgc2Vyd2Vyw7N3LgorLklQICJcZkJDUkxwYXRoXGZSID0gXHMtMUtBVEFMT0dfQ1JMXHMwIiA0CisuSVggSXRlbSAiQ1JMcGF0aCA9IEtBVEFMT0dfQ1JMIgora2F0YWxvZyBMaXN0IE9kd2/FgmFueWNoIENlcnR5ZmlrYXTDs3cgKFxzLTFDUkxcczApCisuU3AKK09wY2phIG9rcmXFm2xhIGthdGFsb2csIHcga3TDs3J5bSBcZkJzdHVubmVsXGZSIGLEmWR6aWUgc3p1a2HFgiBsaXN0IFxzLTFDUkwsXHMwCitqZcW8ZWxpIHXFvHl0YSB6b3N0YcWCYSBvcGNqYSBcZkl2ZXJpZnlcZlIuICBQbGlraSB6IGxpc3RhbWkgXHMtMUNSTFxzMCBtdXN6xIUKK3Bvc2lhZGHEhyBzcGVjamFsbmUgbmF6d3kgXHMtMVhYWFhYWFhYXHMwLnIwLCBnZHppZSBccy0xWFhYWFhYWFhcczAgamVzdCBza3LDs3RlbQorbGlzdHkgXHMtMUNSTC5cczAKKy5TcAorRnVua2NqYSBza3LDs3R1IHpvc3RhxYJhIHptaWVuaW9uYSBcZkJPcGVuU1NMIDEuMC4wXGZSLgorTmFsZcW8eSB3eWtvbmHEhyBjX3JlaGFzaCBwcnp5IHptaWFuaWUgXGZCT3BlblNTTCAwLngueFxmUiBuYSBcZkIxLngueFxmUi4KKy5TcAorSmXFvGVsaSB6ZGVmaW5pb3dhbm8ga2F0YWxvZyBcZkljaHJvb3RcZlIsIHRvIMWbY2llxbxrYSBkbyBcZklDUkxwYXRoXGZSIGplc3Qgb2tyZcWbbG9uYQord3pnbMSZZGVtIHRlZ28ga2F0YWxvZ3UuCisuSVAgIlxmQkNSTGZpbGVcZlIgPSBccy0xUExJS19DUkxcczAiIDQKKy5JWCBJdGVtICJDUkxmaWxlID0gUExJS19DUkwiCitwbGlrIExpc3QgT2R3b8WCYW55Y2ggQ2VydHlmaWthdMOzdyAoXHMtMUNSTFxzMCkKKy5TcAorT3BjamEgcG96d2FsYSBva3JlxZtsacSHIHBvxYJvxbxlbmllIHBsaWt1IHphd2llcmFqxIVjZWdvIGxpc3R5IFxzLTFDUkxcczAgdcW8eXdhbmUKK3ByemV6IG9wY2rEmSBcZkl2ZXJpZnlcZlIuCisuSVAgIlxmQmN1cnZlXGZSID0gXHMtMU5JRFxzMCIgNAorLklYIEl0ZW0gImN1cnZlID0gTklEIgora3J6eXdhIGRsYSBccy0xRUNESFxzMAorLlNwCitMaXN0xJkgZG9zdMSZcG55Y2gga3J6eXd5Y2ggbW/FvG5hIHV6eXNrYcSHIHBvbGVjZW5pZW06CisuU3AKKy5WYiAxCitcJiAgICBvcGVuc3NsIGVjcGFyYW0gXC1saXN0X2N1cnZlcworLlZlCisuU3AKK2RvbXnFm2xuaWU6IHByaW1lMjU2djEKKy5JUCAiXGZCbG9nSWRcZlIgPSBccy0xVFlQXHMwIiA0CisuSVggSXRlbSAibG9nSWQgPSBUWVAiCit0eXAgaWRlbnR5ZmlrYXRvcmEgcG/FgsSFY3plbmlhIGtsaWVudGEKKy5TcAorSWRlbnR5ZmlrYXRvciB0ZW4gcG96d2FsYSByb3pyw7PFvG5pxIcgd3Bpc3kgdyBsb2d1IHd5Z2VuZXJvd2FuZSBkbGEKK3Bvc3pjemVnw7NsbnljaCBwb8WCxIVjemXFhC4KKy5TcAorQWt0dWFsbmllIHdzcGllcmFuZSB0eXB5OgorLlJTIDQKKy5JUCAiXGZJc2VxdWVudGlhbFxmUiIgNAorLklYIEl0ZW0gInNlcXVlbnRpYWwiCitLb2xlam55IG51bWVyIHBvxYLEhWN6ZW5pYSBqZXN0IHVuaWthbG55IGplZHluaWUgdyBvYnLEmWJpZSBwb2plZHluY3plaiBpbnN0YW5jamkKK3Byb2dyYW11IFxmQnN0dW5uZWxcZlIsIGFsZSBiYXJkem8ga3LDs3RraS4gIEplc3Qgb24gc3pjemVnw7NsbmllIHXFvHl0Y3pueSBwcnp5CityxJljem5laiBhbmFsaXppZSBsb2fDs3cuCisuSVAgIlxmSXVuaXF1ZVxmUiIgNAorLklYIEl0ZW0gInVuaXF1ZSIKK1RlbiByb2R6YWogaWRlbnR5ZmlrYXRvcmEgamVzdCBnbG9iYWxuaWUgdW5pa2FsbnksIGFsZSB6bmFjem5pZSBkxYJ1xbxzenksIG5pxbwKK2tvbGVqbnkgbnVtZXIgcG/FgsSFY3plbmlhLiAgSmVzdCBvbiBzemN6ZWfDs2xuaWUgdcW8eXRlY3pueSBwcnp5IHphdXRvbWF0eXpvd2FuZWoKK2FuYWxpemllIGxvZ8Ozdy4KKy5JUCAiXGZJdGhyZWFkXGZSIiA0CisuSVggSXRlbSAidGhyZWFkIgorSWRlbnR5ZmlrYXRvciB3xIV0a3Ugc3lzdGVtdSBvcGVyYWN5am5lZ28gbmllIGplc3QgYW5pIHVuaWthbG55IChuYXdldCB3IG9icsSZYmllCitwb2plZHluY3plaiBpbnN0YW5jamkgcHJvZ3JhbXUgXGZCc3R1bm5lbFxmUiksIGFuaSBrcsOzdGtpLiAgSmVzdCBvbiBzemN6ZWfDs2xuaWUKK3XFvHl0ZWN6bnkgcHJ6eSBkaWFnbm96b3dhbml1IHByb2JsZW3Ds3cgeiBvcHJvZ3JhbW93YW5pZW0gbHViIGtvbmZpZ3VyYWNqxIUuCisuUkUKKy5SUyA0CisuU3AKK2RvbXnFm2xuaWU6IHNlcXVlbnRpYWwKKy5SRQorLklQICJcZkJkZWJ1Z1xmUiA9IFxzLTFQT1pJT01cczAiIDQKKy5JWCBJdGVtICJkZWJ1ZyA9IFBPWklPTSIKK3N6Y3plZ8OzxYJvd2/Fm8SHIGxvZ293YW5pYQorLlNwCitQb3ppb20gbG9nb3dhbmlhIG1vxbxuYSBva3JlxZtsacSHIHByenkgcG9tb2N5IGplZG5laiB6IG5hencgbHViIGxpY3piOgorZW1lcmcgKDApLCBhbGVydCAoMSksIGNyaXQgKDIpLCBlcnIgKDMpLCB3YXJuaW5nICg0KSwgbm90aWNlICg1KSwKK2luZm8gKDYpIGx1YiBkZWJ1ZyAoNykuCitaYXBpc3l3YW5lIHPEhSBrb211bmlrYXR5IG8gcG96aW9taWUgbmnFvHN6eW0gKG51bWVyeWN6bmllKSBsdWIgcsOzd255bSBwb2RhbmVtdS4KK0RvIHV6eXNrYW5pYSBuYWp3ecW8c3plZ28gcG96aW9tdSBzemN6ZWfDs8WCb3dvxZtjaSBtb8W8bmEgdcW8ecSHIG9wY2ppCitcJlxmSWRlYnVnID0gZGVidWdcZlIgbHViIFxmSWRlYnVnID0gN1xmUi4gIERvbXnFm2xueW0gcG96aW9tZW0gamVzdCBub3RpY2UgKDUpLgorLklQICJcZkJkZWxheVxmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAiZGVsYXkgPSB5ZXMgfCBubyIKK29ww7PFum5paiByb3p3aW5pxJljaWUgYWRyZXN1IFxzLTFETlNcczAgcG9kYW5lZ28gdyBvcGNqaSBcZkljb25uZWN0XGZSCisuU3AKK09wY2phIGplc3QgcHJ6eWRhdG5hIHByenkgZHluYW1pY3pueW0gXHMtMUROUyxcczAgYWxibyBnZHkgdXPFgnVnYSBccy0xRE5TXHMwIG5pZSBqZXN0Citkb3N0xJlwbmEgcHJ6eSBzdGFyY2llIHByb2dyYW11IFxmQnN0dW5uZWxcZlIgKGtsaWVudCBccy0xVlBOLFxzMCBwb8WCxIVjemVuaWUgd2R6d2FuaWFuZSkuCisuU3AKK09ww7PFum5pb25lIHJvendpamFuaWUgYWRyZXN1IFxzLTFETlNcczAgamVzdCB3xYLEhWN6YW5lIGF1dG9tYXR5Y3puaWUsIGplxbxlbGkgbmllCitwb3dpZWR6aWUgc2nEmSByb3p3aW5pxJljaWUga3TDs3JlZ29rb2x3aWVrIHogYWRyZXPDs3cgXGZJY29ubmVjdFxmUiBkbGEgZGFuZWoKK3VzxYJ1Z2kuCisuU3AKK09ww7PFum5pb25lIHJvendpamFuaWUgYWRyZXN1IGF1dG9tYXR5Y3puaWUgYWt0eXd1amUgXGZJZmFpbG92ZXIgPSBwcmlvXGZSLgorLlNwCitkZWZhdWx0OiBubworLklQICJcZkJlbmdpbmVJZFxmUiA9IE5VTUVSX1VSWsSERFpFTklBIiA0CisuSVggSXRlbSAiZW5naW5lSWQgPSBOVU1FUl9VUlrEhERaRU5JQSIKK3d5YmllcnogdXJ6xIVkemVuaWUgZGxhIHVzxYJ1Z2kKKy5JUCAiXGZCZW5naW5lTnVtXGZSID0gTlVNRVJfVVJaxIREWkVOSUEiIDQKKy5JWCBJdGVtICJlbmdpbmVOdW0gPSBOVU1FUl9VUlrEhERaRU5JQSIKK3d5YmllcnogdXJ6xIVkemVuaWUgZGxhIHVzxYJ1Z2kKKy5TcAorVXJ6xIVkemVuaWEgc8SFIG51bWVyb3dhbmUgb2QgMSB3IGfDs3LEmS4KKy5JUCAiXGZCZXhlY1xmUiA9IMWaQ0lFxbtLQV9ET19QUk9HUkFNVSIgNAorLklYIEl0ZW0gImV4ZWMgPSDFmkNJRcW7S0FfRE9fUFJPR1JBTVUiCit3eWtvbmFqIGxva2FsbnkgcHJvZ3JhbSBwcnp5c3Rvc293YW55IGRvIHByYWN5IHogc3VwZXJkZW1vbmVtIGluZXRkCisuU3AKK0plxbxlbGkgemRlZmluaW93YW5vIGthdGFsb2cgXGZJY2hyb290XGZSLCB0byDFm2NpZcW8a2EgZG8gXGZJZXhlY1xmUiBqZXN0IG9rcmXFm2xvbmEKK3d6Z2zEmWRlbSB0ZWdvIGthdGFsb2d1LgorLlNwCitOYSBwbGF0Zm9ybWFjaCBVbml4IHVzdGF3aWFuZSBzxIUgbmFzdMSZcHVqxIVjZSB6bWllbm5lIMWbcm9kb3dpc2tvd2U6CitcJlxzLTFSRU1PVEVfSE9TVCwgUkVNT1RFX1BPUlQsIFNTTF9DTElFTlRfRE4sIFNTTF9DTElFTlRfSV9ETi5cczAKKy5pZSBuIC5JUCAiXGZCZXhlY0FyZ3NcZlIgPSAkMCAkMSAkMiAuLi4iIDQKKy5lbCAuSVAgIlxmQmV4ZWNBcmdzXGZSID0gXGYoQ1ckMFxmUiBcZihDVyQxXGZSIFxmKENXJDJcZlIgLi4uIiA0CisuSVggSXRlbSAiZXhlY0FyZ3MgPSAkMCAkMSAkMiAuLi4iCithcmd1bWVudHkgZG8gb3BjamkgXGZJZXhlY1xmUiB3xYLEhWN6bmllIHogbmF6d8SFIHByb2dyYW11ICgkMCkKKy5TcAorQ3l0b3dhbmllIG5pZSBqZXN0IHdzcGllcmFuZSB3IG9iZWNuZWogd2Vyc2ppIHByb2dyYW11LgorQXJndW1lbnR5IHPEhSByb3pkemllbG9uZSBkb3dvbG7EhSBsaWN6YsSFIGJpYcWCeWNoIHpuYWvDs3cuCisuSVAgIlxmQmZhaWxvdmVyXGZSID0gcnIgfCBwcmlvIiA0CisuSVggSXRlbSAiZmFpbG92ZXIgPSByciB8IHByaW8iCitTdHJhdGVnaWEgd3liaWVyYW5pYSBzZXJ3ZXLDs3cgd3lzcGVjeWZpa293YW55Y2ggcGFyYW1ldHJhbWkgXCooTCJjb25uZWN0XCooUiIuCisuU3AKKy5WYiAyCitcJiAgICByciAocm91bmQgcm9iaW4pIFwtIHNwcmF3aWVkbGl3ZSByb3rFgm/FvGVuaWUgb2JjacSFxbxlbmlhCitcJiAgICBwcmlvIChwcmlvcml0eSkgXC0gdcW8eWoga29sZWpub8WbY2kgb3BjamkgdyBwbGlrdSBrb25maWd1cmFjeWpueW0KKy5WZQorLlNwCitkb215xZtsbmllOiBycgorLklQICJcZkJpZGVudFxmUiA9IE5BWldBX1XFu1lUS09XTklLQSIgNAorLklYIEl0ZW0gImlkZW50ID0gTkFaV0FfVcW7WVRLT1dOSUtBIgord2VyeWZpa3VqIG5henfEmSB6ZGFsbmVnbyB1xbx5dGtvd25pa2Ega29yenlzdGFqxIVjIHogcHJvdG9rb8WCdSBccy0xSURFTlQgXHMwKFxzLTFSRkMgMTQxM1xzMCkKKy5JUCAiXGZCaW5jbHVkZVxmUiA9IFxzLTFLQVRBTE9HXHMwIiA0CisuSVggSXRlbSAiaW5jbHVkZSA9IEtBVEFMT0ciCit3Y3p5dGFqIGZyYWdtZW50eSBwbGlrw7N3IGtvbmZpZ3VyYWN5am55Y2ggeiBwb2RhbmVnbyBrYXRhbG9ndQorLlNwCitQbGlraSBzxIUgd2N6eXR5d2FuZSB3IHJvc27EhWNlaiBrb2xlam5vxZtjaSBhbGZhYmV0eWN6bmVqIGljaCBuYXp3LgorLklQICJcZkJrZXlcZlIgPSBccy0xUExJS19LTFVDWkFcczAiIDQKKy5JWCBJdGVtICJrZXkgPSBQTElLX0tMVUNaQSIKK2tsdWN6IHByeXdhdG55IGRvIGNlcnR5ZmlrYXR1IHBvZGFuZWdvIHcgb3BjamkgXGZJY2VydFxmUgorLlNwCitLbHVjeiBwcnl3YXRueSBqZXN0IHBvdHJ6ZWJueSBkbyB1d2llcnp5dGVsbmllbmlhIHfFgmHFm2NpY2llbGEgY2VydHlmaWthdHUuCitQb25pZXdhxbwgcG93aW5pZW4gb24gYnnEhyB6YWNob3dhbnkgdyB0YWplbW5pY3ksIHByYXdhIGRvIGplZ28gb2Rjenl0dQorcG93aW5pZW4gbWllxIcgd3nFgsSFY3puaWUgd8WCYcWbY2ljaWVsIHBsaWt1LiAgVyBzeXN0ZW1pZSBVbml4IG1vxbxuYSB0byBvc2nEhWduxIXEhwora29tZW5kxIU6CisuU3AKKy5WYiAxCitcJiAgICBjaG1vZCA2MDAga2V5ZmlsZQorLlZlCisuU3AKK2RvbXnFm2xuaWU6IHdhcnRvxZvEhyBvcGNqaSBcZkljZXJ0XGZSCisuSVAgIlxmQmxpYndyYXBcZlIgPSB5ZXMgfCBubyIgNAorLklYIEl0ZW0gImxpYndyYXAgPSB5ZXMgfCBubyIKK3fFgsSFY3ogbHViIHd5xYLEhWN6IGtvcnp5c3RhbmllIHogL2V0Yy9ob3N0cy5hbGxvdyBpIC9ldGMvaG9zdHMuZGVueS4KKy5TcAorZG9tecWbbG5pZTogbm8gKG9kIHdlcnNqaSA1LjAwKQorLklQICJcZkJsb2NhbFxmUiA9IFxzLTFIT1NUXHMwIiA0CisuSVggSXRlbSAibG9jYWwgPSBIT1NUIgorXCZccy0xSVBcczAgxbpyw7NkxYJhIGRvIG5hd2nEhXp5d2FuaWEgemRhbG55Y2ggcG/FgsSFY3plxYQKKy5TcAorRG9tecWbbG5pZSB1xbx5d2FuZSBqZXN0IFxzLTFJUFxzMCBuYWpiYXJkemllaiB6ZXduxJl0cnpuZWdvIGludGVyZmVqc3UgdyBzdHJvbsSZCitzZXJ3ZXJhLCBkbyBrdMOzcmVnbyBuYXdpxIV6eXdhbmUgamVzdCBwb8WCxIVjemVuaWUuCisuSVAgIlxmQnNuaVxmUiA9IFVTxYFVR0E6V1pPUlpFQ19OQVpXWV9TRVJXRVJBICh0cnliIHNlcndlcmEpIiA0CisuSVggSXRlbSAic25pID0gVVPFgVVHQTpXWk9SWkVDX05BWldZX1NFUldFUkEgKHRyeWIgc2Vyd2VyYSkiCitVxbx5aiB1c8WCdWdpIGpha28gcG9kcnrEmWRuZWogKHZpcnR1YWxuZWdvIHNlcndlcmEpIGRsYSByb3pzemVyemVuaWEgXHMtMVRMU1xzMCBTZXJ2ZXIKK05hbWUgSW5kaWNhdGlvbiAoXHMtMVJGQyAzNTQ2XHMwKS4KKy5TcAorXCZcZkluYXp3YV91c8WCdWdpXGZSIHdza2F6dWplIHVzxYJ1Z8SZIG5hZHJ6xJlkbsSFLCBrdMOzcmEgb2RiaWVyYSBwb8WCxIVjemVuaWEgb2Qga2xpZW50w7N3Citwcnp5IHBvbW9jeSBvcGNqaSBcZklhY2NlcHRcZlIuICBcZkl3em9yemVjX25hend5X3NlcndlcmFcZlIgd3NrYXp1amUgbmF6d8SZIHNlcndlcmEKK3dpcnR1YWxuZWdvLiAgV3pvcnplYyBtb8W8ZSB6YWN6eW5hxIcgc2nEmSB6bmFraWVtICcqJywgbnAuICcqLmV4YW1wbGUuY29tIi4KK1ogcG9qZWR5xYRjesSFIHVzxYJ1Z8SFIG5hZHJ6xJlkbsSFIHBvd2nEhXphbmUgamVzdCB6d3lrbGUgd2llbGUgdXPFgnVnIHBvZHJ6xJlkbnljaC4KK09wY2phIFxmSXNuaVxmUiBtb8W8ZSBiecSHIHJvd25pZcW8IHXFvHl0YSB3aWVsb2tyb3RuaWUgdyByYW1hY2ggamVkbmVqIHVzxYJ1Z2kKK3BvZHJ6xJlkbmVqLgorLlNwCitaYXLDs3dubyB1c8WCdWdhIG5hZHJ6xJlkbmEgamFrIGkgcG9kcnrEmWRuYSBuaWUgbW/FvGUgYnnEhyBza29uZmlndXJvd2FuYSB3IHRyeWJpZQora2xpZW5ja2ltLgorLlNwCitPcGNqYSBcZkljb25uZWN0XGZSIHVzxYJ1Z2kgcG9kcnrEmWRuZWogamVzdCBpZ25vcm93YW5hIHcgcG/FgsSFY3plbml1IHogb3BjasSFCitcJlxmSXByb3RvY29sXGZSLCBnZHnFvCBwb8WCxIVjemVuaWUgZG8gemRhbG5lZ28gc2Vyd2VyYSBqZXN0IHcgdHltIHd5cGFka3UgbmF3acSFenl3YW5lCitwcnplZCBuZWdvY2phY2rEhSBccy0xVExTLlxzMAorLlNwCitVd2llcnp5dGVsbmllbmllIHByenkgcG9tb2N5IGJpYmxpb3Rla2kgbGlid3JhcCBqZXN0IHJlYWxpem93YW5lIGR3dWtyb3RuaWU6CituYWpwaWVydyBkbGEgdXPFgnVnaSBuYWRyesSZZG5laiBwbyBvZGVicmFuaXUgcG/FgsSFY3plbmlhIFxzLTFUQ1AsXHMwIGEgbmFzdMSZcG5pZSBkbGEKK3VzxYJ1Z2kgcG9kcnrEmWRuZWogcG9kY3phcyBuZWdvY2phY2ppIFxzLTFUTFMuXHMwCisuU3AKK09wY2phIFxmSXNuaVxmUiBqZXN0IGRvc3TEmXBuYSBwb2N6xIV3c3p5IG9kIFxmQk9wZW5TU0wgMS4wLjBcZlIuCisuSVAgIlxmQnNuaVxmUiA9IFxzLTFIT1NUIFxzMCh0cnliIGtsaWVudGEpIiA0CisuSVggSXRlbSAic25pID0gSE9TVCAodHJ5YiBrbGllbnRhKSIKK1XFvHlqIHBhcmFtZXRydSBqYWtvIHdhcnRvxZtjaSByb3pzemVyemVuaWEgXHMtMVRMU1xzMCBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uCisoXHMtMVJGQyAzNTQ2XHMwKS4KKy5TcAorT3BjamEgXGZJc25pXGZSIGplc3QgZG9zdMSZcG5hIHBvY3rEhXdzenkgb2QgXGZCT3BlblNTTCAxLjAuMFxmUi4KKy5JUCAiXGZCXHMtMU9DU1BcczBcZlIgPSBccy0xVVJMXHMwIiA0CisuSVggSXRlbSAiT0NTUCA9IFVSTCIKK3NlcndlciBccy0xT0NTUFxzMCBkbyB3ZXJ5ZmlrYWNqaSBjZXJ0eWZpa2F0w7N3CisuSVAgIlxmQk9DU1BhaWFcZlIgPSB5ZXMgfCBubyIgNAorLklYIEl0ZW0gIk9DU1BhaWEgPSB5ZXMgfCBubyIKK3dlcnlmaWt1aiBjZXJ0eWZpa2F0eSBwcnp5IHXFvHljaXUgcmVzcG9uZGVydMOzdyBccy0xQUlBXHMwCisuU3AKK09wY2phIFxmSU9DU1BhaWFcZlIgcG96d2FsYSBuYSB3ZXJ5Zmlrb3dhbmllIGNlcnR5ZmlrYXTDs3cgcHJ6eSBwb21vY3kgbGlzdHkgVVJMaQorc2Vyd2Vyw7N3IFxzLTFPQ1NQXHMwIHByemVzxYJhbnljaCB3IHJvenN6ZXJ6ZW5pYWNoIFxzLTFBSUEgXHMwKEF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MpLgorLklQICJcZkJPQ1NQZmxhZ1xmUiA9IFxzLTFGTEFHQV9PQ1NQXHMwIiA0CisuSVggSXRlbSAiT0NTUGZsYWcgPSBGTEFHQV9PQ1NQIgorZmxhZ2Egc2Vyd2VyYSBccy0xT0NTUFxzMAorLlNwCitha3R1YWxuaWUgd3NwaWVyYW5lIGZsYWdpOiBccy0xTk9DRVJUUywgTk9JTlRFUk4gTk9TSUdTLCBOT0NIQUlOLCBOT1ZFUklGWSwKK05PRVhQTElDSVQsIE5PQ0FTSUdOLCBOT0RFTEVHQVRFRCwgTk9DSEVDS1MsIFRSVVNUT1RIRVIsIFJFU1BJRF9LRVksIE5PVElNRVxzMAorLlNwCitBYnkgd3lzcGVjeWZpa293YcSHIGtpbGthIGZsYWcgbmFsZcW8eSB1xbx5xIcgXGZJT0NTUGZsYWdcZlIgd2llbG9rcm90bmllLgorLklQICJcZkJvcHRpb25zXGZSID0gXHMtMU9QQ0pFX1NTTFxzMCIgNAorLklYIEl0ZW0gIm9wdGlvbnMgPSBPUENKRV9TU0wiCitvcGNqZSBiaWJsaW90ZWtpIFxmQk9wZW5TU0xcZlIKKy5TcAorUGFyYW1ldHJlbSBqZXN0IG5hendhIG9wY2ppIHpnb2RuaWUgeiBvcGlzZW0gdyBcZklcZklTU0xfQ1RYX3NldF9vcHRpb25zXGZJXHwoM3NzbClcZlIsCithbGUgYmV6IHByemVkcm9zdGthIFxmSVxzLTFTU0xfT1BfXHMwXGZSLgorXCZcZklzdHVubmVsIFwtb3B0aW9uc1xmUiB3ecWbd2lldGxhIG9wY2plIGRvendvbG9uZSB3IGFrdHVhbG5laiBrb21iaW5hY2ppCitwcm9ncmFtdSBcZklzdHVubmVsXGZSIGkgYmlibGlvdGVraSBcZklPcGVuU1NMXGZSLgorLlNwCitBYnkgd3lzcGVjeWZpa293YcSHIGtpbGthIG9wY2ppIG5hbGXFvHkgdcW8ecSHIFxmSW9wdGlvbnNcZlIgd2llbG9rcm90bmllLgorTmF6d2Egb3BjamkgbW/FvGUgYnnEhyBwb3ByemVkem9uYSBtecWbbG5pa2llbSAoXCooTCJcLVwqKFIiKSBjZWxlbSB3ecWCxIVjemVuaWEgb3BjamkuCisuU3AKK05hIHByenlrxYJhZCwgZGxhIHphY2hvd2FuaWEga29tcGF0eWJpbG5vxZtjaSB6IGLFgsSZZGFtaSBpbXBsZW1lbnRhY2ppIFxzLTFTU0xcczAKK3cgcHJvZ3JhbWllIEV1ZG9yYSwgbW/FvG5hIHXFvHnEhyBvcGNqaToKKy5TcAorLlZiIDEKK1wmICAgIG9wdGlvbnMgPSBET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKKy5WZQorLlNwCitkb215xZtsbmllOgorLlNwCisuVmIgMgorXCYgICAgb3B0aW9ucyA9IE5PX1NTTHYyCitcJiAgICBvcHRpb25zID0gTk9fU1NMdjMKKy5WZQorLklQICJcZkJwcm90b2NvbFxmUiA9IFBST1RPS8OTxYEiIDQKKy5JWCBJdGVtICJwcm90b2NvbCA9IFBST1RPS8OTxYEiCituZWdvY2p1aiBccy0xU1NMXHMwIHBvZGFueW0gcHJvdG9rb8WCZW0gYXBsaWthY3lqbnltCisuU3AKK09wY2phIHRhIHfFgsSFY3phIHdzdMSZcG7EhSBuZWdvY2phY2rEmSBzenlmcm93YW5pYSBccy0xU1NMXHMwIGRsYSB3eWJyYW5lZ28gcHJvdG9rb8WCdQorYXBsaWthY3lqbmVnby4KK09wY2ppIFxmSXByb3RvY29sXGZSIG5pZSBuYWxlxbx5IHXFvHl3YcSHIHogc3p5ZnJvd2FuaWVtIFxzLTFTU0xcczAgbmEgb3NvYm55bSBwb3JjaWUuCisuU3AKK0FrdHVhbG5pZSB3c3BpZXJhbmUgcHJvdG9rb8WCeToKKy5SUyA0CisuSVAgIlxmSWNpZnNcZlIiIDQKKy5JWCBJdGVtICJjaWZzIgorVW5pZXVkb2t1bWVudG93YW5lIHJvenN6ZXJ6ZW5pZSBwcm90b2tvxYJ1IFxzLTFDSUZTXHMwIHdzcGllcmFuZSBwcnpleiBzZXJ3ZXIgU2FtYmEuCitXc3BhcmNpZSBkbGEgdGVnbyByb3pyemVjemVuaWEgem9zdGHFgm8gemFyenVjb25lIHcgd2Vyc2ppIDMuMC4wIHNlcndlcmEgU2FtYmEuCisuSVAgIlxmSWNvbm5lY3RcZlIiIDQKKy5JWCBJdGVtICJjb25uZWN0IgorTmVnb2NqYWNqYSBccy0xUkZDIDI4MTcgXC0gXHMwXGZJVXBncmFkaW5nIHRvIFxzLTFUTFNcczAgV2l0aGluIFxzLTFIVFRQLzEuMVxzMFxmUiwgcm96ZHppYcWCIDUuMiBcLSBcZklSZXF1ZXN0aW5nIGEgVHVubmVsIHdpdGggXHMtMUNPTk5FQ1RcczBcZlIKKy5TcAorVGVuIHByb3Rva8OzxYIgamVzdCB3c3BpZXJhbnkgd3nFgsSFY3puaWUgdyB0cnliaWUga2xpZW5ja2ltLgorLklQICJcZklpbWFwXGZSIiA0CisuSVggSXRlbSAiaW1hcCIKK05lZ29jamFjamEgXHMtMVJGQyAyNTk1IFwtIFxzMFxmSVVzaW5nIFxzLTFUTFNcczAgd2l0aCBccy0xSU1BUCwgUE9QM1xzMCBhbmQgXHMtMUFDQVBcczBcZlIKKy5JUCAiXGZJbm50cFxmUiIgNAorLklYIEl0ZW0gIm5udHAiCitOZWdvY2phY2phIFxzLTFSRkMgNDY0MiBcLSBcczBcZklVc2luZyBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgKFxzLTFUTFNcczApIHdpdGggTmV0d29yayBOZXdzIFRyYW5zZmVyIFByb3RvY29sIChccy0xTk5UUFxzMClcZlIKKy5TcAorVGVuIHByb3Rva8OzxYIgamVzdCB3c3BpZXJhbnkgd3nFgsSFY3puaWUgdyB0cnliaWUga2xpZW5ja2ltLgorLklQICJcZklwZ3NxbFxmUiIgNAorLklYIEl0ZW0gInBnc3FsIgorTmVnb2NqYWNqYSBodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOC4zL3N0YXRpYy9wcm90b2NvbFwtZmxvdy5odG1sI0FFTjczOTgyCisuSVAgIlxmSXBvcDNcZlIiIDQKKy5JWCBJdGVtICJwb3AzIgorTmVnb2NqYWNqYSBccy0xUkZDIDI0NDkgXC0gXHMwXGZJXHMtMVBPUDNcczAgRXh0ZW5zaW9uIE1lY2hhbmlzbVxmUgorLklQICJcZklwcm94eVxmUiIgNAorLklYIEl0ZW0gInByb3h5IgorUHJ6ZWthenl3YW5pZSBhZHJlc3UgXHMtMUlQXHMwIGhhcHJveHkgaHR0cDovL2hhcHJveHkuMXd0LmV1L2Rvd25sb2FkLzEuNS9kb2MvcHJveHlcLXByb3RvY29sLnR4dAorLklQICJcZklzbXRwXGZSIiA0CisuSVggSXRlbSAic210cCIKK05lZ29jamFjamEgXHMtMVJGQyAyNDg3IFwtIFxzMFxmSVxzLTFTTVRQXHMwIFNlcnZpY2UgRXh0ZW5zaW9uIGZvciBTZWN1cmUgXHMtMVNNVFBcczAgb3ZlciBccy0xVExTXHMwXGZSCisuSVAgIlxmSXNvY2tzXGZSIiA0CisuSVggSXRlbSAic29ja3MiCitXc3BpZXJhbnkgamVzdCBwcm90b2vDs8WCIFxzLTFTT0NLU1xzMCB3IHdlcnNqYWNoIDQsIDRhIGkgNS4KK1Byb3Rva8OzxYIgXHMtMVNPQ0tTXHMwIGVua2Fwc3Vsb3dhbnkgamVzdCB3IHByb3Rva29sZSBccy0xU1NML1RMUyxcczAgd2nEmWMgYWRyZXMgc2Vyd2VyYQorZG9jZWxvd2VnbyBuaWUgamVzdCB3aWRvY3pueSBkbGEgbmFwYXN0bmlrYSBwcnplY2h3eXR1asSFY2VnbyBydWNoIHNpZWNpb3d5LgorLlNwCitcJlxmSWh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L3NvY2tzNC5wcm90b2NvbFxmUgorLlNwCitcJlxmSWh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L3NvY2tzNGEucHJvdG9jb2xcZlIKKy5TcAorTmllIGplc3Qgd3NwaWVyYW5hIGtvbWVuZGEgXHMtMUJJTkRcczAgcHJvdG9rb8WCdSBccy0xU09DS1MuXHMwCitQcnplc8WCYW5hIHdhcnRvxZvEhyBwYXJhbWV0cnUgXHMtMVVTRVJJRFxzMCBqZXN0IGlnbm9yb3dhbmEuCisuU3AKK1Nla2NqYSBQUlpZS8WBQURZIHphd2llcmEgcHJ6eWvFgmFkb3dlIHBsaWtpIGtvbmZpZ3VyYWN5am5lIFZQTmEgemJ1ZG93YW5lZ28KK3cgb3BhcmNpdSBvIHN6eWZyb3dhbnkgcHJvdG9rw7PFgiBccy0xU09DS1MuXHMwCisuUkUKKy5SUyA0CisuUkUKKy5JUCAiXGZCcHJvdG9jb2xBdXRoZW50aWNhdGlvblxmUiA9IGJhc2ljIHwgbnRsbSIgNAorLklYIEl0ZW0gInByb3RvY29sQXV0aGVudGljYXRpb24gPSBiYXNpYyB8IG50bG0iCityb2R6YWogdXdpZXJ6eXRlbG5pZW5pYSBkbyBuZWdvY2phY2ppIHByb3Rva2/FgnUKKy5TcAorT2JlY25pZSB0eXAgdXdpZXJ6eXRlbG5pZW5pYSBtYSB6YXN0b3Nvd2FuaWUgd3nFgsSFY3puaWUgdyBwcm90b2tvbGUgJ2Nvbm5lY3QnLgorLlNwCitkb215xZtsbmllOiBiYXNpYworLklQICJcZkJwcm90b2NvbEhvc3RcZlIgPSBccy0xSE9TVDpQT1JUXHMwIiA0CisuSVggSXRlbSAicHJvdG9jb2xIb3N0ID0gSE9TVDpQT1JUIgorYWRyZXMgZG9jZWxvd3kgZG8gbmVnb2NqYWNqaSBwcm90b2tvxYJ1CisuU3AKK1wmXGZJcHJvdG9jb2xIb3N0XGZSIG9rcmXFm2xhIGRvY2Vsb3d5IHNlcndlciBccy0xU1NMLFxzMCBkbyBrdMOzcmVnbyBwb8WCxIVjennEhyBtYSBzacSZIHByb3h5LgorTmllIGplc3QgdG8gYWRyZXMgc2Vyd2VyYSBwcm94eSwgZG8ga3TDs3JlZ28gcG/FgsSFY3plbmllIHplc3Rhd2lhIFxmQnN0dW5uZWxcZlIuCitBZHJlcyBzZXJ3ZXJhIHByb3h5IHBvd2luaWVuIGJ5xIcgb2tyZcWbbG9ueSBwcnp5IHBvbW9jeSBvcGNqaSAnY29ubmVjdCcuCisuU3AKK1cgb2JlY25laiB3ZXJzamkgYWRyZXMgZG9jZWxvd3kgcHJvdG9rb8WCdSBtYSB6YXN0b3Nvd2FuaWUgd3nFgsSFY3puaWUgdyBwcm90b2tvbGUKK1wmJ2Nvbm5lY3QnLgorLklQICJcZkJwcm90b2NvbFBhc3N3b3JkXGZSID0gSEFTxYFPIiA0CisuSVggSXRlbSAicHJvdG9jb2xQYXNzd29yZCA9IEhBU8WBTyIKK2hhc8WCbyBkbyBuZWdvY2phY2ppIHByb3Rva2/FgnUKKy5JUCAiXGZCcHJvdG9jb2xVc2VybmFtZVxmUiA9IFXFu1lUS09XTklLIiA0CisuSVggSXRlbSAicHJvdG9jb2xVc2VybmFtZSA9IFXFu1lUS09XTklLIgorbmF6d2EgdcW8eXRrb3duaWthIGRvIG5lZ29jamFjamkgcHJvdG9rb8WCdQorLklQICJcZkJQU0tpZGVudGl0eVxmUiA9IFRPxbtTQU1PxZrEhiIgNAorLklYIEl0ZW0gIlBTS2lkZW50aXR5ID0gVE/Fu1NBTU/FmsSGIgordG/FvHNhbW/Fm8SHIGtsaWVudGEgXHMtMVBTS1xzMAorLlNwCitcJlxmSVBTS2lkZW50aXR5XGZSIG1vxbxlIHpvc3RhxIcgdcW8eXRlIHcgc2VrY2phY2gga2xpZW5ja2ljaCBkbyB3eWJyYW5pYQordG/FvHNhbW/Fm2NpIHXFvHl0ZWogZG8gdXdpZXJ6eXRlbG5pZW5pYSBccy0xUFNLLlxzMAorT3BjamEgamVzdCBpZ25vcm93YW5hIHcgc2VrY2phY2ggc2Vyd2Vyb3d5Y2guCisuU3AKK2RvbXnFm2xuaWU6IHBpZXJ3c3phIHRvxbxzYW1vxZvEhyB6ZGVmaW5pb3dhbmEgdyBwbGlrdSBcZklQU0tzZWNyZXRzXGZSCisuSVAgIlxmQlBTS3NlY3JldHNcZlIgPSBccy0xUExJS1xzMCIgNAorLklYIEl0ZW0gIlBTS3NlY3JldHMgPSBQTElLIgorcGxpayB6IHRvxbxzYW1vxZtjaWFtaSBpIGtsdWN6YW1pIFxzLTFQU0tcczAKKy5TcAorS2HFvGRhIGxpbmlhIHBsaWt1IGplc3QgdyBuYXN0xJlwdWrEhWN5bSBmb3JtYWNpZToKKy5TcAorLlZiIDEKK1wmICAgIFRPxbtTQU1PxZrEhjpLTFVDWgorLlZlCisuU3AKK0tsdWN6IG11c2kgYnnEhyBtaWXEhyBwcnp5bmFqbW5pZWogMjAgem5ha8Ozdy4KK05hbGXFvHkgb2dyYW5pY3p5xIcgZG9zdMSZcCBkbyBjenl0YW5pYSBsdWIgcGlzYW5pYSBkbyB0ZWdvIHBsaWt1LgorLklQICJcZkJwdHlcZlIgPSB5ZXMgfCBubyAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJwdHkgPSB5ZXMgfCBubyAodHlsa28gVW5peCkiCithbG9rdWogcHNldWRvdGVybWluYWwgZGxhIHByb2dyYW11IHVydWNoYW1pYW5lZ28gdyBvcGNqaSAnZXhlYycKKy5JUCAiXGZCcmVkaXJlY3RcZlIgPSBbXHMtMUhPU1Q6XHMwXVBPUlQiIDQKKy5JWCBJdGVtICJyZWRpcmVjdCA9IFtIT1NUOl1QT1JUIgorcHJ6ZWtpZXJ1aiBrbGllbnRhLCBrdMOzcmVtdSBuaWUgdWRhxYJvIHNpxJkgcG9wcmF3bmllIHV3aWVyenl0ZWxuacSHIHByenkgcG9tb2N5IGNlcnR5ZmlrYXR1CisuU3AKK09wY2phIGR6aWHFgmEgd3nFgsSFY3puaWUgdyB0cnliaWUgc2Vyd2VyYS4KK0N6xJnFm8SHIG5lZ29jamFjamkgcHJvdG9rb8WCw7N3IGplc3Qgbmlla29tcGF0eWJpbG5hIHogb3BjasSFIFxmSXJlZGlyZWN0XGZSLgorLklQICJcZkJyZW5lZ290aWF0aW9uXGZSID0geWVzIHwgbm8iIDQKKy5JWCBJdGVtICJyZW5lZ290aWF0aW9uID0geWVzIHwgbm8iCitwb3p3YWxhaiBuYSByZW5lZ29jamFjasSZIFxzLTFTU0xcczAKKy5TcAorV8WbcsOzZCB6YXN0b3Nvd2HFhCByZW5lZ29jamFjamkgXHMtMVNTTFxzMCBzxIUgbmlla3TDs3JlIHNjZW5hcml1c3plIHV3aWVyenl0ZWxuaWVuaWEsCitvcmF6IHJlbmVnb2NqYWNqYSBrbHVjenkgZGxhIGTFgnVnb3Ryd2HFgnljaCBwb8WCxIVjemXFhC4KKy5TcAorWiBkcnVnaWVqIHN0cm9ueSB3xYJhc25vxZvEhyBuYSBtb8W8ZSB1xYJhdHdpxIcgdHJ5d2lhbG55IGF0YWsgRG9TIHBvcHJ6ZXoKK3d5Z2VuZXJvd2FuaWUgb2JjacSFxbxlbmlhIHByb2Nlc29yYToKKy5TcAoraHR0cDovL3ZpbmNlbnQuYmVybmF0LmltL2VuL2Jsb2cvMjAxMVwtc3NsXC1kb3NcLW1pdGlnYXRpb24uaHRtbAorLlNwCitXYXJ0byB6YXV3YcW8ecSHLCDFvGUgemFibG9rb3dhbmllIHJlbmVnb2NqYWNqaSBccy0xU1NMXHMwIG5pZSB6ZWJlenBpZWN6YSB3IHBlxYJuaQorcHJ6ZWQgb3Bpc2FueW0gcHJvYmxlbWVtLgorLlNwCitkb215xZtsbmllOiB5ZXMgKG8gaWxlIHdzcGllcmFuZSBwcnpleiBcZkJPcGVuU1NMXGZSKQorLklQICJcZkJyZXNldFxmUiA9IHllcyB8IG5vIiA0CisuSVggSXRlbSAicmVzZXQgPSB5ZXMgfCBubyIKK3N5Z25hbGl6dWogd3lzdMSFcGllbmllIGLFgsSZZHUgcHJ6eSBwb21vY3kgZmxhZ2kgXHMtMVRDUCBSU1RcczAKKy5TcAorT3BjamEgbmllIGplc3Qgd3NwaWVyYW5hIG5hIG5pZWt0w7NyeWNoIHBsYXRmb3JtYWNoLgorLlNwCitkb215xZtsbmllOiB5ZXMKKy5JUCAiXGZCcmV0cnlcZlIgPSB5ZXMgfCBubyIgNAorLklYIEl0ZW0gInJldHJ5ID0geWVzIHwgbm8iCitwb8WCxIVjeiBwb25vd25pZSBzZWtjasSZIGNvbm5lY3QrZXhlYyBwbyByb3rFgsSFY3plbml1CisuU3AKK2RvbXnFm2xuaWU6IG5vCisuSVAgIlxmQnNlc3Npb25DYWNoZVNpemVcZlIgPSBccy0xTElDWkJBX1BPWllDSklfQ0FDSEVcczAiIDQKKy5JWCBJdGVtICJzZXNzaW9uQ2FjaGVTaXplID0gTElDWkJBX1BPWllDSklfQ0FDSEUiCityb3ptaWFyIHBhbWnEmWNpIHBvZHLEmWN6bmVqIHNlc2ppIFxzLTFTU0xcczAKKy5TcAorUGFyYW1ldHIgb2tyZcWbbGEgbWFrc3ltYWxuxIUgbGljemLEmSBwb3p5Y2ppIHdld27EmXRyem5laiBwYW1pxJljaSBwb2RyxJljem5lagorc2VzamkuCisuU3AKK1dhcnRvxZvEhyAwIG96bmFjemEgYnJhayBvZ3JhbmljemVuaWEgcm96bWlhcnUuICBOaWUgamVzdCB0byB6YWxlY2FuZSBkbGEKK3N5c3RlbcOzdyBwcm9kdWtjeWpueWNoIHogdXdhZ2kgbmEgcnl6eWtvIGF0YWt1IERvUyBwcnpleiB3eWN6ZXJwYW5pZSBwYW1pxJljaQorXCZccy0xUkFNLlxzMAorLklQICJcZkJzZXNzaW9uQ2FjaGVUaW1lb3V0XGZSID0gXHMtMUxJQ1pCQV9TRUtVTkRcczAiIDQKKy5JWCBJdGVtICJzZXNzaW9uQ2FjaGVUaW1lb3V0ID0gTElDWkJBX1NFS1VORCIKK3ByemV0ZXJtaW5vd2FuaWUgcGFtacSZY2kgcG9kcsSZY3puZWogc2VzamkgXHMtMVNTTFxzMAorLlNwCitQYXJhbWV0ciBva3JlxZtsYSBjemFzIHcgc2VrdW5kYWNoLCBwbyBrdMOzcnltIHNlc2phIFxzLTFTU0xcczAgem9zdGFuaWUgdXN1bmnEmXRhIHoKK3BhbWnEmWNpIHBvZHLEmWN6bmVqLgorLklQICJcZkJzZXNzaW9uZFxmUiA9IFxzLTFIT1NUOlBPUlRcczAiIDQKKy5JWCBJdGVtICJzZXNzaW9uZCA9IEhPU1Q6UE9SVCIKK2FkcmVzIHNlc3Npb25kIFwtIHNlcnZlcmEgY2FjaGUgc2VzamkgXHMtMVNTTFxzMAorLklQICJcZkJzc2xWZXJzaW9uXGZSID0gXHMtMVdFUlNKQV9TU0xcczAiIDQKKy5JWCBJdGVtICJzc2xWZXJzaW9uID0gV0VSU0pBX1NTTCIKK3dlcnNqYSBwcm90b2tvxYJ1IFxzLTFTU0xcczAKKy5TcAorV3NwaWVyYW5lIG9wY2plOiBhbGwsIFNTTHYyLCBTU0x2MywgVExTdjEsIFRMU3YxLjEsIFRMU3YxLjIKKy5TcAorRG9zdMSZcG5vxZvEhyBrb25rcmV0bnljaCBwcm90b2tvxYLDs3cgemFsZcW8eSBvZCB1xbx5dGVqIHdlcnNqaSBPcGVuU1NMLgorU3RhcnN6ZSB3ZXJzamUgT3BlblNTTCBuaWUgd3NwaWVyYWrEhSBUTFN2MS4xIGkgVExTdjEuMi4KK05vd3N6ZSB3ZXJzamUgT3BlblNTTCBuaWUgd3NwaWVyYWrEhSBTU0x2Mi4KKy5TcAorUHJ6ZXN0YXJ6YcWCZSBwcm90b2tvxYJ5IFNTTHYyIGkgU1NMdjMgc8SFIGRvbXnFm2xuaWUgd3nFgsSFY3pvbmUuCitTemN6ZWfDs8WCb3dlIGluZm9ybWFjamUgZG9zdMSZcG5lIHPEhSB3IG9waXNpZSBvcGNqaSBcZkJvcHRpb25zXGZSLgorLklQICJcZkJzdGFja1xmUiA9IExJQ1pCQV9CQUpUw5NXICh6IHd5asSFdGtpZW0gbW9kZWx1IFxzLTFGT1JLXHMwKSIgNAorLklYIEl0ZW0gInN0YWNrID0gTElDWkJBX0JBSlTDk1cgKHogd3lqxIV0a2llbSBtb2RlbHUgRk9SSykiCityb3ptaWFyIHN0b3N1IHByb2Nlc29yYSB3xIV0a3UKKy5JUCAiXGZCVElNRU9VVGJ1c3lcZlIgPSBccy0xTElDWkJBX1NFS1VORFxzMCIgNAorLklYIEl0ZW0gIlRJTUVPVVRidXN5ID0gTElDWkJBX1NFS1VORCIKK2N6YXMgb2N6ZWtpd2FuaWEgbmEgc3BvZHppZXdhbmUgZGFuZQorLklQICJcZkJUSU1FT1VUY2xvc2VcZlIgPSBccy0xTElDWkJBX1NFS1VORFxzMCIgNAorLklYIEl0ZW0gIlRJTUVPVVRjbG9zZSA9IExJQ1pCQV9TRUtVTkQiCitjemFzIG9jemVraXdhbmlhIG5hIGNsb3NlX25vdGlmeSAodXN0YXcgbmEgMCwgamXFvGVsaSBrbGllbnRlbSBqZXN0IFxzLTFNU0lFXHMwKQorLklQICJcZkJUSU1FT1VUY29ubmVjdFxmUiA9IFxzLTFMSUNaQkFfU0VLVU5EXHMwIiA0CisuSVggSXRlbSAiVElNRU9VVGNvbm5lY3QgPSBMSUNaQkFfU0VLVU5EIgorY3phcyBvY3pla2l3YW5pYSBuYSBuYXdpxIV6YW5pZSBwb8WCxIVjemVuaWEKKy5JUCAiXGZCVElNRU9VVGlkbGVcZlIgPSBccy0xTElDWkJBX1NFS1VORFxzMCIgNAorLklYIEl0ZW0gIlRJTUVPVVRpZGxlID0gTElDWkJBX1NFS1VORCIKK21ha3N5bWFsbnkgY3phcyB1dHJ6eW15d2FuaWEgYmV6Y3p5bm5lZ28gcG/FgsSFY3plbmlhCisuSVAgIlxmQnRyYW5zcGFyZW50XGZSID0gbm9uZSB8IHNvdXJjZSB8IGRlc3RpbmF0aW9uIHwgYm90aCAodHlsa28gVW5peCkiIDQKKy5JWCBJdGVtICJ0cmFuc3BhcmVudCA9IG5vbmUgfCBzb3VyY2UgfCBkZXN0aW5hdGlvbiB8IGJvdGggKHR5bGtvIFVuaXgpIgordHJ5YiBwcnplenJvY3p5c3RlZ28gcHJveHkgbmEgd3NwaWVyYW55Y2ggcGxhdGZvcm1hY2gKKy5TcAorV3NwaWVyYW5lIG9wY2plOgorLlJTIDQKKy5JUCAiXGZCbm9uZVxmUiIgNAorLklYIEl0ZW0gIm5vbmUiCitaYWJsb2t1aiB3c3BhcmNpZSBkbGEgcHJ6ZXpyb2N6eXN0YWdvIHByb3h5LiAgSmVzdCB0byB3YXJ0b8WbxIcgZG9tecWbbG5hLgorLklQICJcZkJzb3VyY2VcZlIiIDQKKy5JWCBJdGVtICJzb3VyY2UiCitQcnplcGlzeiBhZHJlcywgYWJ5IG5hd2nEhXp5d2FuZSBwb8WCxIVjemVuaWUgd3lkYXdhxYJvIHNpxJkgcG9jaG9kemnEhworYmV6cG/Fm3JlZG5pbyBvZCBrbGllbnRhLCBhIG5pZSBvZCBwcm9ncmFtdSBcZkJzdHVubmVsXGZSLgorLlNwCitPcGNqYSBqZXN0IGFrdHVhbG5pZSBvYnPFgnVnaXdhbmEgdzoKKy5SUyA0CisuSVAgIlRyeWJpZSB6ZGFsbnltIChvcGNqYSBcZkljb25uZWN0XGZSKSB3IHN5c3RlbWllIFxmSUxpbnV4ID49Mi42LjI4XGZSIiA0CisuSVggSXRlbSAiVHJ5YmllIHpkYWxueW0gKG9wY2phIGNvbm5lY3QpIHcgc3lzdGVtaWUgTGludXggPj0yLjYuMjgiCitLb25maWd1cmFjamEgd3ltYWdhIG5hc3TEmXB1asSFY3ljaCB1c3Rhd2llxYQgaXB0YWJsZXMgb3JheiByb3V0aW5ndQorKG5hIHByenlrxYJhZCB3IHBsaWt1IC9ldGMvcmMubG9jYWwgbHViIGFuYWxvZ2ljem55bSk6CisuU3AKKy5WYiA3CitcJiAgICBpcHRhYmxlcyBcLXQgbWFuZ2xlIFwtTiBESVZFUlQKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIFBSRVJPVVRJTkcgXC1wIHRjcCBcLW0gc29ja2V0IFwtaiBESVZFUlQKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIERJVkVSVCBcLWogTUFSSyBcLVwtc2V0XC1tYXJrIDEKK1wmICAgIGlwdGFibGVzIFwtdCBtYW5nbGUgXC1BIERJVkVSVCBcLWogQUNDRVBUCitcJiAgICBpcCBydWxlIGFkZCBmd21hcmsgMSBsb29rdXAgMTAwCitcJiAgICBpcCByb3V0ZSBhZGQgbG9jYWwgMC4wLjAuMC8wIGRldiBsbyB0YWJsZSAxMDAKK1wmICAgIGVjaG8gMCA+L3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvbG8vcnBfZmlsdGVyCisuVmUKKy5TcAorS29uZmlndXJhY2phIHRhIHd5bWFnYSwgYWJ5IFxmQnN0dW5uZWxcZlIgYnnFgiB3eWtvbnl3YW55IGpha28gcm9vdCBpIGJleiBvcGNqaSBcZklzZXR1aWRcZlIuCisuSVAgIlRyeWJpZSB6ZGFsbnltIChvcGNqYSBcZkljb25uZWN0XGZSKSB3IHN5c3RlbWllIFxmSUxpbnV4IDIuMi54XGZSIiA0CisuSVggSXRlbSAiVHJ5YmllIHpkYWxueW0gKG9wY2phIGNvbm5lY3QpIHcgc3lzdGVtaWUgTGludXggMi4yLngiCitLb25maWd1cmFjamEgdGEgd3ltYWdhIHNrb21waWxvd2FuaWEgasSFZHJhIHogb3BjasSFIFxmSXRyYW5zcGFyZW50IHByb3h5XGZSLgorRG9jZWxvd2EgdXPFgnVnYSBtdXNpIGJ5xIcgdW1pZXN6Y3pvbmEgbmEgb3NvYm5laiBtYXN6eW5pZSwgZG8ga3TDs3JlaiByb3V0aW5nCitraWVyb3dhbnkgamVzdCBwb3ByemV6IHNlcndlciBcZkJzdHVubmVsYVxmUi4KKy5TcAorRG9kYXRrb3dvIFxmQnN0dW5uZWxcZlIgcG93aW5pZW4gYnnEhyB3eWtvbnl3YW55IGpha28gcm9vdCBpIGJleiBvcGNqaSBcZklzZXR1aWRcZlIuCisuSVAgIlRyeWJpZSB6ZGFsbnltIChvcGNqYSBcZkljb25uZWN0XGZSKSB3IHN5c3RlbWllIFxmSUZyZWVCU0QgPj04LjBcZlIiIDQKKy5JWCBJdGVtICJUcnliaWUgemRhbG55bSAob3BjamEgY29ubmVjdCkgdyBzeXN0ZW1pZSBGcmVlQlNEID49OC4wIgorS29uZmlndXJhY2phIHRhIHd5bWFnYSBza29uZmlndXJvd2FuaWEgZmlyZXdhbGxhIGkgcm91dGluZ3UuCitcJlxmQnN0dW5uZWxcZlIgbXVzaSBiecSHIHd5a29ueXdhbnkgamFrbyByb290IGkgYmV6IG9wY2ppIFxmSXNldHVpZFxmUi4KKy5JUCAiVHJ5YmllIGxva2FsbnltIChvcGNqYSBcZklleGVjXGZSKSIgNAorLklYIEl0ZW0gIlRyeWJpZSBsb2thbG55bSAob3BjamEgZXhlYykiCitLb25maWd1cmFjamEgdGEgamVzdCByZWFsaXpvd2FuYSBwcnp5IHBvbW9jeSBiaWJsaW90ZWtpIFxmSWxpYnN0dW5uZWwuc29cZlIuCitEbyB6YcWCYWRvd2FuaWEgYmlibGlvdGVraSB3eWtvcnp5c3R5d2FuYSBqZXN0IHptaWVubmEgxZtyb2Rvd2lza293YSBfUkxEX0xJU1QgbmEKK3BsYXRmb3JtaWUgVHJ1NjQgbHViIFxzLTFMRF9QUkVMT0FEXHMwIG5hIGlubnljaCBwbGF0Zm9ybWFjaC4KKy5SRQorLlJTIDQKKy5SRQorLklQICJcZklkZXN0aW5hdGlvblxmUiIgNAorLklYIEl0ZW0gImRlc3RpbmF0aW9uIgorT3J5Z2luYWxueSBhZHJlcyBkb2NlbG93eSBqZXN0IHXFvHl3YW55IHphbWlhc3Qgb3BjamkgXGZJY29ubmVjdFxmUi4KKy5TcAorUHJ6eWvFgmFkb3dhbmEga29uZmlndXJhY2phIHByemV6cm9jenlzdGVnbyBhZHJlc3UgZG9jZWxvd2VnbzoKKy5TcAorLlZiIDQKK1wmICAgIFt0cmFuc3BhcmVudF0KK1wmICAgIGNsaWVudD15ZXMKK1wmICAgIGFjY2VwdD08cG9ydF9zdHVubmVsYT4KK1wmICAgIHRyYW5zcGFyZW50PWRlc3RpbmF0aW9uCisuVmUKKy5TcAorS29uZmlndXJhY2phIHd5bWFnYSB1c3Rhd2llxYQgaXB0YWJsZXMsIG5hIHByenlrxYJhZCB3IHBsaWt1CisvZXRjL3JjLmxvY2FsIGx1YiBhbmFsb2dpY3pueW0uCisuU3AKK1cgcHJ6eXBhZGt1IGRvY2Vsb3dlaiB1c8WCdWdpIHVtaWVzemN6b25laiBuYSB0ZWogc2FtZWogbWFzenluaWU6CisuU3AKKy5WYiAzCitcJiAgICAvc2Jpbi9pcHRhYmxlcyBcLXQgbmF0IFwtSSBPVVRQVVQgXC1wIHRjcCBcLVwtZHBvcnQgPHBvcnRfcHJ6ZWtpZXJvd2FueT4gXGUKK1wmICAgICAgICBcLW0gISBcLVwtdWlkXC1vd25lciA8aWRlbnR5ZmlrYXRvcl91xbx5dGtvd25pa2Ffc3R1bm5lbGE+IFxlCitcJiAgICAgICAgXC1qIEROQVQgXC1cLXRvXC1kZXN0aW5hdGlvbiA8bG9rYWxuZV9pcD46PGxva2FsbnlfcG9ydD4KKy5WZQorLlNwCitXIHByenlwYWRrdSBkb2NlbG93ZWogdXPFgnVnaSB1bWllc3pjem9uZWogbmEgemRhbG5laiBtYXN6eW5pZToKKy5TcAorLlZiIDMKK1wmICAgIC9zYmluL2lwdGFibGVzIFwtSSBJTlBVVCBcLWkgZXRoMCBcLXAgdGNwIFwtXC1kcG9ydCA8cG9ydF9zdHVubmVsYT4gXC1qIEFDQ0VQVAorXCYgICAgL3NiaW4vaXB0YWJsZXMgXC10IG5hdCBcLUkgUFJFUk9VVElORyBcLXAgdGNwIFwtXC1kcG9ydCA8cG9ydF9wcnpla2llcm93YW55PiBcZQorXCYgICAgICAgIFwtaSBldGgwIFwtaiBETkFUIFwtXC10b1wtZGVzdGluYXRpb24gPGxva2FsbmVfaXA+Ojxwb3J0X3N0dW5uZWxhPgorLlZlCisuU3AKK1ByemV6cm9jenlzdHkgYWRyZXMgZG9jZWxvd3kgamVzdCBha3R1YWxuaWUgd3NwaWVyYW55IHd5xYLEhWN6bmllIHcgc3lzdGVtaWUgTGludXguCisuSVAgIlxmSWJvdGhcZlIiIDQKKy5JWCBJdGVtICJib3RoIgorVcW8eWogcHJ6ZXpyb2N6eXN0ZWdvIHByb3h5IHphcsOzd25vIGRsYSBhZHJlc3Ugxbpyw7NkxYJvd2VnbyBqYWsgaSBkb2NlbG93ZWdvLgorLlJFCisuUlMgNAorLlNwCitEbGEgemFwZXduaWVuaWEga29tcGF0eWJpbG5vxZtjaSB6IHdjemXFm25pZWpzenltaW0gd2Vyc2phbWkgd3NwaWVyYW5lIHPEhSBkd2llCitkb2RhdGtvd2Ugb3BjamU6CisuSVAgIlxmSXllc1xmUiIgNAorLklYIEl0ZW0gInllcyIKK09wY2phIHpvc3RhxYJhIHByemVtaWFub3dhbmEgbmEgXGZJc291cmNlXGZSLgorLklQICJcZklub1xmUiIgNAorLklYIEl0ZW0gIm5vIgorT3BjamEgem9zdGHFgmEgcHJ6ZW1pYW5vd2FuYSBuYSBcZklub25lXGZSLgorLlJFCisuUlMgNAorLlJFCisuSVAgIlxmQnZlcmlmeVxmUiA9IFxzLTFQT1pJT01cczAiIDQKKy5JWCBJdGVtICJ2ZXJpZnkgPSBQT1pJT00iCit3ZXJ5ZmlrdWogY2VydHlmaWthdCBkcnVnaWVqIHN0cm9ueSBwb8WCxIVjemVuaWEKKy5SUyA0CisuSVAgIlxmSXBvemlvbSAwXGZSIiA0CisuSVggSXRlbSAicG96aW9tIDAiCit6YXJ6xIVkYWogY2VydHlmaWthdHUgaSB6aWdub3J1aiBnbworLklQICJcZklwb3ppb20gMVxmUiIgNAorLklYIEl0ZW0gInBvemlvbSAxIgord2VyeWZpa3VqLCBqZcW8ZWxpIHpvc3RhxYIgcHJ6ZWRzdGF3aW9ueQorLklQICJcZklwb3ppb20gMlxmUiIgNAorLklYIEl0ZW0gInBvemlvbSAyIgord2VyeWZpa3VqIHogemFpbnN0YWxvd2FueW0gY2VydHlmaWthdGVtIENlbnRydW0gQ2VydHlmaWthY2ppCisuSVAgIlxmSXBvemlvbSAzXGZSIiA0CisuSVggSXRlbSAicG96aW9tIDMiCit3ZXJ5ZmlrdWogeiBsb2thbG5pZSB6YWluc3RhbG93YW55bSBjZXJ0eWZpa2F0ZW0gZHJ1Z2llaiBzdHJvbnkKKy5JUCAiXGZJcG96aW9tIDRcZlIiIDQKKy5JWCBJdGVtICJwb3ppb20gNCIKK3dlcnlmaWt1aiB6IGNlcnR5ZmlrYXRlbSBkcnVnaWVqIHN0cm9ueSBpZ25vcnVqxIVjIMWCYcWEY3VjaCBccy0xQ0FcczAKKy5JUCAiXGZJZG9tecWbbG5pZVxmUiIgNAorLklYIEl0ZW0gImRvbXnFm2xuaWUiCituaWUgd2VyeWZpa3VqCisuUkUKKy5SUyA0CisuUkUKKy5TSCAiWldSQUNBTkEgV0FSVE/FmsSGIgorLklYIEhlYWRlciAiWldSQUNBTkEgV0FSVE/FmsSGIgorXCZcZkJzdHVubmVsXGZSIHp3cmFjYSB6ZXJvIHcgcHJ6eXBhZGt1IHN1a2Nlc3UsIGx1YiB3YXJ0b8WbxIcgbmllemVyb3fEhQordyBwcnp5cGFka3UgYsWCxJlkdS4KKy5TSCAiU0lHTkHFgVkiCisuSVggSGVhZGVyICJTSUdOQcWBWSIKK05hc3TEmXB1asSFY2Ugc3lnbmHFgnkgbW9nxIUgYnnEhyB1xbx5dGUgZG8gc3Rlcm93YW5pYSBwcm9ncmFtZW0gdyBzeXN0ZW1pZSBVbml4OgorLklQICJccy0xU0lHSFVQXHMwIiA0CisuSVggSXRlbSAiU0lHSFVQIgorWmHFgmFkdWogcG9ub3duaWUgcGxpayBrb25maWd1cmFjeWpueS4KKy5TcAorTmlla3TDs3JlIGdsb2JhbG5lIG9wY2plIG5pZSBixJlkxIUgcHJ6ZcWCYWRvd2FuZToKKy5SUyA0CisuSVAgIlwoYnUiIDQKK2Nocm9vdAorLklQICJcKGJ1IiA0Citmb3JlZ3JvdW5kCisuSVAgIlwoYnUiIDQKK3BpZAorLklQICJcKGJ1IiA0CitzZXRnaWQKKy5JUCAiXChidSIgNAorc2V0dWlkCisuUkUKKy5SUyA0CisuU3AKK0plxbxlbGkgd3lrb3J6eXN0eXdhbmEgamVzdCBvcGNqYSAnc2V0dWlkJyBcZkJzdHVubmVsXGZSIG5pZSBixJlkemllIG3Ds2fFgiB6YcWCYWRvd2HEhworcG9ub3duaWUga29uZmlndXJhY2ppIHd5a29yenlzdHVqxIVjZWogdXByenl3aWxlam93YW5lICg8MTAyNCkgcG9ydHkuCisuU3AKK0plxbxlbGkgd3lrb3J6eXN0eXdhbmEgamVzdCBvcGNqYSAnY2hyb290JyBcZkJzdHVubmVsXGZSIGLEmWR6aWUgc3p1a2HFgiB3c3p5c3RraWNoCitwb3RyemVibnljaCBwbGlrw7N3ICjFgsSFY3puaWUgeiBwbGlraWVtIGtvbmZpZ3VyYWN5am55bSwgY2VydHlmaWthdGFtaSwgbG9naWVtIGkKK3BsaWtpZW0gcGlkKSB3ZXduxIV0cnoga2F0YWxvZ3Ugd3NrYXphbmVnbyBwcnpleiAnY2hyb290Jy4KKy5SRQorLklQICJccy0xU0lHVVNSMVxzMCIgNAorLklYIEl0ZW0gIlNJR1VTUjEiCitaYW1rbmlqIGkgb3R3w7NyeiBwb25vd25pZSBsb2cuCitGdW5rY2phIHRhIG1vxbxlIHpvc3RhxIcgdcW8eXRhIHcgc2tyeXBjaWUgcm90dWrEhWN5bSBsb2cgcHJvZ3JhbXUgXGZCc3R1bm5lbFxmUi4KKy5JUCAiXHMtMVNJR1RFUk0sIFNJR1FVSVQsIFNJR0lOVFxzMCIgNAorLklYIEl0ZW0gIlNJR1RFUk0sIFNJR1FVSVQsIFNJR0lOVCIKK1pha2/FhGN6IGR6aWHFgmFuaWUgcHJvZ3JhbXUuCisuUFAKK1NrdXRlayB3eXPFgmFuaWEgaW5ueWNoIHN5Z25hxYLDs3cgamVzdCBuaWV6ZGVmaW5pb3dhbnkuCisuU0ggIlBSWllLxYFBRFkiCisuSVggSGVhZGVyICJQUlpZS8WBQURZIgorU3p5ZnJvd2FuaWUgcG/FgsSFY3plxYQgZG8gbG9rYWxuZWdvIHNlcndlcmEgXGZJaW1hcGRcZlIgbW/FvG5hIHXFvHnEhzoKKy5QUAorLlZiIDQKK1wmICAgIFtpbWFwZF0KK1wmICAgIGFjY2VwdCA9IDk5MworXCYgICAgZXhlYyA9IC91c3Ivc2Jpbi9pbWFwZAorXCYgICAgZXhlY0FyZ3MgPSBpbWFwZAorLlZlCisuUFAKK2FsYm8gdyB0cnliaWUgemRhbG55bToKKy5QUAorLlZiIDMKK1wmICAgIFtpbWFwZF0KK1wmICAgIGFjY2VwdCA9IDk5MworXCYgICAgY29ubmVjdCA9IDE0MworLlZlCisuUFAKK0FieSB1bW/FvGxpd2nEhyBsb2thbG5lbXUga2xpZW50b3dpIHBvY3p0eSBlbGVrdHJvbmljem5laiBrb3J6eXN0YW5pZSB6IHNlcndlcmEKK1wmXGZJaW1hcGRcZlIgcHJ6ZXogXHMtMVNTTFxzMCBuYWxlxbx5IHNrb25maWd1cm93YcSHIHBvYmllcmFuaWUgcG9jenR5IHogYWRyZXN1IGxvY2FsaG9zdCBpCitwb3J0dSAxMTksIG9yYXogdcW8ecSHIG5hc3TEmXB1asSFY2VqIGtvbmZpZ3VyYWNqaToKKy5QUAorLlZiIDQKK1wmICAgIFtpbWFwXQorXCYgICAgY2xpZW50ID0geWVzCitcJiAgICBhY2NlcHQgPSAxNDMKK1wmICAgIGNvbm5lY3QgPSBzZXJ3ZXI6OTkzCisuVmUKKy5QUAorVyBwb8WCxIVjemVuaXUgeiBwcm9ncmFtZW0gXGZJcHBwZFxmUiBcZkJzdHVubmVsXGZSIHBvendhbGEgemVzdGF3acSHIHByb3N0eSBccy0xVlBOLlxzMAorUG8gc3Ryb25pZSBzZXJ3ZXJhIG5hc8WCdWNodWrEhWNlZ28gbmEgcG9yY2llIDIwMjAgamVnbyBrb25maWd1cmFjamEKK21vxbxlIHd5Z2zEhWRhxIcgbmFzdMSZcHVqxIVjbzoKKy5QUAorLlZiIDUKK1wmICAgIFt2cG5dCitcJiAgICBhY2NlcHQgPSAyMDIwCitcJiAgICBleGVjID0gL3Vzci9zYmluL3BwcGQKK1wmICAgIGV4ZWNBcmdzID0gcHBwZCBsb2NhbAorXCYgICAgcHR5ID0geWVzCisuVmUKKy5QUAorUG9uacW8c3p5IHBsaWsga29uZmlndXJhY3lqbnkgbW/FvGUgYnnEhyB3eWtvcnp5c3RhbnkgZG8gdXJ1Y2hvbWllbmlhCitwcm9ncmFtdSBcZkJzdHVubmVsXGZSIHcgdHJ5YmllIFxmSWluZXRkXGZSLiAgV2FydG8gemF1d2HFvHnEhywgxbxlIHcgcGxpa3UKK2tvbmZpZ3VyYWN5am55bSBuaWUgbWEgc2VrY2ppIFxmSVtuYXp3YV91c8WCdWdpXVxmUi4KKy5QUAorLlZiIDIKK1wmICAgIGV4ZWMgPSAvdXNyL3NiaW4vaW1hcGQKK1wmICAgIGV4ZWNBcmdzID0gaW1hcGQKKy5WZQorLlBQCitBYnkgc2tvbmZpZ3Vyb3dhxIcgXHMtMVZQTlxzMCBtb8W8bmEgdcW8ecSHIG5hc3TEmXB1asSFY2VqIGtvbmZpZ3VyYWNqaSBrbGllbnRhOgorLlBQCisuVmIgNgorXCYgICAgW3NvY2tzX2NsaWVudF0KK1wmICAgIGNsaWVudCA9IHllcworXCYgICAgYWNjZXB0ID0gMTI3LjAuMC4xOjEwODAKK1wmICAgIGNvbm5lY3QgPSB2cG5fc2VydmVyOjkwODAKK1wmICAgIHZlcmlmeSA9IDQKK1wmICAgIENBZmlsZSA9IHN0dW5uZWwucGVtCisuVmUKKy5QUAorT2Rwb3dpYWRhasSFY2EgamVqIGtvbmZpZ3VyYWNqYSBzZXJ3ZXJhIHZwbl9zZXJ2ZXI6CisuUFAKKy5WYiA1CitcJiAgICBbc29ja3Nfc2VydmVyXQorXCYgICAgcHJvdG9jb2wgPSBzb2NrcworXCYgICAgYWNjZXB0ID0gOTA4MAorXCYgICAgY2VydCA9IHN0dW5uZWwucGVtCitcJiAgICBrZXkgPSBzdHVubmVsLmtleQorLlZlCisuUFAKK0RvIHByemV0ZXN0b3dhbmlhIGtvbmZpZ3VyYWNqaSBtb8W8bmEgd3lkYcSHIG5hIG1hc3p5bmllIGtsaWVuY2tpZWoga29tZW5kxJk6CisuUFAKKy5WYiAxCitcJiAgICBjdXJsIFwtXC1zb2NrczRhIGxvY2FsaG9zdCBodHRwOi8vd3d3LmV4YW1wbGUuY29tLworLlZlCisuU0ggIk5PVEtJIgorLklYIEhlYWRlciAiTk9US0kiCisuU1MgIlxzLTFPR1JBTklDWkVOSUFcczAiCisuSVggU3Vic2VjdGlvbiAiT0dSQU5JQ1pFTklBIgorXCZcZkJzdHVubmVsXGZSIG5pZSBtb8W8ZSBiecSHIHXFvHl3YW55IGRvIHN6eWZyb3dhbmlhIHByb3Rva2/FgnUgXGZJXHMtMUZUUFxzMFxmUiwKK3Bvbmlld2HFvCBkbyBwcnplc3nFgmFuaWEgcG9zemN6ZWfDs2xueWNoIHBsaWvDs3cgdcW8eXdhIG9uIGRvZGF0a293eWNoCitwb8WCxIVjemXFhCBvdHdpZXJhbnljaCBuYSBwb3J0YWNoIG8gZHluYW1pY3puaWUgcHJ6eWR6aWVsYW55Y2ggbnVtZXJhY2guCitJc3RuaWVqxIUgamVkbmFrIHNwZWNqYWxuZSB3ZXJzamUga2xpZW50w7N3IGkgc2Vyd2Vyw7N3IFxzLTFGVFBcczAgcG96d2FsYWrEhWNlCituYSBzenlmcm93YW5pZSBwcnplc3nFgmFueWNoIGRhbnljaCBwcnp5IHBvbW9jeSBwcm90b2tvxYJ1IFxmSVxzLTFTU0xcczBcZlIuCisuU1MgIlxzLTFUUllCIElORVREIFxzMCh0eWxrbyBVbml4KSIKKy5JWCBTdWJzZWN0aW9uICJUUllCIElORVREICh0eWxrbyBVbml4KSIKK1cgd2nEmWtzem/Fm2NpIHphc3Rvc293YcWEIFxmQnN0dW5uZWxcZlIgc2Ftb2R6aWVsbmllIG5hc8WCdWNodWplIG5hIHBvcmNpZQorcG9kYW55bSB3IHBsaWt1IGtvbmZpZ3VyYWN5am55bSBpIHR3b3J6eSBwb8WCxIVjemVuaWUgeiBpbm55bSBwb3J0ZW0KK3BvZGFueW0gdyBvcGNqaSBcZkljb25uZWN0XGZSIGx1YiBub3d5bSBwcm9ncmFtZW0gcG9kYW55bSB3IG9wY2ppIFxmSWV4ZWNcZlIuCitOaWVrdMOzcnp5IHdvbMSFIGplZG5hayB3eWtvcnp5c3R5d2HEhyBvZGR6aWVsbnkgcHJvZ3JhbSwga3TDs3J5IG9kYmllcmEKK3BvxYLEhWN6ZW5pYSwgcG8gY3p5bSB1cnVjaGFtaWEgcHJvZ3JhbSBcZkJzdHVubmVsXGZSLiAgUHJ6eWvFgmFkYW1pIHRha2ljaAorcHJvZ3JhbcOzdyBzxIUgaW5ldGQsIHhpbmV0ZCBpIHRjcHNlcnZlci4KKy5QUAorUHJ6eWvFgmFkb3dhIGxpbmlhIHBsaWt1IC9ldGMvaW5ldGQuY29uZiBtb8W8ZSB3eWdsxIVkYcSHIHRhazoKKy5QUAorLlZiIDIKK1wmICAgIGltYXBzIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgQGJpbmRpckAvc3R1bm5lbAorXCYgICAgICAgIHN0dW5uZWwgQHN5c2NvbmZkaXJAL3N0dW5uZWwvaW1hcHMuY29uZgorLlZlCisuUFAKK1Bvbmlld2HFvCB3IHRha2ljaCBwcnp5cGFka2FjaCBwb8WCxIVjemVuaWUgbmEgemRlZmluaW93YW55bSBwb3JjaWUKKyh0dXRhaiBcZklpbWFwc1xmUikgbmF3acSFenVqZSBvc29ibnkgcHJvZ3JhbSAodHV0YWogXGZJaW5ldGRcZlIpLCBcZkJzdHVubmVsXGZSCituaWUgbW/FvGUgdcW8eXdhxIcgb3BjamkgXGZJYWNjZXB0XGZSLiAgVyBwbGlrdSBrb25maWd1cmFjeWpueW0gbmllIG1vxbxlCitiecSHIHLDs3duaWXFvCB6ZGVmaW5pb3dhbmEgxbxhZG5hIHVzxYJ1Z2EgKFxmSVtuYXp3YV91c8WCdWdpXVxmUiksIHBvbmlld2HFvAora29uZmlndXJhY2phIHRha2EgcG96d2FsYSBuYSBuYXdpxIV6YW5pZSB0eWxrbyBqZWRuZWdvIHBvxYLEhWN6ZW5pYS4KK1dzenlzdGtpZSBcZklccy0xT1BDSkVcczAgVVPFgVVHXGZSIHBvd2lubnkgYnnEhyB1bWllc3pjem9uZSByYXplbSB6IG9wY2phbWkKK2dsb2JhbG55bWkuICBQcnp5a8WCYWQgdGFraWVqIGtvbmZpZ3VyYWNqaSB6bmFqZHVqZSBzacSZIHcgc2VrY2ppCitcJlxmSVBSWllLxYFBRFlcZlIuCisuU1MgIlxzLTFDRVJUWUZJS0FUWVxzMCIKKy5JWCBTdWJzZWN0aW9uICJDRVJUWUZJS0FUWSIKK1Byb3Rva8OzxYIgXHMtMVNTTFxzMCB3eW1hZ2EsIGFieSBrYcW8ZHkgc2Vyd2VyIHByemVkc3Rhd2lhxYIgc2nEmSBuYXdpxIV6dWrEhWNlbXUKK3BvxYLEhWN6ZW5pZSBrbGllbnRvd2kgcHJhd2lkxYJvd3ltIGNlcnR5ZmlrYXRlbSBYLjUwOS4KK1BvdHdpZXJkemVuaWUgdG/FvHNhbW/Fm2NpIHNlcndlcmEgcG9sZWdhIG5hIHd5a2F6YW5pdSwgxbxlIHBvc2lhZGEgb24KK29kcG93aWFkYWrEhWN5IGNlcnR5ZmlrYXRvd2kga2x1Y3ogcHJ5d2F0bnkuCitOYWpwcm9zdHN6xIUgbWV0b2TEhSB1enlza2FuaWEgY2VydHlmaWthdHUgamVzdCB3eWdlbmVyb3dhbmllIGdvIHByenkgcG9tb2N5Cit3b2xuZWdvIHBha2lldHUgXGZCT3BlblNTTFxmUi4gIFdpxJljZWogaW5mb3JtYWNqaSBuYSB0ZW1hdCBnZW5lcm93YW5pYQorY2VydHlmaWthdMOzdyBtb8W8bmEgem5hbGXFusSHIG5hIHVtaWVzemN6b255Y2ggcG9uacW8ZWogc3Ryb25hY2guCisuUFAKK0lzdG90bsSFIGt3ZXN0acSFIGplc3Qga29sZWpub8WbxIcgemF3YXJ0b8WbY2kgcGxpa3UgXGZJLnBlbVxmUi4KK1cgcGllcndzemVqIGtvbGVqbm/Fm2NpIHBvd2luaWVuIG9uIHphd2llcmHEhyBrbHVjeiBwcnl3YXRueSwKK2EgZG9waWVybyB6YSBuaW0gcG9kcGlzYW55IGNlcnR5ZmlrYXQgKG5pZSDFvMSFZGFuaWUgY2VydHlmaWthdHUpLgorUG8gY2VydHlmaWthY2llIGkga2x1Y3p1IHByeXdhdG55bSBwb3dpbm55IHpuYWpkb3dhxIcgc2nEmSBwdXN0ZSBsaW5pZS4KK0plxbxlbGkgcHJ6ZWQgY2VydHlmaWthdGVtIHpuYWpkdWrEhSBzacSZIGRvZGF0a293ZSBpbmZvcm1hY2plIHRla3N0b3dlLAordG8gcG93aW5ueSBvbmUgem9zdGHEhyB1c3VuacSZdGUuICBPdHJ6eW1hbnkgcGxpayBwb3dpbmllbiBtaWXEhworbmFzdMSZcHVqxIVjxIUgcG9zdGHEhzoKKy5QUAorLlZiIDgKK1wmICAgIFwtXC1cLVwtXC1CRUdJTiBSU0EgUFJJVkFURSBLRVlcLVwtXC1cLVwtCitcJiAgICBbemFrb2Rvd2FueSBrbHVjel0KK1wmICAgIFwtXC1cLVwtXC1FTkQgUlNBIFBSSVZBVEUgS0VZXC1cLVwtXC1cLQorXCYgICAgW3B1c3RhIGxpbmlhXQorXCYgICAgXC1cLVwtXC1cLUJFR0lOIENFUlRJRklDQVRFXC1cLVwtXC1cLQorXCYgICAgW3pha29kb3dhbnkgY2VydHlmaWthdF0KK1wmICAgIFwtXC1cLVwtXC1FTkQgQ0VSVElGSUNBVEVcLVwtXC1cLVwtCitcJiAgICBbcHVzdGEgbGluaWFdCisuVmUKKy5TUyAiTE9TT1dPxZrEhiIKKy5JWCBTdWJzZWN0aW9uICJMT1NPV0/FmsSGIgorXCZcZkJzdHVubmVsXGZSIHBvdHJ6ZWJ1amUgemFpbmljam93YcSHIFxzLTFQUk5HIFxzMChnZW5lcmF0b3IgbGljemIgcHNldWRvbG9zb3d5Y2gpLAorZ2R5xbwgcHJvdG9rw7PFgiBccy0xU1NMXHMwIHd5bWFnYSBkbyBiZXpwaWVjemXFhHN0d2Ega3J5cHRvZ3JhZmljem5lZ28gxbpyw7NkxYJhCitkb2JyZWogbG9zb3dvxZtjaS4gIE5hc3TEmXB1asSFY2Ugxbpyw7NkxYJhIHPEhSBrb2xlam5vIG9kY3p5dHl3YW5lIGHFvCBkbwordXp5c2thbmlhICB3eXN0YXJjemFqxIVjZWogaWxvxZtjaSBlbnRyb3BpaToKKy5JUCAiXChidSIgNAorWmF3YXJ0b8WbxIcgcGxpa3UgcG9kYW5lZ28gdyBvcGNqaSBcZklSTkRmaWxlXGZSLgorLklQICJcKGJ1IiA0CitaYXdhcnRvxZvEhyBwbGlrdSBvIG5hendpZSBva3JlxZtsb25laiBwcnpleiB6bWllbm7EhSDFm3JvZG93aXNrb3fEhQorXCZccy0xUkFOREZJTEUsXHMwIG8gaWxlIGplc3Qgb25hIHVzdGF3aW9uYS4KKy5JUCAiXChidSIgNAorUGxpayAucm5kIHVtaWVzemN6b255IHcga2F0YWxvZ3UgZG9tb3d5bSB1xbx5dGtvd25pa2EsCitqZcW8ZWxpIHptaWVubmEgXHMtMVJBTkRGSUxFXHMwIG5pZSBqZXN0IHVzdGF3aW9uYS4KKy5JUCAiXChidSIgNAorUGxpayBwb2RhbnkgdyBvcGNqaSAnXC1cLXdpdGhcLXJhbmRvbScgdyBjemFzaWUga29uZmlndXJhY2ppIHByb2dyYW11LgorLklQICJcKGJ1IiA0CitaYXdhcnRvxZvEhyBla3JhbnUgdyBzeXN0ZW1pZSBXaW5kb3dzLgorLklQICJcKGJ1IiA0CitHbmlhemRvIGVnZCwgamXFvGVsaSB1xbx5dGEgem9zdGHFgmEgb3BjamEgXGZJXHMtMUVHRFxzMFxmUi4KKy5JUCAiXChidSIgNAorR25pYXpkbyBlZ2QgcG9kYW5lIHcgb3BjamkgJ1wtXC13aXRoXC1lZ2RcLXNvY2tldCcgdyBjemFzaWUga29uZmlndXJhY2ppCitwcm9ncmFtdS4KKy5JUCAiXChidSIgNAorVXJ6xIVkemVuaWUgL2Rldi91cmFuZG9tLgorLlBQCitXc3DDs8WCY3plc25lIChcZkIwLjkuNWFcZlIgbHViIG5vd3N6ZSkgd2Vyc2plIGJpYmxpb3Rla2kgXGZCT3BlblNTTFxmUiBhdXRvbWF0eWN6bmllCit6YXByemVzdGFqxIUgxYJhZG93YW5pYSBrb2xlam55Y2ggZGFueWNoIHcgbW9tZW5jaWUgdXp5c2thbmlhIHd5c3RhcmN6YWrEhWNlagoraWxvxZtjaSBlbnRyb3BpaS4gIFdjemXFm25pZWpzemUgd2Vyc2plIGJpYmxpb3Rla2kgd3lrb3J6eXN0YWrEhSB3c3p5c3RraWUKK3Bvd3nFvHN6ZSDFunLDs2TFgmEsIGdkecW8IG5pZSBpc3RuaWVqZSB0YW0gZnVua2NqYSBwb3p3YWxhasSFY2Egb2tyZcWbbGnEhywgY3p5Cit1enlza2FubyBqdcW8IHd5c3RhcmN6YWrEhWNvIGR1xbxvIGRhbnljaC4KKy5QUAorV2FydG8gendyw7NjacSHIHV3YWfEmSwgxbxlIG5hIG1hc3p5bmFjaCB6IHN5c3RlbWVtIFdpbmRvd3MsIG5hIGt0w7NyeWNoCitrb25zb2xpIG5pZSBwcmFjdWplIHXFvHl0a293bmlrLCB6YXdhcnRvxZvEhyBla3JhbnUgbmllIGplc3Qgd3lzdGFyY3phasSFY28KK3ptaWVubmEsIGFieSB6YWluaWNqb3dhxIcgXHMtMVBSTkcuICBXXHMwIHRha2ltIHByenlwYWRrdSBkbyB6YWluaWNqb3dhbmlhCitnZW5lcmF0b3JhIG5hbGXFvHkgdcW8ecSHIG9wY2ppIFxmSVJORGZpbGVcZlIuCisuUFAKK1BsaWsgXGZJUk5EZmlsZVxmUiBwb3dpbmllbiB6YXdpZXJhxIcgZGFuZSBsb3Nvd2UgXCooLS0gcsOzd25pZcW8IHcgdHltIHNlbnNpZSwKK8W8ZSBwb3dpbm55IGJ5xIcgb25lIGlubmUgcHJ6eSBrYcW8ZHltIHVydWNob21pZW5pdSBwcm9ncmFtdSBcZkJzdHVubmVsXGZSLgorTyBpbGUgbmllIHXFvHl0YSB6b3N0YcWCYSBvcGNqYSBcZklSTkRvdmVyd3JpdGVcZlIgamVzdCB0byByb2Jpb25lCithdXRvbWF0eWN6bmllLiAgRG8gcsSZY3puZWdvIHV6eXNrYW5pYSB0YWtpZWdvIHBsaWt1IHXFvHl0ZWN6bmEKK21vxbxlIGJ5xIcga29tZW5kYSBcZklvcGVuc3NsIHJhbmRcZlIgZG9zdGFyY3phbmEgemUgd3Nww7PFgmN6ZXNueW1pCit3ZXJzamFtaSBwYWtpZXR1IFxmQk9wZW5TU0xcZlIuCisuUFAKK0plc3pjemUgamVkbmEgaXN0b3RuYSBpbmZvcm1hY2phIFwqKC0tIGplxbxlbGkgZG9zdMSZcG5lIGplc3QgdXJ6xIVkemVuaWUKK1wmXGZJL2Rldi91cmFuZG9tXGZSIGJpYmxpb3Rla2EgXGZCT3BlblNTTFxmUiBtYSB6d3ljemFqIHphc2lsYW5pYSBuaW0gXHMtMVBSTkdcczAgdyB0cmFrY2llCitzcHJhd2R6YW5pYSBzdGFudSBnZW5lcmF0b3JhLiAgVyBzeXN0ZW1hY2ggeiBcZkkvZGV2L3VyYW5kb21cZlIgdXJ6xIVkemVuaWUKK3RvIGLEmWR6aWUgbmFqcHJhd2RvcG9kb2JuaWVqIHXFvHl0ZSwgcG9taW1vIMW8ZSB6bmFqZHVqZSBzacSZIG5hIHNhbXltIGtvxYRjdQorcG93ecW8c3plaiBsaXN0eS4gIEplc3QgdG8gd8WCYcWbY2l3b8WbxIcgYmlibGlvdGVraSBcZkJPcGVuU1NMXGZSLCBhIG5pZSBwcm9ncmFtdQorXCZcZkJzdHVubmVsXGZSLgorLlNTICJccy0xUEFSQU1FVFJZIERIXHMwIgorLklYIFN1YnNlY3Rpb24gIlBBUkFNRVRSWSBESCIKK1BvY3rEhXdzenkgb2Qgd2Vyc2ppIDQuNDAgXGZCc3R1bm5lbFxmUiB6YXdpZXJhIHcga29kemllIHByb2dyYW11IDIwNDhcLWJpdG93ZQorcGFyYW1ldHJ5IFxzLTFESC4gXHMwIE9kIHdlcnNqaSA1LjE4IHRlIHBvY3rEhXRrb3dlIHdhcnRvxZtjaSBwYXJhbWV0csOzdyBccy0xREhcczAgc8SFCit3eW1pZW5pYW5lIG5hIGF1dG9nZW5lcm93YW5lIHBhcmFtZXRyeSB0eW1jemFzb3dlLgorV3lnZW5lcm93YW5pZSBwYXJhbWV0csOzdyBccy0xREhcczAgbW/FvGUgemFqxIXEhyBuYXdldCB3aWVsZSBtaW51dC4KKy5QUAorQWx0ZXJuYXR5d25pZSBwYXJhbWV0cnkgXHMtMURIXHMwIG1vxbxuYSB1bWllxZtjacSHIHcgcGxpa3UgcmF6ZW0geiBjZXJ0eWZpa2F0ZW0sCitjbyB3ecWCxIVjemEgZ2VuZXJvd2FuaWUgcGFyYW1ldHLDs3cgdHltY3phc293eWNoOgorLlBQCisuVmIgMQorXCYgICAgb3BlbnNzbCBkaHBhcmFtIDIwNDggPj4gc3R1bm5lbC5wZW0KKy5WZQorLlNIICJQTElLSSIKKy5JWCBIZWFkZXIgIlBMSUtJIgorLmllIG4gLklQICJcZklcZklAc3lzY29uZmRpclxmSUAvc3R1bm5lbC9zdHVubmVsLmNvbmZcZlIiIDQKKy5lbCAuSVAgIlxmSVxmKENJQHN5c2NvbmZkaXJcZklAL3N0dW5uZWwvc3R1bm5lbC5jb25mXGZSIiA0CisuSVggSXRlbSAiQHN5c2NvbmZkaXJAL3N0dW5uZWwvc3R1bm5lbC5jb25mIgorcGxpayBrb25maWd1cmFjeWpueSBwcm9ncmFtdQorLlNIICJCxYHEmERZIgorLklYIEhlYWRlciAiQsWBxJhEWSIKK09wY2phIFxmSWV4ZWNBcmdzXGZSIG9yYXogbGluaWEga29tZW5kIFdpbjMyIG5pZSBvYnPFgnVndWplIGN5dG93YW5pYS4KKy5TSCAiWk9CQUNaIFLDk1dOSUXFuyIKKy5JWCBIZWFkZXIgIlpPQkFDWiBSw5NXTklFxbsiCisuSVAgIlxmSXRjcGRcZlJcfCg4KSIgNAorLklYIEl0ZW0gInRjcGQiCitiaWJsaW90ZWthIGtvbnRyb2xpIGRvc3TEmXB1IGRvIHVzxYJ1ZyBpbnRlcm5ldG93eWNoCisuSVAgIlxmSWluZXRkXGZSXHwoOCkiIDQKKy5JWCBJdGVtICJpbmV0ZCIKK1wmJ3N1cGVyXC1zZXJ3ZXInIGludGVybmV0b3d5CisuSVAgIlxmSWh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvXGZSIiA0CisuSVggSXRlbSAiaHR0cDovL3d3dy5zdHVubmVsLm9yZy8iCitzdHJvbmEgZG9tb3dhIHByb2dyYW11IFxmQnN0dW5uZWxcZlIKKy5JUCAiXGZJaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9cZlIiIDQKKy5JWCBJdGVtICJodHRwOi8vd3d3Lm9wZW5zc2wub3JnLyIKK3N0cm9uYSBwcm9qZWt0dSBcZkJPcGVuU1NMXGZSCisuU0ggIkFVVE9SIgorLklYIEhlYWRlciAiQVVUT1IiCisuSVAgIk1pY2hhxYIgVHJvam5hcmEiIDQKKy5JWCBJdGVtICJNaWNoYcWCIFRyb2puYXJhIgorPFxmSU1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldFxmUj4KZGlmZiAtLWdpdCBhL2RvYy9zdHVubmVsLnBsLmh0bWwuaW4gYi9kb2Mvc3R1bm5lbC5wbC5odG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODViNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3R1bm5lbC5wbC5odG1sLmluCkBAIC0wLDAgKzEsMTQ3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8dGl0bGU+c3R1bm5lbCBUTFMgUHJveHk8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Cis8bGluayByZXY9Im1hZGUiIGhyZWY9Im1haWx0bzpyb290QGxvY2FsaG9zdCIgLz4KKzwvaGVhZD4KKworPGJvZHkgaWQ9Il9wb2R0b3BfIj4KKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgorPHRyPjx0ZCBjbGFzcz0iX3BvZGJsb2NrXyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7IGNvbG9yOiAjMDAwIiB2YWxpZ249Im1pZGRsZSI+Cis8YmlnPjxzdHJvbmc+PHNwYW4gY2xhc3M9Il9wb2RibG9ja18iPiZuYnNwO3N0dW5uZWwgVExTIFByb3h5PC9zcGFuPjwvc3Ryb25nPjwvYmlnPgorPC90ZD48L3RyPgorPC90YWJsZT4KKworCisKKzx1bCBpZD0iaW5kZXgiPgorICA8bGk+PGEgaHJlZj0iI05BWldBIj5OQVpXQTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1NLQUROSUEiPlNLJiN4MTQxO0FETklBPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjT1BJUyI+T1BJUzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI09QQ0pFIj5PUENKRTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1BMSUstS09ORklHVVJBQ1lKTlkiPlBMSUsgS09ORklHVVJBQ1lKTlk8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNPUENKRS1HTE9CQUxORSI+T1BDSkUgR0xPQkFMTkU8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjT1BDSkUtVVNVRyI+T1BDSkUgVVMmI3gxNDE7VUc8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iI1pXUkFDQU5BLVdBUlRPIj5aV1JBQ0FOQSBXQVJUTyYjeDE1QTsmI3gxMDY7PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjU0lHTkFZIj5TSUdOQSYjeDE0MTtZPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjUFJaWUtBRFkiPlBSWllLJiN4MTQxO0FEWTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI05PVEtJIj5OT1RLSTwvYT4KKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI09HUkFOSUNaRU5JQSI+T0dSQU5JQ1pFTklBPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1RSWUItSU5FVEQtdHlsa28tVW5peCI+VFJZQiBJTkVURCAodHlsa28gVW5peCk8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjQ0VSVFlGSUtBVFkiPkNFUlRZRklLQVRZPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0xPU09XTyI+TE9TT1dPJiN4MTVBOyYjeDEwNjs8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjUEFSQU1FVFJZLURIIj5QQVJBTUVUUlkgREg8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iI1BMSUtJIj5QTElLSTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0JEWSI+QiYjeDE0MTsmI3gxMTg7RFk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNaT0JBQ1otUldOSUUiPlpPQkFDWiBSJk9hY3V0ZTtXTklFJiN4MTdCOzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0FVVE9SIj5BVVRPUjwvYT48L2xpPgorPC91bD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9Ik5BWldBIj5OQVpXQTwvaDE+PC9hPgorCis8cD5zdHVubmVsIC0gdW5pd2Vyc2FsbnkgdHVuZWwgcHJvdG9rbyYjeDE0Mjt1IFNTTDwvcD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IlNLQUROSUEiPlNLJiN4MTQxO0FETklBPC9oMT48L2E+CisKKzxkbD4KKworPGR0IGlkPSJVbml4Ij48Yj5Vbml4OjwvYj48L2R0PgorPGRkPgorCis8cD48Yj5zdHVubmVsPC9iPiBbPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij5QTElLPC9zcGFuPl0gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1mZCBOPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LWhlbHA8L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tdmVyc2lvbjwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1zb2NrZXRzPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LW9wdGlvbnM8L3NwYW4+PC9wPgorCis8L2RkPgorPGR0IGlkPSJXSU4zMiI+PGI+V0lOMzI6PC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPjxiPnN0dW5uZWw8L2I+IFsgWyA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1pbnN0YWxsPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LXVuaW5zdGFsbDwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1zdGFydDwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1zdG9wPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LXJlbG9hZDwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1yZW9wZW48L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tZXhpdDwvc3Bhbj4gXSBbPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tcXVpZXQ8L3NwYW4+XSBbPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij5QTElLPC9zcGFuPl0gXSB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LWhlbHA8L3NwYW4+IHwgPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4tdmVyc2lvbjwvc3Bhbj4gfCA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPi1zb2NrZXRzPC9zcGFuPiB8IDxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+LW9wdGlvbnM8L3NwYW4+PC9wPgorCis8L2RkPgorPC9kbD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9Ik9QSVMiPk9QSVM8L2gxPjwvYT4KKworPHA+UHJvZ3JhbSA8Yj5zdHVubmVsPC9iPiB6b3N0YSYjeDE0MjsgemFwcm9qZWt0b3dhbnkgZG8gb3Bha293eXdhbmlhIHcgcHJvdG9rJm9hY3V0ZTsmI3gxNDI7IDxpPlNTTDwvaT4gcG8mI3gxNDI7JiN4MTA1O2N6ZSYjeDE0NDsgcG9taSYjeDExOTtkenkgemRhbG55bWkga2xpZW50YW1pIGEgbG9rYWxueW1pIGx1YiB6ZGFsbnltaSBzZXJ3ZXJhbWkuIFByemV6IHNlcndlciBsb2thbG55IHJvenVtaWFuYSBqZXN0IGFwbGlrYWNqYSBwcnplem5hY3pvbmEgZG8gdXJ1Y2hhbWlhbmlhIHByenkgcG9tb2N5IDxpPmluZXRkPC9pPi4gU3R1bm5lbCBwb3p3YWxhIG5hIHByb3N0ZSB6ZXN0YXdpZW5pZSBrb211bmlrYWNqaSBzZXJ3ZXImb2FjdXRlO3cgbmllIHBvc2lhZGFqJiN4MTA1O2N5Y2ggZnVua2Nqb25hbG5vJiN4MTVCO2NpIDxpPlNTTDwvaT4gcG9wcnpleiBiZXpwaWVjem5lIGthbmEmI3gxNDI7eSA8aT5TU0w8L2k+LjwvcD4KKworPHA+PGI+c3R1bm5lbDwvYj4gcG96d2FsYSBkb2RhJiN4MTA3OyBmdW5rY2pvbmFsbm8mI3gxNUI7JiN4MTA3OyA8aT5TU0w8L2k+IGRvIHBvd3N6ZWNobmllIHN0b3Nvd2FueWNoIGRlbW9uJm9hY3V0ZTt3IDxpPmluZXRkPC9pPiwgbnAuIDxpPnBvcDM8L2k+IGx1YiA8aT5pbWFwPC9pPiwgZG8gc2Ftb2R6aWVsbnljaCBkZW1vbiZvYWN1dGU7dywgbnAuIDxpPm5udHA8L2k+LCA8aT5zbXRwPC9pPiBsdWIgPGk+aHR0cDwvaT4sIGEgbmF3ZXQgdHVuZWxvd2EmI3gxMDc7IHBwcCBwb3ByemV6IGduaWF6ZGEgc2llY2lvd2UgYmV6IHptaWFuIHcga29kemllICYjeDE3QTtyJm9hY3V0ZTtkJiN4MTQyO293eW0uPC9wPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iT1BDSkUiPk9QQ0pFPC9oMT48L2E+CisKKzxkbD4KKworPGR0IGlkPSJQTElLIj48Yj5QTElLPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPnUmI3gxN0M7eWogcG9kYW5lZ28gcGxpa3Uga29uZmlndXJhY3lqbmVnbzwvcD4KKworPC9kZD4KKzxkdCBpZD0iZmQtTi10eWxrby1Vbml4Ij48Yj4tZmQgTjwvYj4gKHR5bGtvIFVuaXgpPC9kdD4KKzxkZD4KKworPHA+d2N6eXRhaiBrb25maWd1cmFjaiYjeDExOTsgeiBwb2RhbmVnbyBkZXNrcnlwdG9yYSBwbGlrdTwvcD4KKworPC9kZD4KKzxkdCBpZD0iaGVscCI+PGI+LWhlbHA8L2I+PC9kdD4KKzxkZD4KKworPHA+ZHJ1a3VqIGxpc3QmI3gxMTk7IHdzcGllcmFueWNoIG9wY2ppPC9wPgorCis8L2RkPgorPGR0IGlkPSJ2ZXJzaW9uIj48Yj4tdmVyc2lvbjwvYj48L2R0PgorPGRkPgorCis8cD5kcnVrdWogd2Vyc2omI3gxMTk7IHByb2dyYW11IGkgZG9teSYjeDE1QjtsbmUgd2FydG8mI3gxNUI7Y2kgcGFyYW1ldHImb2FjdXRlO3c8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNvY2tldHMiPjxiPi1zb2NrZXRzPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPmRydWt1aiBkb215JiN4MTVCO2xuZSBvcGNqZSBnbmlhemQ8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im9wdGlvbnMiPjxiPi1vcHRpb25zPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPmRydWt1aiB3c3BpZXJhbmUgb3BjamUgU1NMPC9wPgorCis8L2RkPgorPGR0IGlkPSJpbnN0YWxsLXR5bGtvLVdpbmRvd3MtTlQtbHViLW5vd3N6eSI+PGI+LWluc3RhbGw8L2I+ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpPC9kdD4KKzxkZD4KKworPHA+aW5zdGFsdWogc2Vyd2lzIE5UPC9wPgorCis8L2RkPgorPGR0IGlkPSJ1bmluc3RhbGwtdHlsa28tV2luZG93cy1OVC1sdWItbm93c3p5Ij48Yj4tdW5pbnN0YWxsPC9iPiAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KTwvZHQ+Cis8ZGQ+CisKKzxwPm9kaW5zdGFsdWogc2Vyd2lzIE5UPC9wPgorCis8L2RkPgorPGR0IGlkPSJzdGFydC10eWxrby1XaW5kb3dzLU5ULWx1Yi1ub3dzenkiPjxiPi1zdGFydDwvYj4gKHR5bGtvIFdpbmRvd3MgTlQgbHViIG5vd3N6eSk8L2R0PgorPGRkPgorCis8cD51cnVjaG9tIHNlcndpcyBOVDwvcD4KKworPC9kZD4KKzxkdCBpZD0ic3RvcC10eWxrby1XaW5kb3dzLU5ULWx1Yi1ub3dzenkiPjxiPi1zdG9wPC9iPiAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KTwvZHQ+Cis8ZGQ+CisKKzxwPnphdHJ6eW1haiBzZXJ3aXMgTlQ8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InJlbG9hZC10eWxrby1XaW5kb3dzLU5ULWx1Yi1ub3dzenkiPjxiPi1yZWxvYWQ8L2I+ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpPC9kdD4KKzxkZD4KKworPHA+cHJ6ZSYjeDE0MjthZHVqIHBsaWsga29uZmlndXJhY3lqbnkgdXJ1Y2hvbWlvbmVnbyBzZXJ3aXN1IE5UPC9wPgorCis8L2RkPgorPGR0IGlkPSJyZW9wZW4tdHlsa28tV2luZG93cy1OVC1sdWItbm93c3p5Ij48Yj4tcmVvcGVuPC9iPiAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KTwvZHQ+Cis8ZGQ+CisKKzxwPm90dyZvYWN1dGU7cnogcG9ub3duaWUgbG9nIHVydWNob21pb25lZ28gc2Vyd2lzdSBOVDwvcD4KKworPC9kZD4KKzxkdCBpZD0iZXhpdC10eWxrby1XaW4zMiI+PGI+LWV4aXQ8L2I+ICh0eWxrbyBXaW4zMik8L2R0PgorPGRkPgorCis8cD56YXRyenltYWogdXJ1Y2hvbWlvbnkgcHJvZ3JhbTwvcD4KKworPC9kZD4KKzxkdCBpZD0icXVpZXQtdHlsa28tV2luMzIiPjxiPi1xdWlldDwvYj4gKHR5bGtvIFdpbjMyKTwvZHQ+Cis8ZGQ+CisKKzxwPm5pZSB3eSYjeDE1Qjt3aWV0bGFqIG9raWVuZWsgeiBrb211bmlrYXRhbWk8L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iUExJSy1LT05GSUdVUkFDWUpOWSI+UExJSyBLT05GSUdVUkFDWUpOWTwvaDE+PC9hPgorCis8cD5MaW5pYSB3IHBsaWt1IGtvbmZpZ3VyYWN5am55bSBtbyYjeDE3QztlIGJ5JiN4MTA3Ozo8L3A+CisKKzx1bD4KKworPGxpPjxwPnB1c3RhIChpZ25vcm93YW5hKTwvcD4KKworPC9saT4KKzxsaT48cD5rb21lbnRhcnplbSByb3pwb2N6eW5haiYjeDEwNTtjeW0gc2kmI3gxMTk7IHpuYWtpZW0gJiMzOTs7JiMzOTsgKGlnbm9yb3dhbmEpPC9wPgorCis8L2xpPgorPGxpPjxwPnBhciYjeDEwNTsgJiMzOTtuYXp3YV9vcGNqaSA9IHdhcnRvJiN4MTVCOyYjeDEwNztfb3BjamkmIzM5OzwvcD4KKworPC9saT4KKzxsaT48cD50ZWtzdGVtICYjMzk7W25hendhX3VzJiN4MTQyO3VnaV0mIzM5OyB3c2thenVqJiN4MTA1O2N5bSBwb2N6JiN4MTA1O3RlayBkZWZpbmljamkgdXMmI3gxNDI7dWdpPC9wPgorCis8L2xpPgorPC91bD4KKworPHA+UGFyYW1ldHIgYWRyZXMgbW8mI3gxN0M7ZSBieSYjeDEwNzs6PC9wPgorCis8dWw+CisKKzxsaT48cD5udW1lcmVtIHBvcnR1PC9wPgorCis8L2xpPgorPGxpPjxwPm9kZHppZWxvbiYjeDEwNTsgJiN4MTVCO3JlZG5pa2llbSBwYXImI3gxMDU7IGFkcmVzdSAoSVB2NCwgSVB2NiwgbHViIG5hencmI3gxMDU7IGRvbWVub3cmI3gxMDU7KSBpIG51bWVydSBwb3J0dTwvcD4KKworPC9saT4KKzxsaT48cD4mI3gxNUI7Y2llJiN4MTdDO2smI3gxMDU7IGRvIGduaWF6ZGEgVW5peCAodHlsa28gVW5peCk8L3A+CisKKzwvbGk+Cis8L3VsPgorCis8aDIgaWQ9Ik9QQ0pFLUdMT0JBTE5FIj5PUENKRSBHTE9CQUxORTwvaDI+CisKKzxkbD4KKworPGR0IGlkPSJjaHJvb3QtS0FUQUxPRy10eWxrby1Vbml4Ij48Yj5jaHJvb3Q8L2I+ID0gS0FUQUxPRyAodHlsa28gVW5peCk8L2R0PgorPGRkPgorCis8cD5rYXRhbG9nIHJvYm9jemVnbyBrb3J6ZW5pYSBzeXN0ZW11IHBsaWsmb2FjdXRlO3c8L3A+CisKKzxwPk9wY2phIG9rcmUmI3gxNUI7bGEga2F0YWxvZywgdyBrdCZvYWN1dGU7cnltIHV3aSYjeDExOTt6aW9ueSB6b3N0YW5pZSBwcm9jZXMgcHJvZ3JhbXUgPGI+c3R1bm5lbDwvYj4gdHUmI3gxN0M7IHBvIGplZ28gaW5pY2phbGl6YWNqaSwgYSBwcnplZCByb3pwb2N6JiN4MTE5O2NpZW0gb2RiaWVyYW5pYSBwbyYjeDE0MjsmI3gxMDU7Y3plJiN4MTQ0Oy4gJiN4MTVBO2NpZSYjeDE3QztraSBwb2RhbmUgdyBvcGNqYWNoIDxpPkNBcGF0aDwvaT4sIDxpPkNSTHBhdGg8L2k+LCA8aT5waWQ8L2k+IG9yYXogPGk+ZXhlYzwvaT4gbXVzeiYjeDEwNTsgYnkmI3gxMDc7IHVtaWVzemN6b25lIHdld24mI3gxMDU7dHJ6IGthdGFsb2d1IHBvZGFuZWdvIHcgb3BjamkgPGk+Y2hyb290PC9pPiBpIG9rcmUmI3gxNUI7bG9uZSB3emdsJiN4MTE5O2RlbSB0ZWdvIGthdGFsb2d1LjwvcD4KKworPHA+Tmlla3Qmb2FjdXRlO3JlIGZ1bmtjamUgc3lzdGVtdSBvcGVyYWN5am5lZ28gbW9nJiN4MTA1OyB3eW1hZ2EmI3gxMDc7IGRvZGF0a293eWNoIHBsaWsmb2FjdXRlO3cgdW1pZXN6Y3pvbnljaCB3IGthdGFsb2d1IHBvZGFuZWdvIHcgcGFyYW1ldHJ6ZSBjaHJvb3Q6PC9wPgorCis8dWw+CisKKzxsaT48cD5vcCZvYWN1dGU7JiN4MTdBO25pb25lIHJvendpbmkmI3gxMTk7Y2llIGFkcmVzJm9hY3V0ZTt3IEROUyB0eXBvd28gd3ltYWdhIC9ldGMvbnNzd2l0Y2guY29uZiBpIC9ldGMvcmVzb2x2LmNvbmY8L3A+CisKKzwvbGk+Cis8bGk+PHA+bG9rYWxpemFjamEgc3RyZWZ5IGN6YXNvd2VqIHcgbG9nYWNoIHd5bWFnYSBwbGlrdSAvZXRjL3RpbWV6b25lPC9wPgorCis8L2xpPgorPGxpPjxwPm5pZWt0Jm9hY3V0ZTtyZSBpbm5lIHBsaWtpIG1vZyYjeDEwNTsgcG90cnplYm93YSYjeDEwNzsgcGxpayZvYWN1dGU7dyB1cnomI3gxMDU7ZHplJiN4MTQ0OywgbnAuIC9kZXYvemVybyBsdWIgL2Rldi9udWxsPC9wPgorCis8L2xpPgorPC91bD4KKworPC9kZD4KKzxkdCBpZD0iY29tcHJlc3Npb24tZGVmbGF0ZS16bGliIj48Yj5jb21wcmVzc2lvbjwvYj4gPSBkZWZsYXRlIHwgemxpYjwvZHQ+Cis8ZGQ+CisKKzxwPnd5YiZvYWN1dGU7ciBhbGdvcnl0bXUga29tcHJlc2ppIHByemVzeSYjeDE0MjthbnljaCBkYW55Y2g8L3A+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogYmV6IGtvbXByZXNqaTwvcD4KKworPHA+QWxnb3J5dG0gZGVmbGF0ZSBqZXN0IHN0YW5kYXJkb3cmI3gxMDU7IG1ldG9kJiN4MTA1OyBrb21wcmVzamkgemdvZG5pZSB6IFJGQyAxOTUxLjwvcD4KKworPHA+S29tcHJlc2phIHpsaWIgemFpbXBsZW1lbnRvd2FuYSB3IDxiPk9wZW5TU0wgMC45Ljg8L2I+IGkgbm93c3p5Y2ggbmllIGplc3Qga29tcGF0eWJpbG5hIGltcGxlbWVudGFjaiYjeDEwNTsgPGI+T3BlblNTTCAwLjkuNzwvYj4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJkZWJ1Zy1QT0RTWVNURU0tLlBPWklPTSI+PGI+ZGVidWc8L2I+ID0gW1BPRFNZU1RFTV0uUE9aSU9NPC9kdD4KKzxkZD4KKworPHA+c3pjemVnJm9hY3V0ZTsmI3gxNDI7b3dvJiN4MTVCOyYjeDEwNzsgbG9nb3dhbmlhPC9wPgorCis8cD5Qb3ppb20gbG9nb3dhbmlhIG1vJiN4MTdDO25hIG9rcmUmI3gxNUI7bGkmI3gxMDc7IHByenkgcG9tb2N5IGplZG5laiB6IG5hencgbHViIGxpY3piOiBlbWVyZyAoMCksIGFsZXJ0ICgxKSwgY3JpdCAoMiksIGVyciAoMyksIHdhcm5pbmcgKDQpLCBub3RpY2UgKDUpLCBpbmZvICg2KSBsdWIgZGVidWcgKDcpLiBaYXBpc3l3YW5lIHMmI3gxMDU7IGtvbXVuaWthdHkgbyBwb3ppb21pZSBuaSYjeDE3QztzenltIChudW1lcnljem5pZSkgbHViIHImb2FjdXRlO3dueW0gcG9kYW5lbXUuIERvIHV6eXNrYW5pYSBuYWp3eSYjeDE3QztzemVnbyBwb3ppb211IHN6Y3plZyZvYWN1dGU7JiN4MTQyO293byYjeDE1QjtjaSBtbyYjeDE3QztuYSB1JiN4MTdDO3kmI3gxMDc7IG9wY2ppIDxpPmRlYnVnID0gZGVidWc8L2k+IGx1YiA8aT5kZWJ1ZyA9IDc8L2k+LiBEb215JiN4MTVCO2xueW0gcG96aW9tZW0gamVzdCBub3RpY2UgKDUpLjwvcD4KKworPHA+TyBpbGUgbmllIHd5c3BlY3lmaWtvd2FubyBwb2RzeXN0ZW11IHUmI3gxN0M7eXR5IGImI3gxMTk7ZHppZSBkb215JiN4MTVCO2xueTogZGFlbW9uLiBQb2RzeXN0ZW15IG5pZSBzJiN4MTA1OyB3c3BpZXJhbmUgcHJ6ZXogcGxhdGZvcm0mI3gxMTk7IFdpbjMyLjwvcD4KKworPHA+V2llbGtvJiN4MTVCOyYjeDEwNzsgbGl0ZXIgamVzdCBpZ25vcm93YW5hIHphciZvYWN1dGU7d25vIGRsYSBwb3ppb211IGphayBwb2RzeXN0ZW11LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iRUdELUNJRUtBX0RPX0VHRC10eWxrby1Vbml4Ij48Yj5FR0Q8L2I+ID0gJiN4MTVBO0NJRSYjeDE3QjtLQV9ET19FR0QgKHR5bGtvIFVuaXgpPC9kdD4KKzxkZD4KKworPHA+JiN4MTVCO2NpZSYjeDE3QztrYSBkbyBnbmlhemRhIHByb2dyYW11IEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbjwvcD4KKworPHA+T3BjamEgcG96d2FsYSBva3JlJiN4MTVCO2xpJiN4MTA3OyAmI3gxNUI7Y2llJiN4MTdDO2smI3gxMTk7IGRvIGduaWF6ZGEgcHJvZ3JhbXUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHUmI3gxN0M7eXdhbmVnbyBkbyB6YWluaWNqYWxpem93YW5pYSBnZW5lcmF0b3JhIGNpJiN4MTA1O2cmb2FjdXRlO3cgcHNldWRvbG9zb3d5Y2ggYmlibGlvdGVraSA8Yj5PcGVuU1NMPC9iPi4gT3BjamEgamVzdCBkb3N0JiN4MTE5O3BuYSB6IGJpYmxpb3RlayYjeDEwNTsgPGI+T3BlblNTTCAwLjkuNWE8L2I+IGx1YiBub3dzeiYjeDEwNTsuPC9wPgorCis8L2RkPgorPGR0IGlkPSJlbmdpbmUtYXV0by1JREVOVFlGSUtBVE9SX1VSWkRaRU5JQSI+PGI+ZW5naW5lPC9iPiA9IGF1dG8gfCBJREVOVFlGSUtBVE9SX1VSWiYjeDEwNDtEWkVOSUE8L2R0PgorPGRkPgorCis8cD53eWImb2FjdXRlO3Igc3ByeiYjeDExOTt0b3dlZ28gdXJ6JiN4MTA1O2R6ZW5pYSBrcnlwdG9ncmFmaWN6bmVnbzwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiBiZXogd3lrb3J6eXN0YW5pYSB1cnomI3gxMDU7ZHplJiN4MTQ0OyBrcnlwdG9ncmFmaWN6bnljaDwvcD4KKworPHA+UHJ6eWsmI3gxNDI7YWRvd2Ega29uZmlndXJhY2phIHVtbyYjeDE3QztsaXdpYWomI3gxMDU7Y2Egb2Rjenl0YW5pZSBrbHVjemEgcHJ5d2F0bmVnbyB6IHVyeiYjeDEwNTtkemVuaWEgemdvZG5lZ28geiBPcGVuU0M6PC9wPgorCis8cHJlPjxjb2RlPiAgICBlbmdpbmU9ZHluYW1pYworICAgIGVuZ2luZUN0cmw9U09fUEFUSDovdXNyL2xpYi9vcGVuc2MvZW5naW5lX3BrY3MxMS5zbworICAgIGVuZ2luZUN0cmw9SUQ6cGtjczExCisgICAgZW5naW5lQ3RybD1MSVNUX0FERDoxCisgICAgZW5naW5lQ3RybD1MT0FECisgICAgZW5naW5lQ3RybD1NT0RVTEVfUEFUSDovdXNyL2xpYi9wa2NzMTEvb3BlbnNjLXBrY3MxMS5zbworICAgIGVuZ2luZUN0cmw9SU5JVAorCisgICAgW3NlcnZpY2VdCisgICAgZW5naW5lTnVtPTEKKyAgICBrZXk9aWRfNDU8L2NvZGU+PC9wcmU+CisKKzwvZGQ+Cis8ZHQgaWQ9ImVuZ2luZUN0cmwtS09NRU5EQS06UEFSQU1FVFIiPjxiPmVuZ2luZUN0cmw8L2I+ID0gS09NRU5EQVs6UEFSQU1FVFJdPC9kdD4KKzxkZD4KKworPHA+a29uZmlndXJhY2phIHVyeiYjeDEwNTtkemVuaWEga3J5cHRvZ3JhZmljem5lZ288L3A+CisKKzxwPlNwZWNqYWxuZSBrb21lbmR5ICZxdW90O0xPQUQmcXVvdDsgaSAmcXVvdDtJTklUJnF1b3Q7IHBvendhbGFqJiN4MTA1OyBuYSB6YSYjeDE0MjthZG93YW5pZSBpIGluaWNqYWxpemFjaiYjeDExOTsgbW9kdSYjeDE0Mjt1IGtyeXB0b2dyYWZpY3puZWdvIHVyeiYjeDEwNTtkemVuaWEuPC9wPgorCis8L2RkPgorPGR0IGlkPSJlbmdpbmVEZWZhdWx0LUxJU1RBX1pBREEiPjxiPmVuZ2luZURlZmF1bHQ8L2I+ID0gTElTVEFfWkFEQSYjeDE0Mzs8L2R0PgorPGRkPgorCis8cD5saXN0YSB6YWRhJiN4MTQ0OyBPcGVuU1NMIG9kZGVsZWdvd2FueWNoIGRvIGJpZSYjeDE3QzsmI3gxMDU7Y2VnbyB1cnomI3gxMDU7ZHplbmlhPC9wPgorCis8cD5QYXJhbWV0cmVtIGplc3QgbGlzdGEgb2RkemllbG9ueWNoIHByemVjaW5rYW1pIHphZGEmI3gxNDQ7IE9wZW5TU0wsIGt0Jm9hY3V0ZTtyZSBtYWomI3gxMDU7IHpvc3RhJiN4MTA3OyBvZGRlbGVnb3dhbmUgZG8gYmllJiN4MTdDOyYjeDEwNTtjZWdvIHVyeiYjeDEwNTtkemVuaWEga3J5cHRvZ3JhZmljem5lZ28uPC9wPgorCis8cD5XIHphbGUmI3gxN0M7bm8mI3gxNUI7Y2kgb2Qga29ua3JldG5lZ28gdXJ6JiN4MTA1O2R6ZW5pYSBkb3N0JiN4MTE5O3BuZSBtb2cmI3gxMDU7IGJ5JiN4MTA3OyBuYXN0JiN4MTE5O3B1aiYjeDEwNTtjZSB6YWRhbmlhOiBBTEwsIFJTQSwgRFNBLCBFQ0RILCBFQ0RTQSwgREgsIFJBTkQsIENJUEhFUlMsIERJR0VTVFMsIFBLRVksIFBLRVlfQ1JZUFRPLCBQS0VZX0FTTjEuPC9wPgorCis8L2RkPgorPGR0IGlkPSJmaXBzLXllcy1ubyI+PGI+ZmlwczwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPnRyeWIgRklQUyAxNDAtMjwvcD4KKworPHA+T3BjamEgcG96d2FsYSB3eSYjeDE0MjsmI3gxMDU7Y3p5JiN4MTA3OyB3ZWomI3gxNUI7Y2llIHcgdHJ5YiBGSVBTLCBqZSYjeDE1QjtsaSA8Yj5zdHVubmVsPC9iPiB6b3N0YSYjeDE0Mjsgc2tvbXBpbG93YW55IHplIHdzcGFyY2llbSBkbGEgRklQUyAxNDAtMi48L3A+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogbm8gKG9kIHdlcnNqaSA1LjAwKTwvcD4KKworPC9kZD4KKzxkdCBpZD0iZm9yZWdyb3VuZC15ZXMtbm8tdHlsa28tVW5peCI+PGI+Zm9yZWdyb3VuZDwvYj4gPSB5ZXMgfCBubyAodHlsa28gVW5peCk8L2R0PgorPGRkPgorCis8cD50cnliIHBpZXJ3c3pvcGxhbm93eTwvcD4KKworPHA+VSYjeDE3Qzt5Y2llIHRlaiBvcGNqaSBwb3dvZHVqZSwgJiN4MTdDO2UgPGI+c3R1bm5lbDwvYj4gbmllIHByemVjaG9kemkgdyB0JiN4MTQyO28gbG9ndWomI3gxMDU7YyBzd29qZSBrb211bmlrYXR5IG5hIGtvbnNvbCYjeDExOTsgemFtaWFzdCBwcnpleiA8aT5zeXNsb2c8L2k+IChvIGlsZSBuaWUgdSYjeDE3Qzt5dG8gb3BjamkgPGk+b3V0cHV0PC9pPikuPC9wPgorCis8L2RkPgorPGR0IGlkPSJpY29uQWN0aXZlLVBMSUtfWl9JS09OSy10eWxrby1HVUkiPjxiPmljb25BY3RpdmU8L2I+ID0gUExJS19aX0lLT05LJiN4MTA0OyAodHlsa28gR1VJKTwvZHQ+Cis8ZGQ+CisKKzxwPmlrb25rYSB3eSYjeDE1Qjt3aWV0bGFuYSBwcnp5IG9iZWNubyYjeDE1QjtjaSBha3R5d255Y2ggcG8mI3gxNDI7JiN4MTA1O2N6ZSYjeDE0NDsgZG8gdXMmI3gxNDI7dWdpPC9wPgorCis8cD5XIHN5c3RlbWllIFdpbmRvd3MgaWtvbmthIHRvIHBsaWsgLmljbyB6YXdpZXJhaiYjeDEwNTtjeSBvYnJhemVrIDE2eDE2IHBpa3NlbGkuPC9wPgorCis8L2RkPgorPGR0IGlkPSJpY29uRXJyb3ItUExJS19aX0lLT05LLXR5bGtvLUdVSSI+PGI+aWNvbkVycm9yPC9iPiA9IFBMSUtfWl9JS09OSyYjeDEwNDsgKHR5bGtvIEdVSSk8L2R0PgorPGRkPgorCis8cD5pa29ua2Egd3kmI3gxNUI7d2lldGxhbmEsIGplJiN4MTdDO2VsaSBuaWUgem9zdGEmI3gxNDI7IHphJiN4MTQyO2Fkb3dhbnkgcG9wcmF3bnkgcGxpayBrb25maWd1cmFjeWpueTwvcD4KKworPHA+VyBzeXN0ZW1pZSBXaW5kb3dzIGlrb25rYSB0byBwbGlrIC5pY28gemF3aWVyYWomI3gxMDU7Y3kgb2JyYXplayAxNngxNiBwaWtzZWxpLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iaWNvbklkbGUtUExJS19aX0lLT05LLXR5bGtvLUdVSSI+PGI+aWNvbklkbGU8L2I+ID0gUExJS19aX0lLT05LJiN4MTA0OyAodHlsa28gR1VJKTwvZHQ+Cis8ZGQ+CisKKzxwPmlrb25rYSB3eSYjeDE1Qjt3aWV0bGFuYSBwcnp5IGJyYWt1IGFrdHl3bnljaCBwbyYjeDE0MjsmI3gxMDU7Y3plJiN4MTQ0OyBkbyB1cyYjeDE0Mjt1Z2k8L3A+CisKKzxwPlcgc3lzdGVtaWUgV2luZG93cyBpa29ua2EgdG8gcGxpayAuaWNvIHphd2llcmFqJiN4MTA1O2N5IG9icmF6ZWsgMTZ4MTYgcGlrc2VsaS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImxvZy1hcHBlbmQtb3ZlcndyaXRlIj48Yj5sb2c8L2I+ID0gYXBwZW5kIHwgb3ZlcndyaXRlPC9kdD4KKzxkZD4KKworPHA+bG9nIGZpbGUgaGFuZGxpbmc8L3A+CisKKzxwPlRoaXMgb3B0aW9uIGFsbG93cyB0byBjaG9vc2Ugd2hldGhlciB0aGUgbG9nIGZpbGUgKHNwZWNpZmllZCB3aXRoIHRoZSA8aT5vdXRwdXQ8L2k+IG9wdGlvbikgaXMgYXBwZW5kZWQgb3Igb3ZlcndyaXR0ZW4gd2hlbiBvcGVuZWQgb3IgcmUtb3BlbmVkLjwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiBhcHBlbmQ8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im91dHB1dC1QTElLIj48Yj5vdXRwdXQ8L2I+ID0gUExJSzwvZHQ+Cis8ZGQ+CisKKzxwPnBsaWssIGRvIGt0Jm9hY3V0ZTtyZWdvIGRvcGlzYW5lIHpvc3RhbiYjeDEwNTsgbG9naTwvcD4KKworPHA+VSYjeDE3Qzt5Y2llIHRlaiBvcGNqaSBwb3dvZHVqZSBkb3Bpc2FuaWUgbG9nJm9hY3V0ZTt3IGRvIHBvZGFuZWdvIHBsaWt1LjwvcD4KKworPHA+RG8ga2llcm93YW5pYWtvbXVuaWthdCZvYWN1dGU7dyBuYSBzdGFuZGFyZG93ZSB3eWomI3gxNUI7Y2llIChuYSBwcnp5ayYjeDE0MjthZCBwbyB0bywgJiN4MTdDO2VieSB6YWxvZ293YSYjeDEwNzsgamUgcHJvZ3JhbWVtIHNwbG9nZ2VyIHogcGFraWV0dSBkYWVtb250b29scykgbW8mI3gxN0M7bmEgcG9kYSYjeDEwNzsgamFrbyBwYXJhbWV0ciB1cnomI3gxMDU7ZHplbmllIC9kZXYvc3Rkb3V0LjwvcD4KKworPC9kZD4KKzxkdCBpZD0icGlkLVBMSUstdHlsa28tVW5peCI+PGI+cGlkPC9iPiA9IFBMSUsgKHR5bGtvIFVuaXgpPC9kdD4KKzxkZD4KKworPHA+cG8mI3gxNDI7byYjeDE3QztlbmllIHBsaWt1IHogbnVtZXJlbSBwcm9jZXN1PC9wPgorCis8cD5KZSYjeDE3QztlbGkgYXJndW1lbnQgamVzdCBwdXN0eSBwbGlrIG5pZSB6b3N0YW5pZSBzdHdvcnpvbnkuPC9wPgorCis8cD5KZSYjeDE3QztlbGkgemRlZmluaW93YW5vIGthdGFsb2cgPGk+Y2hyb290PC9pPiwgdG8gJiN4MTVCO2NpZSYjeDE3QztrYSBkbyA8aT5waWQ8L2k+IGplc3Qgb2tyZSYjeDE1Qjtsb25hIHd6Z2wmI3gxMTk7ZGVtIHRlZ28ga2F0YWxvZ3UuPC9wPgorCis8L2RkPgorPGR0IGlkPSJSTkRieXRlcy1MSUNaQkFfQkFKVFciPjxiPlJORGJ5dGVzPC9iPiA9IExJQ1pCQV9CQUpUJk9hY3V0ZTtXPC9kdD4KKzxkZD4KKworPHA+bGljemJhIGJhanQmb2FjdXRlO3cgZG8gemFpbmljam93YW5pYSBnZW5lcmF0b3JhIHBzZXVkb2xvc293ZWdvPC9wPgorCis8cD5XIHdlcnNqYWNoIGJpYmxpb3Rla2kgPGI+T3BlblNTTDwvYj4gc3RhcnN6eWNoIG5pJiN4MTdDOyA8Yj4wLjkuNWE8L2I+IG9wY2phIHRhIG9rcmUmI3gxNUI7bGEgciZvYWN1dGU7d25pZSYjeDE3QzsgbGljemImI3gxMTk7IGJhanQmb2FjdXRlO3cgd3lzdGFyY3phaiYjeDEwNTtjeWNoIGRvIHphaW5pY2pvd2FuaWEgUFJORy4gTm93c3plIHdlcnNqZSBiaWJsaW90ZWtpIG1haiYjeDEwNTsgd2J1ZG93YW4mI3gxMDU7IGZ1bmtjaiYjeDExOTsgb2tyZSYjeDE1QjtsYWomI3gxMDU7YyYjeDEwNTssIGN6eSBkb3N0YXJjem9uYSBpbG8mI3gxNUI7JiN4MTA3OyBsb3Nvd28mI3gxNUI7Y2kgamVzdCB3eXN0YXJjemFqJiN4MTA1O2NhIGRvIHphaW5pY2pvd2FuaWEgZ2VuZXJhdG9yYS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlJORGZpbGUtUExJSyI+PGI+Uk5EZmlsZTwvYj4gPSBQTElLPC9kdD4KKzxkZD4KKworPHA+JiN4MTVCO2NpZSYjeDE3QztrYSBkbyBwbGlrdSB6YXdpZXJhaiYjeDEwNTtjZWdvIGxvc293ZSBkYW5lPC9wPgorCis8cD5CaWJsaW90ZWthIDxiPk9wZW5TU0w8L2I+IHUmI3gxN0M7eWplIGRhbnljaCB6IHRlZ28gcGxpa3UgZG8gemFpbmljam93YW5pYSBnZW5lcmF0b3JhIHBzZXVkb2xvc293ZWdvLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iUk5Eb3ZlcndyaXRlLXllcy1ubyI+PGI+Uk5Eb3ZlcndyaXRlPC9iPiA9IHllcyB8IG5vPC9kdD4KKzxkZD4KKworPHA+bmFkcGlzeiBwbGlrIG5vd3ltaSB3YXJ0byYjeDE1QjtjaWFtaSBwc2V1ZG9sb3Nvd3ltaTwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiB5ZXMgKG5hZHBpc3opPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXJ2aWNlLVNFUldJUy10eWxrby1Vbml4Ij48Yj5zZXJ2aWNlPC9iPiA9IFNFUldJUyAodHlsa28gVW5peCk8L2R0PgorPGRkPgorCis8cD5uYXp3YSB1cyYjeDE0Mjt1Z2k8L3A+CisKKzxwPlBvZGFuYSBuYXp3YSB1cyYjeDE0Mjt1Z2kgYiYjeDExOTtkemllIHUmI3gxN0M7eXdhbmEgamFrbyBuYXp3YSB1cyYjeDE0Mjt1Z2kgZGxhIGluaWNqYWxpemFjamkgc3lzbG9nYSwgb3JheiBkbGEgYmlibGlvdGVraSBUQ1AgV3JhcHBlciB3IHRyeWJpZSA8aT5pbmV0ZDwvaT4uIENob2NpYSYjeDE3QzsgdGVjaG5pY3puaWUgbW8mI3gxN0M7bmEgdSYjeDE3Qzt5JiN4MTA3OyB0ZWogb3BjamkgdyB0cnliaWUgdyBzZWtjamkgdXMmI3gxNDI7dWcsIHRvIGplc3Qgb25hIHUmI3gxN0M7eXRlY3puYSBqZWR5bmllIHcgb3BjamFjaCBnbG9iYWxueWNoLjwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiBzdHVubmVsPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXRnaWQtSURFTlRZRklLQVRPUl9HUlVQWS10eWxrby1Vbml4Ij48Yj5zZXRnaWQ8L2I+ID0gSURFTlRZRklLQVRPUl9HUlVQWSAodHlsa28gVW5peCk8L2R0PgorPGRkPgorCis8cD5ncnVwYSB6IGt0Jm9hY3V0ZTtyZWogcHJhd2FtaSBwcmFjb3dhJiN4MTQyOyBiJiN4MTE5O2R6aWUgPGI+c3R1bm5lbDwvYj48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNldHVpZC1JREVOVFlGSUtBVE9SX1VZVEtPV05JS0EtdHlsa28tVW5peCI+PGI+c2V0dWlkPC9iPiA9IElERU5UWUZJS0FUT1JfVSYjeDE3QjtZVEtPV05JS0EgKHR5bGtvIFVuaXgpPC9kdD4KKzxkZD4KKworPHA+dSYjeDE3Qzt5dGtvd25paywgeiBrdCZvYWN1dGU7cmVnbyBwcmF3YW1pIHByYWNvd2EmI3gxNDI7IGImI3gxMTk7ZHppZSA8Yj5zdHVubmVsPC9iPjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic29ja2V0LWEtbC1yOk9QQ0pBLVdBUlRPLTpXQVJUTyI+PGI+c29ja2V0PC9iPiA9IGF8bHxyOk9QQ0pBPVdBUlRPJiN4MTVBOyYjeDEwNjtbOldBUlRPJiN4MTVBOyYjeDEwNjtdPC9kdD4KKzxkZD4KKworPHA+dXN0YXcgb3BjaiYjeDExOTsgbmEgYWtjZXB0dWomI3gxMDU7Y3ltL2xva2FsbnltL3pkYWxueW0gZ25pZSYjeDE3QTtkemllPC9wPgorCis8cD5EbGEgb3BjamkgbGluZ2VyIHdhcnRvJiN4MTVCO2NpIG1haiYjeDEwNTsgcG9zdGEmI3gxMDc7IGxfb25vZjpsX2xpbmdlci4gRGxhIG9wY2ppIHRpbWUgd2FydG8mI3gxNUI7Y2kgbWFqJiN4MTA1OyBwb3N0YSYjeDEwNzsgdHZfc2VjOnR2X3VzZWMuPC9wPgorCis8cD5Qcnp5ayYjeDE0MjthZHk6PC9wPgorCis8cHJlPjxjb2RlPiAgICBzb2NrZXQgPSBsOlNPX0xJTkdFUj0xOjYwCisgICAgICAgIHVzdGF3IGplZG5vbWludXRvd2UgcHJ6ZXRlcm1pbm93YW5pZQorICAgICAgICBwcnp5IHphbXlrYW5pdSBsb2thbG5lZ28gZ25pYXpkYQorICAgIHNvY2tldCA9IHI6U09fT09CSU5MSU5FPXllcworICAgICAgICB1bWllJiN4MTVCOyYjeDEwNzsgZGFuZSBwb3phcGFzbW93ZSAob3V0LW9mLWJhbmQpCisgICAgICAgIGJlenBvJiN4MTVCO3JlZG5pbyB3IHN0cnVtaWVuaXUgZGFueWNoCisgICAgICAgIHdlaiYjeDE1QjtjaW93eWNoIGRsYSB6ZGFsbnljaCBnbmlhemQKKyAgICBzb2NrZXQgPSBhOlNPX1JFVVNFQUREUj1ubworICAgICAgICB6YWJsb2t1aiBwb25vd25lIHUmI3gxN0M7eXdhbmllIHBvcnR1CisgICAgICAgIChkb215JiN4MTVCO2xuaWUgdyYjeDE0MjsmI3gxMDU7Y3pvbmUpCisgICAgc29ja2V0ID0gYTpTT19CSU5EVE9ERVZJQ0U9bG8KKyAgICAgICAgcHJ6eWptdWogcG8mI3gxNDI7JiN4MTA1O2N6ZW5pYSB3eSYjeDE0MjsmI3gxMDU7Y3puaWUgbmEKKyAgICAgICAgaW50ZXJmZWpzaWUgendyb3RueW0gKGFuZy4gbG9vcGJhY2spPC9jb2RlPjwvcHJlPgorCis8L2RkPgorPGR0IGlkPSJzeXNsb2cteWVzLW5vLXR5bGtvLVVuaXgiPjxiPnN5c2xvZzwvYj4gPSB5ZXMgfCBubyAodHlsa28gVW5peCk8L2R0PgorPGRkPgorCis8cD53JiN4MTQyOyYjeDEwNTtjeiBsb2dvd2FuaWUgcG9wcnpleiBtZWNoYW5pem0gc3lzbG9nPC9wPgorCis8cD5kb215JiN4MTVCO2xuaWU6IHllcyAodyYjeDE0MjsmI3gxMDU7Y3opPC9wPgorCis8L2RkPgorPGR0IGlkPSJ0YXNrYmFyLXllcy1uby10eWxrby1XSU4zMiI+PGI+dGFza2JhcjwvYj4gPSB5ZXMgfCBubyAodHlsa28gV0lOMzIpPC9kdD4KKzxkZD4KKworPHA+dyYjeDE0MjsmI3gxMDU7Y3ogaWtvbmsmI3gxMTk7IHcgcHJhd3ltIGRvbG55bSByb2d1IGVrcmFudTwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiB5ZXMgKHcmI3gxNDI7JiN4MTA1O2N6KTwvcD4KKworPC9kZD4KKzwvZGw+CisKKzxoMiBpZD0iT1BDSkUtVVNVRyI+T1BDSkUgVVMmI3gxNDE7VUc8L2gyPgorCis8cD5LYSYjeDE3QztkYSBzZWtjamEga29uZmlndXJhY2ppIHVzJiN4MTQyO3VnaSB6YWN6eW5hIHNpJiN4MTE5OyBqZWogbmF6dyYjeDEwNTsgdWomI3gxMTk7dCYjeDEwNTsgdyBuYXdpYXMga3dhZHJhdG93eS4gTmF6d2EgdXMmI3gxNDI7dWdpIHUmI3gxN0M7eXdhbmEgamVzdCBkbyBrb250cm9saSBkb3N0JiN4MTE5O3B1IHByemV6IGJpYmxpb3RlayYjeDExOTsgbGlid3JhcCAoVENQIHdyYXBwZXJzKSBvcmF6IHBvendhbGEgcm96ciZvYWN1dGU7JiN4MTdDO25pJiN4MTA3OyBwb3N6Y3plZyZvYWN1dGU7bG5lIHVzJiN4MTQyO3VnaSB3IGxvZ2FjaC48L3A+CisKKzxwPkplJiN4MTdDO2VsaSA8Yj5zdHVubmVsPC9iPiBtYSB6b3N0YSYjeDEwNzsgdSYjeDE3Qzt5dHkgdyB0cnliaWUgPGk+aW5ldGQ8L2k+LCBnZHppZSB6YSBvZGVicmFuaWUgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pYSBvZHBvd2lhZGEgb3NvYm55IHByb2dyYW0gKHp3eWtsZSA8aT5pbmV0ZDwvaT4sIDxpPnhpbmV0ZDwvaT4gbHViIDxpPnRjcHNlcnZlcjwvaT4pLCBuYWxlJiN4MTdDO3kgcHJ6ZWN6eXRhJiN4MTA3OyBzZWtjaiYjeDExOTsgPGk+VFJZQiBJTkVURDwvaT4gcG9uaSYjeDE3Qztlai48L3A+CisKKzxkbD4KKworPGR0IGlkPSJhY2NlcHQtSE9TVDotUE9SVCI+PGI+YWNjZXB0PC9iPiA9IFtIT1NUOl1QT1JUPC9kdD4KKzxkZD4KKworPHA+bmFzJiN4MTQyO3VjaHVqZSBuYSBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhIG5hIHBvZGFueW0gYWRyZXNpZSBpIHBvcmNpZTwvcD4KKworPHA+SmUmI3gxN0M7ZWxpIG5pZSB6b3N0YSYjeDE0MjsgcG9kYW55IGFkcmVzLCA8Yj5zdHVubmVsPC9iPiBkb215JiN4MTVCO2xuaWUgbmFzJiN4MTQyO3VjaHVqZSBuYSB3c3p5c3RraWNoIGFkcmVzYWNoIElQdjQgbG9rYWxueWNoIGludGVyZmVqcyZvYWN1dGU7dy48L3A+CisKKzxwPkFieSBuYXMmI3gxNDI7dWNoaXdhJiN4MTA3OyBuYSB3c3p5c3RraWNoIGFkcmVzYWNoIElQdjYgbmFsZSYjeDE3Qzt5IHUmI3gxN0M7eSYjeDEwNzs6PC9wPgorCis8cHJlPjxjb2RlPiAgICBhY2NlcHQgPSA6Ojpwb3J0PC9jb2RlPjwvcHJlPgorCis8L2RkPgorPGR0IGlkPSJDQXBhdGgtS0FUQUxPR19DQSI+PGI+Q0FwYXRoPC9iPiA9IEtBVEFMT0dfQ0E8L2R0PgorPGRkPgorCis8cD5rYXRhbG9nIENlbnRydW0gQ2VydHlmaWthY2ppPC9wPgorCis8cD5PcGNqYSBva3JlJiN4MTVCO2xhIGthdGFsb2csIHcga3Qmb2FjdXRlO3J5bSA8Yj5zdHVubmVsPC9iPiBiJiN4MTE5O2R6aWUgc3p1a2EmI3gxNDI7IGNlcnR5ZmlrYXQmb2FjdXRlO3csIGplJiN4MTdDO2VsaSB1JiN4MTdDO3l0YSB6b3N0YSYjeDE0MjthIG9wY2phIDxpPnZlcmlmeTwvaT4uIFBsaWtpIHogY2VydHlmaWthdGFtaSBtdXN6JiN4MTA1OyBwb3NpYWRhJiN4MTA3OyBzcGVjamFsbmUgbmF6d3kgWFhYWFhYWFguMCwgZ2R6aWUgWFhYWFhYWFggamVzdCBza3Imb2FjdXRlO3RlbSBrcnlwdG9ncmFmaWN6bnltIHJlcHJlemVudGFjamkgREVSIG5hend5IHBvZG1pb3R1IGNlcnR5ZmlrYXR1LjwvcD4KKworPHA+RnVua2NqYSBza3Imb2FjdXRlO3R1IHpvc3RhJiN4MTQyO2Egem1pZW5pb25hIHcgPGI+T3BlblNTTCAxLjAuMDwvYj4uIE5hbGUmI3gxN0M7eSB3eWtvbmEmI3gxMDc7IGNfcmVoYXNoIHByenkgem1pYW5pZSA8Yj5PcGVuU1NMIDAueC54PC9iPiBuYSA8Yj4xLngueDwvYj4uPC9wPgorCis8cD5KZSYjeDE3QztlbGkgemRlZmluaW93YW5vIGthdGFsb2cgPGk+Y2hyb290PC9pPiwgdG8gJiN4MTVCO2NpZSYjeDE3QztrYSBkbyA8aT5DQXBhdGg8L2k+IGplc3Qgb2tyZSYjeDE1Qjtsb25hIHd6Z2wmI3gxMTk7ZGVtIHRlZ28ga2F0YWxvZ3UuPC9wPgorCis8L2RkPgorPGR0IGlkPSJDQWZpbGUtUExJS19DQSI+PGI+Q0FmaWxlPC9iPiA9IFBMSUtfQ0E8L2R0PgorPGRkPgorCis8cD5wbGlrIENlbnRydW0gQ2VydHlmaWthY2ppPC9wPgorCis8cD5PcGNqYSBwb3p3YWxhIG9rcmUmI3gxNUI7bGkmI3gxMDc7IHBvJiN4MTQyO28mI3gxN0M7ZW5pZSBwbGlrdSB6YXdpZXJhaiYjeDEwNTtjZWdvIGNlcnR5ZmlrYXR5IHUmI3gxN0M7eXdhbmUgcHJ6ZXogb3BjaiYjeDExOTsgPGk+dmVyaWZ5PC9pPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImNlcnQtUExJS19QRU0iPjxiPmNlcnQ8L2I+ID0gUExJS19QRU08L2R0PgorPGRkPgorCis8cD5wbGlrIHogJiN4MTQyO2EmI3gxNDQ7Y3VjaGVtIGNlcnR5ZmlrYXQmb2FjdXRlO3c8L3A+CisKKzxwPk9wY2phIG9rcmUmI3gxNUI7bGEgcG8mI3gxNDI7byYjeDE3QztlbmllIHBsaWt1IHphd2llcmFqJiN4MTA1O2NlZ28gY2VydHlmaWthdHkgdSYjeDE3Qzt5d2FuZSBwcnpleiBwcm9ncmFtIDxiPnN0dW5uZWw8L2I+IGRvIHV3aWVyenl0ZWxuaWVuaWEgc2kmI3gxMTk7IHByemVkIGRydWcmI3gxMDU7IHN0cm9uJiN4MTA1OyBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhLiBDZXJ0eWZpa2F0IGplc3Qga29uaWVjem55LCBhYnkgdSYjeDE3Qzt5d2EmI3gxMDc7IHByb2dyYW11IHcgdHJ5YmllIHNlcndlcmEuIFcgdHJ5YmllIGtsaWVudGEgY2VydHlmaWthdCBqZXN0IG9wY2pvbmFsbnkuPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaGVja0VtYWlsLUVNQUlMIj48Yj5jaGVja0VtYWlsPC9iPiA9IEVNQUlMPC9kdD4KKzxkZD4KKworPHA+YWRyZXMgZW1haWwgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1PC9wPgorCis8cD5Qb2plZHluY3phIHNla2NqYSBtbyYjeDE3QztlIHphd2llcmEmI3gxMDc7IHdpZWxlIHd5c3QmI3gxMDU7cGllJiN4MTQ0OyBvcGNqaSA8Yj5jaGVja0VtYWlsPC9iPi4gQ2VydHlmaWthdHkgcyYjeDEwNTsgYWtjZXB0b3dhbmUsIGplJiN4MTdDO2VsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgPGI+Y2hlY2tFbWFpbDwvYj4sIGFsYm8gYWRyZXMgZW1haWwgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1IHBhc3VqZSBkbyBqZWRuZWdvIHogYWRyZXMmb2FjdXRlO3cgZW1haWwgb2tyZSYjeDE1Qjtsb255Y2ggcHJ6eSBwb21vY3kgPGI+Y2hlY2tFbWFpbDwvYj4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaGVja0hvc3QtTkFaV0FfU0VSV0VSQSI+PGI+Y2hlY2tIb3N0PC9iPiA9IE5BWldBX1NFUldFUkE8L2R0PgorPGRkPgorCis8cD5uYXp3YSBzZXJ3ZXJhIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dTwvcD4KKworPHA+UG9qZWR5bmN6YSBzZWtjamEgbW8mI3gxN0M7ZSB6YXdpZXJhJiN4MTA3OyB3aWVsZSB3eXN0JiN4MTA1O3BpZSYjeDE0NDsgb3BjamkgPGI+Y2hlY2tIb3N0PC9iPi4gQ2VydHlmaWthdHkgcyYjeDEwNTsgYWtjZXB0b3dhbmUsIGplJiN4MTdDO2VsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgPGI+Y2hlY2tIb3N0PC9iPiwgYWxibyBuYXp3YSBzZXJ3ZXJhIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dSBwYXN1amUgZG8gamVkbmVnbyBuYXp3IG9rcmUmI3gxNUI7bG9ueWNoIHByenkgcG9tb2N5IDxiPmNoZWNrSG9zdDwvYj4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaGVja0lQLUlQIj48Yj5jaGVja0lQPC9iPiA9IElQPC9kdD4KKzxkZD4KKworPHA+YWRyZXMgSVAgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1PC9wPgorCis8cD5Qb2plZHluY3phIHNla2NqYSBtbyYjeDE3QztlIHphd2llcmEmI3gxMDc7IHdpZWxlIHd5c3QmI3gxMDU7cGllJiN4MTQ0OyBvcGNqaSA8Yj5jaGVja0lQPC9iPi4gQ2VydHlmaWthdHkgcyYjeDEwNTsgYWtjZXB0b3dhbmUsIGplJiN4MTdDO2VsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgPGI+Y2hlY2tJUDwvYj4sIGFsYm8gYWRyZXMgSVAgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1IHBhc3VqZSBkbyBqZWRuZWdvIHogYWRyZXMmb2FjdXRlO3cgSVAgb2tyZSYjeDE1Qjtsb255Y2ggcHJ6eSBwb21vY3kgPGI+Y2hlY2tJUDwvYj4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJjaXBoZXJzLUxJU1RBX1NaWUZSVyI+PGI+Y2lwaGVyczwvYj4gPSBMSVNUQV9TWllGUiZPYWN1dGU7VzwvZHQ+Cis8ZGQ+CisKKzxwPmxpc3RhIGRvendvbG9ueWNoIHN6eWZyJm9hY3V0ZTt3IFNTTDwvcD4KKworPHA+UGFyYW1ldHJlbSB0ZWogb3BjamkgamVzdCBsaXN0YSBzenlmciZvYWN1dGU7dywga3Qmb2FjdXRlO3JlIGImI3gxMTk7ZCYjeDEwNTsgdSYjeDE3Qzt5dGUgcHJ6eSBvdHdpZXJhbml1IG5vd3ljaCBwbyYjeDE0MjsmI3gxMDU7Y3plJiN4MTQ0OyBTU0wsIG5wLjogREVTLUNCQzMtU0hBOklERUEtQ0JDLU1ENTwvcD4KKworPC9kZD4KKzxkdCBpZD0iY2xpZW50LXllcy1ubyI+PGI+Y2xpZW50PC9iPiA9IHllcyB8IG5vPC9kdD4KKzxkZD4KKworPHA+dHJ5YiBrbGllbmNraSAoemRhbG5hIHVzJiN4MTQyO3VnYSB1JiN4MTdDO3l3YSBTU0wpPC9wPgorCis8cD5kb215JiN4MTVCO2xuaWU6IG5vICh0cnliIHNlcndlcm93eSk8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImNvbm5lY3QtSE9TVDotUE9SVCI+PGI+Y29ubmVjdDwvYj4gPSBbSE9TVDpdUE9SVDwvZHQ+Cis8ZGQ+CisKKzxwPnBvJiN4MTQyOyYjeDEwNTtjeiBzaSYjeDExOTsgemUgemRhbG55bSBzZXJ3ZXJlbSBuYSBwb2RhbnkgcG9ydDwvcD4KKworPHA+SmUmI3gxN0M7ZWxpIG5pZSB6b3N0YSYjeDE0MjsgcG9kYW55IGFkcmVzLCA8Yj5zdHVubmVsPC9iPiBkb215JiN4MTVCO2xuaWUgJiN4MTQyOyYjeDEwNTtjenkgc2kmI3gxMTk7IHogbG9rYWxueW0gc2Vyd2VyZW0uPC9wPgorCis8cD5Lb21lbmRhIG1vJiN4MTdDO2UgYnljIHUmI3gxN0M7eXRhIHdpZWxva3JvdG5pZSB3IHBvamVkeW5jemVqIHNla2NqaSBjZWxlbSB6YXBld25pZW5pYSB3eXNva2llaiBuaWV6YXdvZG5vJiN4MTVCO2NpIGx1YiByb3omI3gxNDI7byYjeDE3QztlbmlhIHJ1Y2h1IHBvbWkmI3gxMTk7ZHp5IHdpZWxlIHNlcndlciZvYWN1dGU7dy48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IkNSTHBhdGgtS0FUQUxPR19DUkwiPjxiPkNSTHBhdGg8L2I+ID0gS0FUQUxPR19DUkw8L2R0PgorPGRkPgorCis8cD5rYXRhbG9nIExpc3QgT2R3byYjeDE0MjthbnljaCBDZXJ0eWZpa2F0Jm9hY3V0ZTt3IChDUkwpPC9wPgorCis8cD5PcGNqYSBva3JlJiN4MTVCO2xhIGthdGFsb2csIHcga3Qmb2FjdXRlO3J5bSA8Yj5zdHVubmVsPC9iPiBiJiN4MTE5O2R6aWUgc3p1a2EmI3gxNDI7IGxpc3QgQ1JMLCBqZSYjeDE3QztlbGkgdSYjeDE3Qzt5dGEgem9zdGEmI3gxNDI7YSBvcGNqYSA8aT52ZXJpZnk8L2k+LiBQbGlraSB6IGxpc3RhbWkgQ1JMIG11c3omI3gxMDU7IHBvc2lhZGEmI3gxMDc7IHNwZWNqYWxuZSBuYXp3eSBYWFhYWFhYWC5yMCwgZ2R6aWUgWFhYWFhYWFggamVzdCBza3Imb2FjdXRlO3RlbSBsaXN0eSBDUkwuPC9wPgorCis8cD5GdW5rY2phIHNrciZvYWN1dGU7dHUgem9zdGEmI3gxNDI7YSB6bWllbmlvbmEgPGI+T3BlblNTTCAxLjAuMDwvYj4uIE5hbGUmI3gxN0M7eSB3eWtvbmEmI3gxMDc7IGNfcmVoYXNoIHByenkgem1pYW5pZSA8Yj5PcGVuU1NMIDAueC54PC9iPiBuYSA8Yj4xLngueDwvYj4uPC9wPgorCis8cD5KZSYjeDE3QztlbGkgemRlZmluaW93YW5vIGthdGFsb2cgPGk+Y2hyb290PC9pPiwgdG8gJiN4MTVCO2NpZSYjeDE3QztrYSBkbyA8aT5DUkxwYXRoPC9pPiBqZXN0IG9rcmUmI3gxNUI7bG9uYSB3emdsJiN4MTE5O2RlbSB0ZWdvIGthdGFsb2d1LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iQ1JMZmlsZS1QTElLX0NSTCI+PGI+Q1JMZmlsZTwvYj4gPSBQTElLX0NSTDwvZHQ+Cis8ZGQ+CisKKzxwPnBsaWsgTGlzdCBPZHdvJiN4MTQyO2FueWNoIENlcnR5ZmlrYXQmb2FjdXRlO3cgKENSTCk8L3A+CisKKzxwPk9wY2phIHBvendhbGEgb2tyZSYjeDE1QjtsaSYjeDEwNzsgcG8mI3gxNDI7byYjeDE3QztlbmllIHBsaWt1IHphd2llcmFqJiN4MTA1O2NlZ28gbGlzdHkgQ1JMIHUmI3gxN0M7eXdhbmUgcHJ6ZXogb3BjaiYjeDExOTsgPGk+dmVyaWZ5PC9pPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImN1cnZlLU5JRCI+PGI+Y3VydmU8L2I+ID0gTklEPC9kdD4KKzxkZD4KKworPHA+a3J6eXdhIGRsYSBFQ0RIPC9wPgorCis8cD5MaXN0JiN4MTE5OyBkb3N0JiN4MTE5O3BueWNoIGtyenl3eWNoIG1vJiN4MTdDO25hIHV6eXNrYSYjeDEwNzsgcG9sZWNlbmllbTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIG9wZW5zc2wgZWNwYXJhbSAtbGlzdF9jdXJ2ZXM8L2NvZGU+PC9wcmU+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogcHJpbWUyNTZ2MTwvcD4KKworPC9kZD4KKzxkdCBpZD0ibG9nSWQtVFlQIj48Yj5sb2dJZDwvYj4gPSBUWVA8L2R0PgorPGRkPgorCis8cD50eXAgaWRlbnR5ZmlrYXRvcmEgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pYSBrbGllbnRhPC9wPgorCis8cD5JZGVudHlmaWthdG9yIHRlbiBwb3p3YWxhIHJvenImb2FjdXRlOyYjeDE3QztuaSYjeDEwNzsgd3Bpc3kgdyBsb2d1IHd5Z2VuZXJvd2FuZSBkbGEgcG9zemN6ZWcmb2FjdXRlO2xueWNoIHBvJiN4MTQyOyYjeDEwNTtjemUmI3gxNDQ7LjwvcD4KKworPHA+QWt0dWFsbmllIHdzcGllcmFuZSB0eXB5OjwvcD4KKworPGRsPgorCis8ZHQgaWQ9InNlcXVlbnRpYWwiPjxpPnNlcXVlbnRpYWw8L2k+PC9kdD4KKzxkZD4KKworPHA+S29sZWpueSBudW1lciBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhIGplc3QgdW5pa2FsbnkgamVkeW5pZSB3IG9iciYjeDExOTtiaWUgcG9qZWR5bmN6ZWogaW5zdGFuY2ppIHByb2dyYW11IDxiPnN0dW5uZWw8L2I+LCBhbGUgYmFyZHpvIGtyJm9hY3V0ZTt0a2kuIEplc3Qgb24gc3pjemVnJm9hY3V0ZTtsbmllIHUmI3gxN0M7eXRjem55IHByenkgciYjeDExOTtjem5laiBhbmFsaXppZSBsb2cmb2FjdXRlO3cuPC9wPgorCis8L2RkPgorPGR0IGlkPSJ1bmlxdWUiPjxpPnVuaXF1ZTwvaT48L2R0PgorPGRkPgorCis8cD5UZW4gcm9kemFqIGlkZW50eWZpa2F0b3JhIGplc3QgZ2xvYmFsbmllIHVuaWthbG55LCBhbGUgem5hY3puaWUgZCYjeDE0Mjt1JiN4MTdDO3N6eSwgbmkmI3gxN0M7IGtvbGVqbnkgbnVtZXIgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pYS4gSmVzdCBvbiBzemN6ZWcmb2FjdXRlO2xuaWUgdSYjeDE3Qzt5dGVjem55IHByenkgemF1dG9tYXR5em93YW5laiBhbmFsaXppZSBsb2cmb2FjdXRlO3cuPC9wPgorCis8L2RkPgorPGR0IGlkPSJ0aHJlYWQiPjxpPnRocmVhZDwvaT48L2R0PgorPGRkPgorCis8cD5JZGVudHlmaWthdG9yIHcmI3gxMDU7dGt1IHN5c3RlbXUgb3BlcmFjeWpuZWdvIG5pZSBqZXN0IGFuaSB1bmlrYWxueSAobmF3ZXQgdyBvYnImI3gxMTk7YmllIHBvamVkeW5jemVqIGluc3RhbmNqaSBwcm9ncmFtdSA8Yj5zdHVubmVsPC9iPiksIGFuaSBrciZvYWN1dGU7dGtpLiBKZXN0IG9uIHN6Y3plZyZvYWN1dGU7bG5pZSB1JiN4MTdDO3l0ZWN6bnkgcHJ6eSBkaWFnbm96b3dhbml1IHByb2JsZW0mb2FjdXRlO3cgeiBvcHJvZ3JhbW93YW5pZW0gbHViIGtvbmZpZ3VyYWNqJiN4MTA1Oy48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8cD5kb215JiN4MTVCO2xuaWU6IHNlcXVlbnRpYWw8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImRlYnVnLVBPWklPTSI+PGI+ZGVidWc8L2I+ID0gUE9aSU9NPC9kdD4KKzxkZD4KKworPHA+c3pjemVnJm9hY3V0ZTsmI3gxNDI7b3dvJiN4MTVCOyYjeDEwNzsgbG9nb3dhbmlhPC9wPgorCis8cD5Qb3ppb20gbG9nb3dhbmlhIG1vJiN4MTdDO25hIG9rcmUmI3gxNUI7bGkmI3gxMDc7IHByenkgcG9tb2N5IGplZG5laiB6IG5hencgbHViIGxpY3piOiBlbWVyZyAoMCksIGFsZXJ0ICgxKSwgY3JpdCAoMiksIGVyciAoMyksIHdhcm5pbmcgKDQpLCBub3RpY2UgKDUpLCBpbmZvICg2KSBsdWIgZGVidWcgKDcpLiBaYXBpc3l3YW5lIHMmI3gxMDU7IGtvbXVuaWthdHkgbyBwb3ppb21pZSBuaSYjeDE3QztzenltIChudW1lcnljem5pZSkgbHViIHImb2FjdXRlO3dueW0gcG9kYW5lbXUuIERvIHV6eXNrYW5pYSBuYWp3eSYjeDE3QztzemVnbyBwb3ppb211IHN6Y3plZyZvYWN1dGU7JiN4MTQyO293byYjeDE1QjtjaSBtbyYjeDE3QztuYSB1JiN4MTdDO3kmI3gxMDc7IG9wY2ppIDxpPmRlYnVnID0gZGVidWc8L2k+IGx1YiA8aT5kZWJ1ZyA9IDc8L2k+LiBEb215JiN4MTVCO2xueW0gcG96aW9tZW0gamVzdCBub3RpY2UgKDUpLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iZGVsYXkteWVzLW5vIj48Yj5kZWxheTwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPm9wJm9hY3V0ZTsmI3gxN0E7bmlqIHJvendpbmkmI3gxMTk7Y2llIGFkcmVzdSBETlMgcG9kYW5lZ28gdyBvcGNqaSA8aT5jb25uZWN0PC9pPjwvcD4KKworPHA+T3BjamEgamVzdCBwcnp5ZGF0bmEgcHJ6eSBkeW5hbWljem55bSBETlMsIGFsYm8gZ2R5IHVzJiN4MTQyO3VnYSBETlMgbmllIGplc3QgZG9zdCYjeDExOTtwbmEgcHJ6eSBzdGFyY2llIHByb2dyYW11IDxiPnN0dW5uZWw8L2I+IChrbGllbnQgVlBOLCBwbyYjeDE0MjsmI3gxMDU7Y3plbmllIHdkendhbmlhbmUpLjwvcD4KKworPHA+T3Amb2FjdXRlOyYjeDE3QTtuaW9uZSByb3p3aWphbmllIGFkcmVzdSBETlMgamVzdCB3JiN4MTQyOyYjeDEwNTtjemFuZSBhdXRvbWF0eWN6bmllLCBqZSYjeDE3QztlbGkgbmllIHBvd2llZHppZSBzaSYjeDExOTsgcm96d2luaSYjeDExOTtjaWUga3Qmb2FjdXRlO3JlZ29rb2x3aWVrIHogYWRyZXMmb2FjdXRlO3cgPGk+Y29ubmVjdDwvaT4gZGxhIGRhbmVqIHVzJiN4MTQyO3VnaS48L3A+CisKKzxwPk9wJm9hY3V0ZTsmI3gxN0E7bmlvbmUgcm96d2lqYW5pZSBhZHJlc3UgYXV0b21hdHljem5pZSBha3R5d3VqZSA8aT5mYWlsb3ZlciA9IHByaW88L2k+LjwvcD4KKworPHA+ZGVmYXVsdDogbm88L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImVuZ2luZUlkLU5VTUVSX1VSWkRaRU5JQSI+PGI+ZW5naW5lSWQ8L2I+ID0gTlVNRVJfVVJaJiN4MTA0O0RaRU5JQTwvZHQ+Cis8ZGQ+CisKKzxwPnd5YmllcnogdXJ6JiN4MTA1O2R6ZW5pZSBkbGEgdXMmI3gxNDI7dWdpPC9wPgorCis8L2RkPgorPGR0IGlkPSJlbmdpbmVOdW0tTlVNRVJfVVJaRFpFTklBIj48Yj5lbmdpbmVOdW08L2I+ID0gTlVNRVJfVVJaJiN4MTA0O0RaRU5JQTwvZHQ+Cis8ZGQ+CisKKzxwPnd5YmllcnogdXJ6JiN4MTA1O2R6ZW5pZSBkbGEgdXMmI3gxNDI7dWdpPC9wPgorCis8cD5VcnomI3gxMDU7ZHplbmlhIHMmI3gxMDU7IG51bWVyb3dhbmUgb2QgMSB3IGcmb2FjdXRlO3ImI3gxMTk7LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iZXhlYy1DSUVLQV9ET19QUk9HUkFNVSI+PGI+ZXhlYzwvYj4gPSAmI3gxNUE7Q0lFJiN4MTdCO0tBX0RPX1BST0dSQU1VPC9kdD4KKzxkZD4KKworPHA+d3lrb25haiBsb2thbG55IHByb2dyYW0gcHJ6eXN0b3Nvd2FueSBkbyBwcmFjeSB6IHN1cGVyZGVtb25lbSBpbmV0ZDwvcD4KKworPHA+SmUmI3gxN0M7ZWxpIHpkZWZpbmlvd2FubyBrYXRhbG9nIDxpPmNocm9vdDwvaT4sIHRvICYjeDE1QjtjaWUmI3gxN0M7a2EgZG8gPGk+ZXhlYzwvaT4gamVzdCBva3JlJiN4MTVCO2xvbmEgd3pnbCYjeDExOTtkZW0gdGVnbyBrYXRhbG9ndS48L3A+CisKKzxwPk5hIHBsYXRmb3JtYWNoIFVuaXggdXN0YXdpYW5lIHMmI3gxMDU7IG5hc3QmI3gxMTk7cHVqJiN4MTA1O2NlIHptaWVubmUgJiN4MTVCO3JvZG93aXNrb3dlOiBSRU1PVEVfSE9TVCwgUkVNT1RFX1BPUlQsIFNTTF9DTElFTlRfRE4sIFNTTF9DTElFTlRfSV9ETi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9ImV4ZWNBcmdzLTAtMS0yIj48Yj5leGVjQXJnczwvYj4gPSAkMCAkMSAkMiAuLi48L2R0PgorPGRkPgorCis8cD5hcmd1bWVudHkgZG8gb3BjamkgPGk+ZXhlYzwvaT4gdyYjeDE0MjsmI3gxMDU7Y3puaWUgeiBuYXp3JiN4MTA1OyBwcm9ncmFtdSAoJDApPC9wPgorCis8cD5DeXRvd2FuaWUgbmllIGplc3Qgd3NwaWVyYW5lIHcgb2JlY25laiB3ZXJzamkgcHJvZ3JhbXUuIEFyZ3VtZW50eSBzJiN4MTA1OyByb3pkemllbG9uZSBkb3dvbG4mI3gxMDU7IGxpY3piJiN4MTA1OyBiaWEmI3gxNDI7eWNoIHpuYWsmb2FjdXRlO3cuPC9wPgorCis8L2RkPgorPGR0IGlkPSJmYWlsb3Zlci1yci1wcmlvIj48Yj5mYWlsb3ZlcjwvYj4gPSByciB8IHByaW88L2R0PgorPGRkPgorCis8cD5TdHJhdGVnaWEgd3liaWVyYW5pYSBzZXJ3ZXImb2FjdXRlO3cgd3lzcGVjeWZpa293YW55Y2ggcGFyYW1ldHJhbWkgJnF1b3Q7Y29ubmVjdCZxdW90Oy48L3A+CisKKzxwcmU+PGNvZGU+ICAgIHJyIChyb3VuZCByb2JpbikgLSBzcHJhd2llZGxpd2Ugcm96JiN4MTQyO28mI3gxN0M7ZW5pZSBvYmNpJiN4MTA1OyYjeDE3QztlbmlhCisgICAgcHJpbyAocHJpb3JpdHkpIC0gdSYjeDE3Qzt5aiBrb2xlam5vJiN4MTVCO2NpIG9wY2ppIHcgcGxpa3Uga29uZmlndXJhY3lqbnltPC9jb2RlPjwvcHJlPgorCis8cD5kb215JiN4MTVCO2xuaWU6IHJyPC9wPgorCis8L2RkPgorPGR0IGlkPSJpZGVudC1OQVpXQV9VWVRLT1dOSUtBIj48Yj5pZGVudDwvYj4gPSBOQVpXQV9VJiN4MTdCO1lUS09XTklLQTwvZHQ+Cis8ZGQ+CisKKzxwPndlcnlmaWt1aiBuYXp3JiN4MTE5OyB6ZGFsbmVnbyB1JiN4MTdDO3l0a293bmlrYSBrb3J6eXN0YWomI3gxMDU7YyB6IHByb3Rva28mI3gxNDI7dSBJREVOVCAoUkZDIDE0MTMpPC9wPgorCis8L2RkPgorPGR0IGlkPSJpbmNsdWRlLUtBVEFMT0ciPjxiPmluY2x1ZGU8L2I+ID0gS0FUQUxPRzwvZHQ+Cis8ZGQ+CisKKzxwPndjenl0YWogZnJhZ21lbnR5IHBsaWsmb2FjdXRlO3cga29uZmlndXJhY3lqbnljaCB6IHBvZGFuZWdvIGthdGFsb2d1PC9wPgorCis8cD5QbGlraSBzJiN4MTA1OyB3Y3p5dHl3YW5lIHcgcm9zbiYjeDEwNTtjZWoga29sZWpubyYjeDE1QjtjaSBhbGZhYmV0eWN6bmVqIGljaCBuYXp3LjwvcD4KKworPC9kZD4KKzxkdCBpZD0ia2V5LVBMSUtfS0xVQ1pBIj48Yj5rZXk8L2I+ID0gUExJS19LTFVDWkE8L2R0PgorPGRkPgorCis8cD5rbHVjeiBwcnl3YXRueSBkbyBjZXJ0eWZpa2F0dSBwb2RhbmVnbyB3IG9wY2ppIDxpPmNlcnQ8L2k+PC9wPgorCis8cD5LbHVjeiBwcnl3YXRueSBqZXN0IHBvdHJ6ZWJueSBkbyB1d2llcnp5dGVsbmllbmlhIHcmI3gxNDI7YSYjeDE1QjtjaWNpZWxhIGNlcnR5ZmlrYXR1LiBQb25pZXdhJiN4MTdDOyBwb3dpbmllbiBvbiBieSYjeDEwNzsgemFjaG93YW55IHcgdGFqZW1uaWN5LCBwcmF3YSBkbyBqZWdvIG9kY3p5dHUgcG93aW5pZW4gbWllJiN4MTA3OyB3eSYjeDE0MjsmI3gxMDU7Y3puaWUgdyYjeDE0MjthJiN4MTVCO2NpY2llbCBwbGlrdS4gVyBzeXN0ZW1pZSBVbml4IG1vJiN4MTdDO25hIHRvIG9zaSYjeDEwNTtnbiYjeDEwNTsmI3gxMDc7IGtvbWVuZCYjeDEwNTs6PC9wPgorCis8cHJlPjxjb2RlPiAgICBjaG1vZCA2MDAga2V5ZmlsZTwvY29kZT48L3ByZT4KKworPHA+ZG9teSYjeDE1QjtsbmllOiB3YXJ0byYjeDE1QjsmI3gxMDc7IG9wY2ppIDxpPmNlcnQ8L2k+PC9wPgorCis8L2RkPgorPGR0IGlkPSJsaWJ3cmFwLXllcy1ubyI+PGI+bGlid3JhcDwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPncmI3gxNDI7JiN4MTA1O2N6IGx1YiB3eSYjeDE0MjsmI3gxMDU7Y3oga29yenlzdGFuaWUgeiAvZXRjL2hvc3RzLmFsbG93IGkgL2V0Yy9ob3N0cy5kZW55LjwvcD4KKworPHA+ZG9teSYjeDE1QjtsbmllOiBubyAob2Qgd2Vyc2ppIDUuMDApPC9wPgorCis8L2RkPgorPGR0IGlkPSJsb2NhbC1IT1NUIj48Yj5sb2NhbDwvYj4gPSBIT1NUPC9kdD4KKzxkZD4KKworPHA+SVAgJiN4MTdBO3Imb2FjdXRlO2QmI3gxNDI7YSBkbyBuYXdpJiN4MTA1O3p5d2FuaWEgemRhbG55Y2ggcG8mI3gxNDI7JiN4MTA1O2N6ZSYjeDE0NDs8L3A+CisKKzxwPkRvbXkmI3gxNUI7bG5pZSB1JiN4MTdDO3l3YW5lIGplc3QgSVAgbmFqYmFyZHppZWogemV3biYjeDExOTt0cnpuZWdvIGludGVyZmVqc3UgdyBzdHJvbiYjeDExOTsgc2Vyd2VyYSwgZG8ga3Qmb2FjdXRlO3JlZ28gbmF3aSYjeDEwNTt6eXdhbmUgamVzdCBwbyYjeDE0MjsmI3gxMDU7Y3plbmllLjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic25pLVVTVUdBOldaT1JaRUNfTkFaV1lfU0VSV0VSQS10cnliLXNlcndlcmEiPjxiPnNuaTwvYj4gPSBVUyYjeDE0MTtVR0E6V1pPUlpFQ19OQVpXWV9TRVJXRVJBICh0cnliIHNlcndlcmEpPC9kdD4KKzxkZD4KKworPHA+VSYjeDE3Qzt5aiB1cyYjeDE0Mjt1Z2kgamFrbyBwb2RyeiYjeDExOTtkbmVqICh2aXJ0dWFsbmVnbyBzZXJ3ZXJhKSBkbGEgcm96c3plcnplbmlhIFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChSRkMgMzU0NikuPC9wPgorCis8cD48aT5uYXp3YV91cyYjeDE0Mjt1Z2k8L2k+IHdza2F6dWplIHVzJiN4MTQyO3VnJiN4MTE5OyBuYWRyeiYjeDExOTtkbiYjeDEwNTssIGt0Jm9hY3V0ZTtyYSBvZGJpZXJhIHBvJiN4MTQyOyYjeDEwNTtjemVuaWEgb2Qga2xpZW50Jm9hY3V0ZTt3IHByenkgcG9tb2N5IG9wY2ppIDxpPmFjY2VwdDwvaT4uIDxpPnd6b3J6ZWNfbmF6d3lfc2Vyd2VyYTwvaT4gd3NrYXp1amUgbmF6dyYjeDExOTsgc2Vyd2VyYSB3aXJ0dWFsbmVnby4gV3pvcnplYyBtbyYjeDE3QztlIHphY3p5bmEmI3gxMDc7IHNpJiN4MTE5OyB6bmFraWVtICYjMzk7KiYjMzk7LCBucC4gJiMzOTsqLmV4YW1wbGUuY29tJnF1b3Q7LiBaIHBvamVkeSYjeDE0NDtjeiYjeDEwNTsgdXMmI3gxNDI7dWcmI3gxMDU7IG5hZHJ6JiN4MTE5O2RuJiN4MTA1OyBwb3dpJiN4MTA1O3phbmUgamVzdCB6d3lrbGUgd2llbGUgdXMmI3gxNDI7dWcgcG9kcnomI3gxMTk7ZG55Y2guIE9wY2phIDxpPnNuaTwvaT4gbW8mI3gxN0M7ZSBieSYjeDEwNzsgcm93bmllJiN4MTdDOyB1JiN4MTdDO3l0YSB3aWVsb2tyb3RuaWUgdyByYW1hY2ggamVkbmVqIHVzJiN4MTQyO3VnaSBwb2RyeiYjeDExOTtkbmVqLjwvcD4KKworPHA+WmFyJm9hY3V0ZTt3bm8gdXMmI3gxNDI7dWdhIG5hZHJ6JiN4MTE5O2RuYSBqYWsgaSBwb2RyeiYjeDExOTtkbmEgbmllIG1vJiN4MTdDO2UgYnkmI3gxMDc7IHNrb25maWd1cm93YW5hIHcgdHJ5YmllIGtsaWVuY2tpbS48L3A+CisKKzxwPk9wY2phIDxpPmNvbm5lY3Q8L2k+IHVzJiN4MTQyO3VnaSBwb2RyeiYjeDExOTtkbmVqIGplc3QgaWdub3Jvd2FuYSB3IHBvJiN4MTQyOyYjeDEwNTtjemVuaXUgeiBvcGNqJiN4MTA1OyA8aT5wcm90b2NvbDwvaT4sIGdkeSYjeDE3QzsgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pZSBkbyB6ZGFsbmVnbyBzZXJ3ZXJhIGplc3QgdyB0eW0gd3lwYWRrdSBuYXdpJiN4MTA1O3p5d2FuZSBwcnplZCBuZWdvY2phY2omI3gxMDU7IFRMUy48L3A+CisKKzxwPlV3aWVyenl0ZWxuaWVuaWUgcHJ6eSBwb21vY3kgYmlibGlvdGVraSBsaWJ3cmFwIGplc3QgcmVhbGl6b3dhbmUgZHd1a3JvdG5pZTogbmFqcGllcncgZGxhIHVzJiN4MTQyO3VnaSBuYWRyeiYjeDExOTtkbmVqIHBvIG9kZWJyYW5pdSBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhIFRDUCwgYSBuYXN0JiN4MTE5O3BuaWUgZGxhIHVzJiN4MTQyO3VnaSBwb2RyeiYjeDExOTtkbmVqIHBvZGN6YXMgbmVnb2NqYWNqaSBUTFMuPC9wPgorCis8cD5PcGNqYSA8aT5zbmk8L2k+IGplc3QgZG9zdCYjeDExOTtwbmEgcG9jeiYjeDEwNTt3c3p5IG9kIDxiPk9wZW5TU0wgMS4wLjA8L2I+LjwvcD4KKworPC9kZD4KKzxkdCBpZD0ic25pLUhPU1QtdHJ5Yi1rbGllbnRhIj48Yj5zbmk8L2I+ID0gSE9TVCAodHJ5YiBrbGllbnRhKTwvZHQ+Cis8ZGQ+CisKKzxwPlUmI3gxN0M7eWogcGFyYW1ldHJ1IGpha28gd2FydG8mI3gxNUI7Y2kgcm96c3plcnplbmlhIFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChSRkMgMzU0NikuPC9wPgorCis8cD5PcGNqYSA8aT5zbmk8L2k+IGplc3QgZG9zdCYjeDExOTtwbmEgcG9jeiYjeDEwNTt3c3p5IG9kIDxiPk9wZW5TU0wgMS4wLjA8L2I+LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iT0NTUC1VUkwiPjxiPk9DU1A8L2I+ID0gVVJMPC9kdD4KKzxkZD4KKworPHA+c2Vyd2VyIE9DU1AgZG8gd2VyeWZpa2FjamkgY2VydHlmaWthdCZvYWN1dGU7dzwvcD4KKworPC9kZD4KKzxkdCBpZD0iT0NTUGFpYS15ZXMtbm8iPjxiPk9DU1BhaWE8L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD53ZXJ5ZmlrdWogY2VydHlmaWthdHkgcHJ6eSB1JiN4MTdDO3ljaXUgcmVzcG9uZGVydCZvYWN1dGU7dyBBSUE8L3A+CisKKzxwPk9wY2phIDxpPk9DU1BhaWE8L2k+IHBvendhbGEgbmEgd2VyeWZpa293YW5pZSBjZXJ0eWZpa2F0Jm9hY3V0ZTt3IHByenkgcG9tb2N5IGxpc3R5IFVSTGkgc2Vyd2VyJm9hY3V0ZTt3IE9DU1AgcHJ6ZXMmI3gxNDI7YW55Y2ggdyByb3pzemVyemVuaWFjaCBBSUEgKEF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MpLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iT0NTUGZsYWctRkxBR0FfT0NTUCI+PGI+T0NTUGZsYWc8L2I+ID0gRkxBR0FfT0NTUDwvZHQ+Cis8ZGQ+CisKKzxwPmZsYWdhIHNlcndlcmEgT0NTUDwvcD4KKworPHA+YWt0dWFsbmllIHdzcGllcmFuZSBmbGFnaTogTk9DRVJUUywgTk9JTlRFUk4gTk9TSUdTLCBOT0NIQUlOLCBOT1ZFUklGWSwgTk9FWFBMSUNJVCwgTk9DQVNJR04sIE5PREVMRUdBVEVELCBOT0NIRUNLUywgVFJVU1RPVEhFUiwgUkVTUElEX0tFWSwgTk9USU1FPC9wPgorCis8cD5BYnkgd3lzcGVjeWZpa293YSYjeDEwNzsga2lsa2EgZmxhZyBuYWxlJiN4MTdDO3kgdSYjeDE3Qzt5JiN4MTA3OyA8aT5PQ1NQZmxhZzwvaT4gd2llbG9rcm90bmllLjwvcD4KKworPC9kZD4KKzxkdCBpZD0ib3B0aW9ucy1PUENKRV9TU0wiPjxiPm9wdGlvbnM8L2I+ID0gT1BDSkVfU1NMPC9kdD4KKzxkZD4KKworPHA+b3BjamUgYmlibGlvdGVraSA8Yj5PcGVuU1NMPC9iPjwvcD4KKworPHA+UGFyYW1ldHJlbSBqZXN0IG5hendhIG9wY2ppIHpnb2RuaWUgeiBvcGlzZW0gdyA8aT5TU0xfQ1RYX3NldF9vcHRpb25zKDNzc2wpPC9pPiwgYWxlIGJleiBwcnplZHJvc3RrYSA8aT5TU0xfT1BfPC9pPi4gPGk+c3R1bm5lbCAtb3B0aW9uczwvaT4gd3kmI3gxNUI7d2lldGxhIG9wY2plIGRvendvbG9uZSB3IGFrdHVhbG5laiBrb21iaW5hY2ppIHByb2dyYW11IDxpPnN0dW5uZWw8L2k+IGkgYmlibGlvdGVraSA8aT5PcGVuU1NMPC9pPi48L3A+CisKKzxwPkFieSB3eXNwZWN5Zmlrb3dhJiN4MTA3OyBraWxrYSBvcGNqaSBuYWxlJiN4MTdDO3kgdSYjeDE3Qzt5JiN4MTA3OyA8aT5vcHRpb25zPC9pPiB3aWVsb2tyb3RuaWUuIE5hendhIG9wY2ppIG1vJiN4MTdDO2UgYnkmI3gxMDc7IHBvcHJ6ZWR6b25hIG15JiN4MTVCO2xuaWtpZW0gKCZxdW90Oy0mcXVvdDspIGNlbGVtIHd5JiN4MTQyOyYjeDEwNTtjemVuaWEgb3BjamkuPC9wPgorCis8cD5OYSBwcnp5ayYjeDE0MjthZCwgZGxhIHphY2hvd2FuaWEga29tcGF0eWJpbG5vJiN4MTVCO2NpIHogYiYjeDE0MjsmI3gxMTk7ZGFtaSBpbXBsZW1lbnRhY2ppIFNTTCB3IHByb2dyYW1pZSBFdWRvcmEsIG1vJiN4MTdDO25hIHUmI3gxN0M7eSYjeDEwNzsgb3Bjamk6PC9wPgorCis8cHJlPjxjb2RlPiAgICBvcHRpb25zID0gRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTPC9jb2RlPjwvcHJlPgorCis8cD5kb215JiN4MTVCO2xuaWU6PC9wPgorCis8cHJlPjxjb2RlPiAgICBvcHRpb25zID0gTk9fU1NMdjIKKyAgICBvcHRpb25zID0gTk9fU1NMdjM8L2NvZGU+PC9wcmU+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sLVBST1RPSyI+PGI+cHJvdG9jb2w8L2I+ID0gUFJPVE9LJk9hY3V0ZTsmI3gxNDE7PC9kdD4KKzxkZD4KKworPHA+bmVnb2NqdWogU1NMIHBvZGFueW0gcHJvdG9rbyYjeDE0MjtlbSBhcGxpa2FjeWpueW08L3A+CisKKzxwPk9wY2phIHRhIHcmI3gxNDI7JiN4MTA1O2N6YSB3c3QmI3gxMTk7cG4mI3gxMDU7IG5lZ29jamFjaiYjeDExOTsgc3p5ZnJvd2FuaWEgU1NMIGRsYSB3eWJyYW5lZ28gcHJvdG9rbyYjeDE0Mjt1IGFwbGlrYWN5am5lZ28uIE9wY2ppIDxpPnByb3RvY29sPC9pPiBuaWUgbmFsZSYjeDE3Qzt5IHUmI3gxN0M7eXdhJiN4MTA3OyB6IHN6eWZyb3dhbmllbSBTU0wgbmEgb3NvYm55bSBwb3JjaWUuPC9wPgorCis8cD5Ba3R1YWxuaWUgd3NwaWVyYW5lIHByb3Rva28mI3gxNDI7eTo8L3A+CisKKzxkbD4KKworPGR0IGlkPSJjaWZzIj48aT5jaWZzPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPlVuaWV1ZG9rdW1lbnRvd2FuZSByb3pzemVyemVuaWUgcHJvdG9rbyYjeDE0Mjt1IENJRlMgd3NwaWVyYW5lIHByemV6IHNlcndlciBTYW1iYS4gV3NwYXJjaWUgZGxhIHRlZ28gcm96cnplY3plbmlhIHpvc3RhJiN4MTQyO28gemFyenVjb25lIHcgd2Vyc2ppIDMuMC4wIHNlcndlcmEgU2FtYmEuPC9wPgorCis8L2RkPgorPGR0IGlkPSJjb25uZWN0Ij48aT5jb25uZWN0PC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPk5lZ29jamFjamEgUkZDIDI4MTcgLSA8aT5VcGdyYWRpbmcgdG8gVExTIFdpdGhpbiBIVFRQLzEuMTwvaT4sIHJvemR6aWEmI3gxNDI7IDUuMiAtIDxpPlJlcXVlc3RpbmcgYSBUdW5uZWwgd2l0aCBDT05ORUNUPC9pPjwvcD4KKworPHA+VGVuIHByb3RvayZvYWN1dGU7JiN4MTQyOyBqZXN0IHdzcGllcmFueSB3eSYjeDE0MjsmI3gxMDU7Y3puaWUgdyB0cnliaWUga2xpZW5ja2ltLjwvcD4KKworPC9kZD4KKzxkdCBpZD0iaW1hcCI+PGk+aW1hcDwvaT48L2R0PgorPGRkPgorCis8cD5OZWdvY2phY2phIFJGQyAyNTk1IC0gPGk+VXNpbmcgVExTIHdpdGggSU1BUCwgUE9QMyBhbmQgQUNBUDwvaT48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Im5udHAiPjxpPm5udHA8L2k+PC9kdD4KKzxkZD4KKworPHA+TmVnb2NqYWNqYSBSRkMgNDY0MiAtIDxpPlVzaW5nIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSB3aXRoIE5ldHdvcmsgTmV3cyBUcmFuc2ZlciBQcm90b2NvbCAoTk5UUCk8L2k+PC9wPgorCis8cD5UZW4gcHJvdG9rJm9hY3V0ZTsmI3gxNDI7IGplc3Qgd3NwaWVyYW55IHd5JiN4MTQyOyYjeDEwNTtjem5pZSB3IHRyeWJpZSBrbGllbmNraW0uPC9wPgorCis8L2RkPgorPGR0IGlkPSJwZ3NxbCI+PGk+cGdzcWw8L2k+PC9kdD4KKzxkZD4KKworPHA+TmVnb2NqYWNqYSBodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOC4zL3N0YXRpYy9wcm90b2NvbC1mbG93Lmh0bWwjQUVONzM5ODI8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InBvcDMiPjxpPnBvcDM8L2k+PC9kdD4KKzxkZD4KKworPHA+TmVnb2NqYWNqYSBSRkMgMjQ0OSAtIDxpPlBPUDMgRXh0ZW5zaW9uIE1lY2hhbmlzbTwvaT48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3h5Ij48aT5wcm94eTwvaT48L2R0PgorPGRkPgorCis8cD5Qcnpla2F6eXdhbmllIGFkcmVzdSBJUCBoYXByb3h5IGh0dHA6Ly9oYXByb3h5LjF3dC5ldS9kb3dubG9hZC8xLjUvZG9jL3Byb3h5LXByb3RvY29sLnR4dDwvcD4KKworPC9kZD4KKzxkdCBpZD0ic210cCI+PGk+c210cDwvaT48L2R0PgorPGRkPgorCis8cD5OZWdvY2phY2phIFJGQyAyNDg3IC0gPGk+U01UUCBTZXJ2aWNlIEV4dGVuc2lvbiBmb3IgU2VjdXJlIFNNVFAgb3ZlciBUTFM8L2k+PC9wPgorCis8L2RkPgorPGR0IGlkPSJzb2NrcyI+PGk+c29ja3M8L2k+PC9kdD4KKzxkZD4KKworPHA+V3NwaWVyYW55IGplc3QgcHJvdG9rJm9hY3V0ZTsmI3gxNDI7IFNPQ0tTIHcgd2Vyc2phY2ggNCwgNGEgaSA1LiBQcm90b2smb2FjdXRlOyYjeDE0MjsgU09DS1MgZW5rYXBzdWxvd2FueSBqZXN0IHcgcHJvdG9rb2xlIFNTTC9UTFMsIHdpJiN4MTE5O2MgYWRyZXMgc2Vyd2VyYSBkb2NlbG93ZWdvIG5pZSBqZXN0IHdpZG9jem55IGRsYSBuYXBhc3RuaWthIHByemVjaHd5dHVqJiN4MTA1O2NlZ28gcnVjaCBzaWVjaW93eS48L3A+CisKKzxwPjxpPmh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L3NvY2tzNC5wcm90b2NvbDwvaT48L3A+CisKKzxwPjxpPmh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L3NvY2tzNGEucHJvdG9jb2w8L2k+PC9wPgorCis8cD5OaWUgamVzdCB3c3BpZXJhbmEga29tZW5kYSBCSU5EIHByb3Rva28mI3gxNDI7dSBTT0NLUy4gUHJ6ZXMmI3gxNDI7YW5hIHdhcnRvJiN4MTVCOyYjeDEwNzsgcGFyYW1ldHJ1IFVTRVJJRCBqZXN0IGlnbm9yb3dhbmEuPC9wPgorCis8cD5TZWtjamEgUFJaWUsmI3gxNDE7QURZIHphd2llcmEgcHJ6eWsmI3gxNDI7YWRvd2UgcGxpa2kga29uZmlndXJhY3lqbmUgVlBOYSB6YnVkb3dhbmVnbyB3IG9wYXJjaXUgbyBzenlmcm93YW55IHByb3RvayZvYWN1dGU7JiN4MTQyOyBTT0NLUy48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8L2RkPgorPGR0IGlkPSJwcm90b2NvbEF1dGhlbnRpY2F0aW9uLWJhc2ljLW50bG0iPjxiPnByb3RvY29sQXV0aGVudGljYXRpb248L2I+ID0gYmFzaWMgfCBudGxtPC9kdD4KKzxkZD4KKworPHA+cm9kemFqIHV3aWVyenl0ZWxuaWVuaWEgZG8gbmVnb2NqYWNqaSBwcm90b2tvJiN4MTQyO3U8L3A+CisKKzxwPk9iZWNuaWUgdHlwIHV3aWVyenl0ZWxuaWVuaWEgbWEgemFzdG9zb3dhbmllIHd5JiN4MTQyOyYjeDEwNTtjem5pZSB3IHByb3Rva29sZSAmIzM5O2Nvbm5lY3QmIzM5Oy48L3A+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogYmFzaWM8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sSG9zdC1IT1NUOlBPUlQiPjxiPnByb3RvY29sSG9zdDwvYj4gPSBIT1NUOlBPUlQ8L2R0PgorPGRkPgorCis8cD5hZHJlcyBkb2NlbG93eSBkbyBuZWdvY2phY2ppIHByb3Rva28mI3gxNDI7dTwvcD4KKworPHA+PGk+cHJvdG9jb2xIb3N0PC9pPiBva3JlJiN4MTVCO2xhIGRvY2Vsb3d5IHNlcndlciBTU0wsIGRvIGt0Jm9hY3V0ZTtyZWdvIHBvJiN4MTQyOyYjeDEwNTtjenkmI3gxMDc7IG1hIHNpJiN4MTE5OyBwcm94eS4gTmllIGplc3QgdG8gYWRyZXMgc2Vyd2VyYSBwcm94eSwgZG8ga3Qmb2FjdXRlO3JlZ28gcG8mI3gxNDI7JiN4MTA1O2N6ZW5pZSB6ZXN0YXdpYSA8Yj5zdHVubmVsPC9iPi4gQWRyZXMgc2Vyd2VyYSBwcm94eSBwb3dpbmllbiBieSYjeDEwNzsgb2tyZSYjeDE1Qjtsb255IHByenkgcG9tb2N5IG9wY2ppICYjMzk7Y29ubmVjdCYjMzk7LjwvcD4KKworPHA+VyBvYmVjbmVqIHdlcnNqaSBhZHJlcyBkb2NlbG93eSBwcm90b2tvJiN4MTQyO3UgbWEgemFzdG9zb3dhbmllIHd5JiN4MTQyOyYjeDEwNTtjem5pZSB3IHByb3Rva29sZSAmIzM5O2Nvbm5lY3QmIzM5Oy48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InByb3RvY29sUGFzc3dvcmQtSEFTTyI+PGI+cHJvdG9jb2xQYXNzd29yZDwvYj4gPSBIQVMmI3gxNDE7TzwvZHQ+Cis8ZGQ+CisKKzxwPmhhcyYjeDE0MjtvIGRvIG5lZ29jamFjamkgcHJvdG9rbyYjeDE0Mjt1PC9wPgorCis8L2RkPgorPGR0IGlkPSJwcm90b2NvbFVzZXJuYW1lLVVZVEtPV05JSyI+PGI+cHJvdG9jb2xVc2VybmFtZTwvYj4gPSBVJiN4MTdCO1lUS09XTklLPC9kdD4KKzxkZD4KKworPHA+bmF6d2EgdSYjeDE3Qzt5dGtvd25pa2EgZG8gbmVnb2NqYWNqaSBwcm90b2tvJiN4MTQyO3U8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlBTS2lkZW50aXR5LVRPU0FNTyI+PGI+UFNLaWRlbnRpdHk8L2I+ID0gVE8mI3gxN0I7U0FNTyYjeDE1QTsmI3gxMDY7PC9kdD4KKzxkZD4KKworPHA+dG8mI3gxN0M7c2FtbyYjeDE1QjsmI3gxMDc7IGtsaWVudGEgUFNLPC9wPgorCis8cD48aT5QU0tpZGVudGl0eTwvaT4gbW8mI3gxN0M7ZSB6b3N0YSYjeDEwNzsgdSYjeDE3Qzt5dGUgdyBzZWtjamFjaCBrbGllbmNraWNoIGRvIHd5YnJhbmlhIHRvJiN4MTdDO3NhbW8mI3gxNUI7Y2kgdSYjeDE3Qzt5dGVqIGRvIHV3aWVyenl0ZWxuaWVuaWEgUFNLLiBPcGNqYSBqZXN0IGlnbm9yb3dhbmEgdyBzZWtjamFjaCBzZXJ3ZXJvd3ljaC48L3A+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogcGllcndzemEgdG8mI3gxN0M7c2FtbyYjeDE1QjsmI3gxMDc7IHpkZWZpbmlvd2FuYSB3IHBsaWt1IDxpPlBTS3NlY3JldHM8L2k+PC9wPgorCis8L2RkPgorPGR0IGlkPSJQU0tzZWNyZXRzLVBMSUsiPjxiPlBTS3NlY3JldHM8L2I+ID0gUExJSzwvZHQ+Cis8ZGQ+CisKKzxwPnBsaWsgeiB0byYjeDE3QztzYW1vJiN4MTVCO2NpYW1pIGkga2x1Y3phbWkgUFNLPC9wPgorCis8cD5LYSYjeDE3QztkYSBsaW5pYSBwbGlrdSBqZXN0IHcgbmFzdCYjeDExOTtwdWomI3gxMDU7Y3ltIGZvcm1hY2llOjwvcD4KKworPHByZT48Y29kZT4gICAgVE8mI3gxN0I7U0FNTyYjeDE1QTsmI3gxMDY7OktMVUNaPC9jb2RlPjwvcHJlPgorCis8cD5LbHVjeiBtdXNpIGJ5JiN4MTA3OyBtaWUmI3gxMDc7IHByenluYWptbmllaiAyMCB6bmFrJm9hY3V0ZTt3LiBOYWxlJiN4MTdDO3kgb2dyYW5pY3p5JiN4MTA3OyBkb3N0JiN4MTE5O3AgZG8gY3p5dGFuaWEgbHViIHBpc2FuaWEgZG8gdGVnbyBwbGlrdS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InB0eS15ZXMtbm8tdHlsa28tVW5peCI+PGI+cHR5PC9iPiA9IHllcyB8IG5vICh0eWxrbyBVbml4KTwvZHQ+Cis8ZGQ+CisKKzxwPmFsb2t1aiBwc2V1ZG90ZXJtaW5hbCBkbGEgcHJvZ3JhbXUgdXJ1Y2hhbWlhbmVnbyB3IG9wY2ppICYjMzk7ZXhlYyYjMzk7PC9wPgorCis8L2RkPgorPGR0IGlkPSJyZWRpcmVjdC1IT1NUOi1QT1JUIj48Yj5yZWRpcmVjdDwvYj4gPSBbSE9TVDpdUE9SVDwvZHQ+Cis8ZGQ+CisKKzxwPnByemVraWVydWoga2xpZW50YSwga3Qmb2FjdXRlO3JlbXUgbmllIHVkYSYjeDE0MjtvIHNpJiN4MTE5OyBwb3ByYXduaWUgdXdpZXJ6eXRlbG5pJiN4MTA3OyBwcnp5IHBvbW9jeSBjZXJ0eWZpa2F0dTwvcD4KKworPHA+T3BjamEgZHppYSYjeDE0MjthIHd5JiN4MTQyOyYjeDEwNTtjem5pZSB3IHRyeWJpZSBzZXJ3ZXJhLiBDeiYjeDExOTsmI3gxNUI7JiN4MTA3OyBuZWdvY2phY2ppIHByb3Rva28mI3gxNDI7Jm9hY3V0ZTt3IGplc3Qgbmlla29tcGF0eWJpbG5hIHogb3BjaiYjeDEwNTsgPGk+cmVkaXJlY3Q8L2k+LjwvcD4KKworPC9kZD4KKzxkdCBpZD0icmVuZWdvdGlhdGlvbi15ZXMtbm8iPjxiPnJlbmVnb3RpYXRpb248L2I+ID0geWVzIHwgbm88L2R0PgorPGRkPgorCis8cD5wb3p3YWxhaiBuYSByZW5lZ29jamFjaiYjeDExOTsgU1NMPC9wPgorCis8cD5XJiN4MTVCO3Imb2FjdXRlO2QgemFzdG9zb3dhJiN4MTQ0OyByZW5lZ29jamFjamkgU1NMIHMmI3gxMDU7IG5pZWt0Jm9hY3V0ZTtyZSBzY2VuYXJpdXN6ZSB1d2llcnp5dGVsbmllbmlhLCBvcmF6IHJlbmVnb2NqYWNqYSBrbHVjenkgZGxhIGQmI3gxNDI7dWdvdHJ3YSYjeDE0Mjt5Y2ggcG8mI3gxNDI7JiN4MTA1O2N6ZSYjeDE0NDsuPC9wPgorCis8cD5aIGRydWdpZWogc3Ryb255IHcmI3gxNDI7YXNubyYjeDE1QjsmI3gxMDc7IG5hIG1vJiN4MTdDO2UgdSYjeDE0MjthdHdpJiN4MTA3OyB0cnl3aWFsbnkgYXRhayBEb1MgcG9wcnpleiB3eWdlbmVyb3dhbmllIG9iY2kmI3gxMDU7JiN4MTdDO2VuaWEgcHJvY2Vzb3JhOjwvcD4KKworPHA+aHR0cDovL3ZpbmNlbnQuYmVybmF0LmltL2VuL2Jsb2cvMjAxMS1zc2wtZG9zLW1pdGlnYXRpb24uaHRtbDwvcD4KKworPHA+V2FydG8gemF1d2EmI3gxN0M7eSYjeDEwNzssICYjeDE3QztlIHphYmxva293YW5pZSByZW5lZ29jamFjamkgU1NMIG5pZSB6ZWJlenBpZWN6YSB3IHBlJiN4MTQyO25pIHByemVkIG9waXNhbnltIHByb2JsZW1lbS48L3A+CisKKzxwPmRvbXkmI3gxNUI7bG5pZTogeWVzIChvIGlsZSB3c3BpZXJhbmUgcHJ6ZXogPGI+T3BlblNTTDwvYj4pPC9wPgorCis8L2RkPgorPGR0IGlkPSJyZXNldC15ZXMtbm8iPjxiPnJlc2V0PC9iPiA9IHllcyB8IG5vPC9kdD4KKzxkZD4KKworPHA+c3lnbmFsaXp1aiB3eXN0JiN4MTA1O3BpZW5pZSBiJiN4MTQyOyYjeDExOTtkdSBwcnp5IHBvbW9jeSBmbGFnaSBUQ1AgUlNUPC9wPgorCis8cD5PcGNqYSBuaWUgamVzdCB3c3BpZXJhbmEgbmEgbmlla3Qmb2FjdXRlO3J5Y2ggcGxhdGZvcm1hY2guPC9wPgorCis8cD5kb215JiN4MTVCO2xuaWU6IHllczwvcD4KKworPC9kZD4KKzxkdCBpZD0icmV0cnkteWVzLW5vIj48Yj5yZXRyeTwvYj4gPSB5ZXMgfCBubzwvZHQ+Cis8ZGQ+CisKKzxwPnBvJiN4MTQyOyYjeDEwNTtjeiBwb25vd25pZSBzZWtjaiYjeDExOTsgY29ubmVjdCtleGVjIHBvIHJveiYjeDE0MjsmI3gxMDU7Y3plbml1PC9wPgorCis8cD5kb215JiN4MTVCO2xuaWU6IG5vPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXNzaW9uQ2FjaGVTaXplLUxJQ1pCQV9QT1pZQ0pJX0NBQ0hFIj48Yj5zZXNzaW9uQ2FjaGVTaXplPC9iPiA9IExJQ1pCQV9QT1pZQ0pJX0NBQ0hFPC9kdD4KKzxkZD4KKworPHA+cm96bWlhciBwYW1pJiN4MTE5O2NpIHBvZHImI3gxMTk7Y3puZWogc2VzamkgU1NMPC9wPgorCis8cD5QYXJhbWV0ciBva3JlJiN4MTVCO2xhIG1ha3N5bWFsbiYjeDEwNTsgbGljemImI3gxMTk7IHBvenljamkgd2V3biYjeDExOTt0cnpuZWogcGFtaSYjeDExOTtjaSBwb2RyJiN4MTE5O2N6bmVqIHNlc2ppLjwvcD4KKworPHA+V2FydG8mI3gxNUI7JiN4MTA3OyAwIG96bmFjemEgYnJhayBvZ3JhbmljemVuaWEgcm96bWlhcnUuIE5pZSBqZXN0IHRvIHphbGVjYW5lIGRsYSBzeXN0ZW0mb2FjdXRlO3cgcHJvZHVrY3lqbnljaCB6IHV3YWdpIG5hIHJ5enlrbyBhdGFrdSBEb1MgcHJ6ZXogd3ljemVycGFuaWUgcGFtaSYjeDExOTtjaSBSQU0uPC9wPgorCis8L2RkPgorPGR0IGlkPSJzZXNzaW9uQ2FjaGVUaW1lb3V0LUxJQ1pCQV9TRUtVTkQiPjxiPnNlc3Npb25DYWNoZVRpbWVvdXQ8L2I+ID0gTElDWkJBX1NFS1VORDwvZHQ+Cis8ZGQ+CisKKzxwPnByemV0ZXJtaW5vd2FuaWUgcGFtaSYjeDExOTtjaSBwb2RyJiN4MTE5O2N6bmVqIHNlc2ppIFNTTDwvcD4KKworPHA+UGFyYW1ldHIgb2tyZSYjeDE1QjtsYSBjemFzIHcgc2VrdW5kYWNoLCBwbyBrdCZvYWN1dGU7cnltIHNlc2phIFNTTCB6b3N0YW5pZSB1c3VuaSYjeDExOTt0YSB6IHBhbWkmI3gxMTk7Y2kgcG9kciYjeDExOTtjem5lai48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNlc3Npb25kLUhPU1Q6UE9SVCI+PGI+c2Vzc2lvbmQ8L2I+ID0gSE9TVDpQT1JUPC9kdD4KKzxkZD4KKworPHA+YWRyZXMgc2Vzc2lvbmQgLSBzZXJ2ZXJhIGNhY2hlIHNlc2ppIFNTTDwvcD4KKworPC9kZD4KKzxkdCBpZD0ic3NsVmVyc2lvbi1XRVJTSkFfU1NMIj48Yj5zc2xWZXJzaW9uPC9iPiA9IFdFUlNKQV9TU0w8L2R0PgorPGRkPgorCis8cD53ZXJzamEgcHJvdG9rbyYjeDE0Mjt1IFNTTDwvcD4KKworPHA+V3NwaWVyYW5lIG9wY2plOiBhbGwsIFNTTHYyLCBTU0x2MywgVExTdjEsIFRMU3YxLjEsIFRMU3YxLjI8L3A+CisKKzxwPkRvc3QmI3gxMTk7cG5vJiN4MTVCOyYjeDEwNzsga29ua3JldG55Y2ggcHJvdG9rbyYjeDE0Mjsmb2FjdXRlO3cgemFsZSYjeDE3Qzt5IG9kIHUmI3gxN0M7eXRlaiB3ZXJzamkgT3BlblNTTC4gU3RhcnN6ZSB3ZXJzamUgT3BlblNTTCBuaWUgd3NwaWVyYWomI3gxMDU7IFRMU3YxLjEgaSBUTFN2MS4yLiBOb3dzemUgd2Vyc2plIE9wZW5TU0wgbmllIHdzcGllcmFqJiN4MTA1OyBTU0x2Mi48L3A+CisKKzxwPlByemVzdGFyemEmI3gxNDI7ZSBwcm90b2tvJiN4MTQyO3kgU1NMdjIgaSBTU0x2MyBzJiN4MTA1OyBkb215JiN4MTVCO2xuaWUgd3kmI3gxNDI7JiN4MTA1O2N6b25lLiBTemN6ZWcmb2FjdXRlOyYjeDE0Mjtvd2UgaW5mb3JtYWNqZSBkb3N0JiN4MTE5O3BuZSBzJiN4MTA1OyB3IG9waXNpZSBvcGNqaSA8Yj5vcHRpb25zPC9iPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InN0YWNrLUxJQ1pCQV9CQUpUVy16LXd5anRraWVtLW1vZGVsdS1GT1JLIj48Yj5zdGFjazwvYj4gPSBMSUNaQkFfQkFKVCZPYWN1dGU7VyAoeiB3eWomI3gxMDU7dGtpZW0gbW9kZWx1IEZPUkspPC9kdD4KKzxkZD4KKworPHA+cm96bWlhciBzdG9zdSBwcm9jZXNvcmEgdyYjeDEwNTt0a3U8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlRJTUVPVVRidXN5LUxJQ1pCQV9TRUtVTkQiPjxiPlRJTUVPVVRidXN5PC9iPiA9IExJQ1pCQV9TRUtVTkQ8L2R0PgorPGRkPgorCis8cD5jemFzIG9jemVraXdhbmlhIG5hIHNwb2R6aWV3YW5lIGRhbmU8L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlRJTUVPVVRjbG9zZS1MSUNaQkFfU0VLVU5EIj48Yj5USU1FT1VUY2xvc2U8L2I+ID0gTElDWkJBX1NFS1VORDwvZHQ+Cis8ZGQ+CisKKzxwPmN6YXMgb2N6ZWtpd2FuaWEgbmEgY2xvc2Vfbm90aWZ5ICh1c3RhdyBuYSAwLCBqZSYjeDE3QztlbGkga2xpZW50ZW0gamVzdCBNU0lFKTwvcD4KKworPC9kZD4KKzxkdCBpZD0iVElNRU9VVGNvbm5lY3QtTElDWkJBX1NFS1VORCI+PGI+VElNRU9VVGNvbm5lY3Q8L2I+ID0gTElDWkJBX1NFS1VORDwvZHQ+Cis8ZGQ+CisKKzxwPmN6YXMgb2N6ZWtpd2FuaWEgbmEgbmF3aSYjeDEwNTt6YW5pZSBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhPC9wPgorCis8L2RkPgorPGR0IGlkPSJUSU1FT1VUaWRsZS1MSUNaQkFfU0VLVU5EIj48Yj5USU1FT1VUaWRsZTwvYj4gPSBMSUNaQkFfU0VLVU5EPC9kdD4KKzxkZD4KKworPHA+bWFrc3ltYWxueSBjemFzIHV0cnp5bXl3YW5pYSBiZXpjenlubmVnbyBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhPC9wPgorCis8L2RkPgorPGR0IGlkPSJ0cmFuc3BhcmVudC1ub25lLXNvdXJjZS1kZXN0aW5hdGlvbi1ib3RoLXR5bGtvLVVuaXgiPjxiPnRyYW5zcGFyZW50PC9iPiA9IG5vbmUgfCBzb3VyY2UgfCBkZXN0aW5hdGlvbiB8IGJvdGggKHR5bGtvIFVuaXgpPC9kdD4KKzxkZD4KKworPHA+dHJ5YiBwcnplenJvY3p5c3RlZ28gcHJveHkgbmEgd3NwaWVyYW55Y2ggcGxhdGZvcm1hY2g8L3A+CisKKzxwPldzcGllcmFuZSBvcGNqZTo8L3A+CisKKzxkbD4KKworPGR0IGlkPSJub25lIj48Yj5ub25lPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPlphYmxva3VqIHdzcGFyY2llIGRsYSBwcnplenJvY3p5c3RhZ28gcHJveHkuIEplc3QgdG8gd2FydG8mI3gxNUI7JiN4MTA3OyBkb215JiN4MTVCO2xuYS48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InNvdXJjZSI+PGI+c291cmNlPC9iPjwvZHQ+Cis8ZGQ+CisKKzxwPlByemVwaXN6IGFkcmVzLCBhYnkgbmF3aSYjeDEwNTt6eXdhbmUgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pZSB3eWRhd2EmI3gxNDI7byBzaSYjeDExOTsgcG9jaG9kemkmI3gxMDc7IGJlenBvJiN4MTVCO3JlZG5pbyBvZCBrbGllbnRhLCBhIG5pZSBvZCBwcm9ncmFtdSA8Yj5zdHVubmVsPC9iPi48L3A+CisKKzxwPk9wY2phIGplc3QgYWt0dWFsbmllIG9icyYjeDE0Mjt1Z2l3YW5hIHc6PC9wPgorCis8ZGw+CisKKzxkdCBpZD0iVHJ5YmllLXpkYWxueW0tb3BjamEtY29ubmVjdC13LXN5c3RlbWllLUxpbnV4LTIuNi4yOCI+VHJ5YmllIHpkYWxueW0gKG9wY2phIDxpPmNvbm5lY3Q8L2k+KSB3IHN5c3RlbWllIDxpPkxpbnV4ICZndDs9Mi42LjI4PC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPktvbmZpZ3VyYWNqYSB3eW1hZ2EgbmFzdCYjeDExOTtwdWomI3gxMDU7Y3ljaCB1c3Rhd2llJiN4MTQ0OyBpcHRhYmxlcyBvcmF6IHJvdXRpbmd1IChuYSBwcnp5ayYjeDE0MjthZCB3IHBsaWt1IC9ldGMvcmMubG9jYWwgbHViIGFuYWxvZ2ljem55bSk6PC9wPgorCis8cHJlPjxjb2RlPiAgICBpcHRhYmxlcyAtdCBtYW5nbGUgLU4gRElWRVJUCisgICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBSRVJPVVRJTkcgLXAgdGNwIC1tIHNvY2tldCAtaiBESVZFUlQKKyAgICBpcHRhYmxlcyAtdCBtYW5nbGUgLUEgRElWRVJUIC1qIE1BUksgLS1zZXQtbWFyayAxCisgICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIERJVkVSVCAtaiBBQ0NFUFQKKyAgICBpcCBydWxlIGFkZCBmd21hcmsgMSBsb29rdXAgMTAwCisgICAgaXAgcm91dGUgYWRkIGxvY2FsIDAuMC4wLjAvMCBkZXYgbG8gdGFibGUgMTAwCisgICAgZWNobyAwICZndDsvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi9sby9ycF9maWx0ZXI8L2NvZGU+PC9wcmU+CisKKzxwPktvbmZpZ3VyYWNqYSB0YSB3eW1hZ2EsIGFieSA8Yj5zdHVubmVsPC9iPiBieSYjeDE0Mjsgd3lrb255d2FueSBqYWtvIHJvb3QgaSBiZXogb3BjamkgPGk+c2V0dWlkPC9pPi48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9IlRyeWJpZS16ZGFsbnltLW9wY2phLWNvbm5lY3Qtdy1zeXN0ZW1pZS1MaW51eC0yLjIueCI+VHJ5YmllIHpkYWxueW0gKG9wY2phIDxpPmNvbm5lY3Q8L2k+KSB3IHN5c3RlbWllIDxpPkxpbnV4IDIuMi54PC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPktvbmZpZ3VyYWNqYSB0YSB3eW1hZ2Egc2tvbXBpbG93YW5pYSBqJiN4MTA1O2RyYSB6IG9wY2omI3gxMDU7IDxpPnRyYW5zcGFyZW50IHByb3h5PC9pPi4gRG9jZWxvd2EgdXMmI3gxNDI7dWdhIG11c2kgYnkmI3gxMDc7IHVtaWVzemN6b25hIG5hIG9zb2JuZWogbWFzenluaWUsIGRvIGt0Jm9hY3V0ZTtyZWogcm91dGluZyBraWVyb3dhbnkgamVzdCBwb3ByemV6IHNlcndlciA8Yj5zdHVubmVsYTwvYj4uPC9wPgorCis8cD5Eb2RhdGtvd28gPGI+c3R1bm5lbDwvYj4gcG93aW5pZW4gYnkmI3gxMDc7IHd5a29ueXdhbnkgamFrbyByb290IGkgYmV6IG9wY2ppIDxpPnNldHVpZDwvaT4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJUcnliaWUtemRhbG55bS1vcGNqYS1jb25uZWN0LXctc3lzdGVtaWUtRnJlZUJTRC04LjAiPlRyeWJpZSB6ZGFsbnltIChvcGNqYSA8aT5jb25uZWN0PC9pPikgdyBzeXN0ZW1pZSA8aT5GcmVlQlNEICZndDs9OC4wPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPktvbmZpZ3VyYWNqYSB0YSB3eW1hZ2Egc2tvbmZpZ3Vyb3dhbmlhIGZpcmV3YWxsYSBpIHJvdXRpbmd1LiA8Yj5zdHVubmVsPC9iPiBtdXNpIGJ5JiN4MTA3OyB3eWtvbnl3YW55IGpha28gcm9vdCBpIGJleiBvcGNqaSA8aT5zZXR1aWQ8L2k+LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iVHJ5YmllLWxva2FsbnltLW9wY2phLWV4ZWMiPlRyeWJpZSBsb2thbG55bSAob3BjamEgPGk+ZXhlYzwvaT4pPC9kdD4KKzxkZD4KKworPHA+S29uZmlndXJhY2phIHRhIGplc3QgcmVhbGl6b3dhbmEgcHJ6eSBwb21vY3kgYmlibGlvdGVraSA8aT5saWJzdHVubmVsLnNvPC9pPi4gRG8gemEmI3gxNDI7YWRvd2FuaWEgYmlibGlvdGVraSB3eWtvcnp5c3R5d2FuYSBqZXN0IHptaWVubmEgJiN4MTVCO3JvZG93aXNrb3dhIF9STERfTElTVCBuYSBwbGF0Zm9ybWllIFRydTY0IGx1YiBMRF9QUkVMT0FEIG5hIGlubnljaCBwbGF0Zm9ybWFjaC48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8L2RkPgorPGR0IGlkPSJkZXN0aW5hdGlvbiI+PGk+ZGVzdGluYXRpb248L2k+PC9kdD4KKzxkZD4KKworPHA+T3J5Z2luYWxueSBhZHJlcyBkb2NlbG93eSBqZXN0IHUmI3gxN0M7eXdhbnkgemFtaWFzdCBvcGNqaSA8aT5jb25uZWN0PC9pPi48L3A+CisKKzxwPlByenlrJiN4MTQyO2Fkb3dhbmEga29uZmlndXJhY2phIHByemV6cm9jenlzdGVnbyBhZHJlc3UgZG9jZWxvd2Vnbzo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIFt0cmFuc3BhcmVudF0KKyAgICBjbGllbnQ9eWVzCisgICAgYWNjZXB0PSZsdDtwb3J0X3N0dW5uZWxhJmd0OworICAgIHRyYW5zcGFyZW50PWRlc3RpbmF0aW9uPC9jb2RlPjwvcHJlPgorCis8cD5Lb25maWd1cmFjamEgd3ltYWdhIHVzdGF3aWUmI3gxNDQ7IGlwdGFibGVzLCBuYSBwcnp5ayYjeDE0MjthZCB3IHBsaWt1IC9ldGMvcmMubG9jYWwgbHViIGFuYWxvZ2ljem55bS48L3A+CisKKzxwPlcgcHJ6eXBhZGt1IGRvY2Vsb3dlaiB1cyYjeDE0Mjt1Z2kgdW1pZXN6Y3pvbmVqIG5hIHRlaiBzYW1laiBtYXN6eW5pZTo8L3A+CisKKzxwcmU+PGNvZGU+ICAgIC9zYmluL2lwdGFibGVzIC10IG5hdCAtSSBPVVRQVVQgLXAgdGNwIC0tZHBvcnQgJmx0O3BvcnRfcHJ6ZWtpZXJvd2FueSZndDsgXAorICAgICAgICAtbSAhIC0tdWlkLW93bmVyICZsdDtpZGVudHlmaWthdG9yX3UmI3gxN0M7eXRrb3duaWthX3N0dW5uZWxhJmd0OyBcCisgICAgICAgIC1qIEROQVQgLS10by1kZXN0aW5hdGlvbiAmbHQ7bG9rYWxuZV9pcCZndDs6Jmx0O2xva2FsbnlfcG9ydCZndDs8L2NvZGU+PC9wcmU+CisKKzxwPlcgcHJ6eXBhZGt1IGRvY2Vsb3dlaiB1cyYjeDE0Mjt1Z2kgdW1pZXN6Y3pvbmVqIG5hIHpkYWxuZWogbWFzenluaWU6PC9wPgorCis8cHJlPjxjb2RlPiAgICAvc2Jpbi9pcHRhYmxlcyAtSSBJTlBVVCAtaSBldGgwIC1wIHRjcCAtLWRwb3J0ICZsdDtwb3J0X3N0dW5uZWxhJmd0OyAtaiBBQ0NFUFQKKyAgICAvc2Jpbi9pcHRhYmxlcyAtdCBuYXQgLUkgUFJFUk9VVElORyAtcCB0Y3AgLS1kcG9ydCAmbHQ7cG9ydF9wcnpla2llcm93YW55Jmd0OyBcCisgICAgICAgIC1pIGV0aDAgLWogRE5BVCAtLXRvLWRlc3RpbmF0aW9uICZsdDtsb2thbG5lX2lwJmd0OzombHQ7cG9ydF9zdHVubmVsYSZndDs8L2NvZGU+PC9wcmU+CisKKzxwPlByemV6cm9jenlzdHkgYWRyZXMgZG9jZWxvd3kgamVzdCBha3R1YWxuaWUgd3NwaWVyYW55IHd5JiN4MTQyOyYjeDEwNTtjem5pZSB3IHN5c3RlbWllIExpbnV4LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iYm90aCI+PGk+Ym90aDwvaT48L2R0PgorPGRkPgorCis8cD5VJiN4MTdDO3lqIHByemV6cm9jenlzdGVnbyBwcm94eSB6YXImb2FjdXRlO3dubyBkbGEgYWRyZXN1ICYjeDE3QTtyJm9hY3V0ZTtkJiN4MTQyO293ZWdvIGphayBpIGRvY2Vsb3dlZ28uPC9wPgorCis8L2RkPgorPC9kbD4KKworPHA+RGxhIHphcGV3bmllbmlhIGtvbXBhdHliaWxubyYjeDE1QjtjaSB6IHdjemUmI3gxNUI7bmllanN6eW1pbSB3ZXJzamFtaSB3c3BpZXJhbmUgcyYjeDEwNTsgZHdpZSBkb2RhdGtvd2Ugb3BjamU6PC9wPgorCis8ZGw+CisKKzxkdCBpZD0ieWVzIj48aT55ZXM8L2k+PC9kdD4KKzxkZD4KKworPHA+T3BjamEgem9zdGEmI3gxNDI7YSBwcnplbWlhbm93YW5hIG5hIDxpPnNvdXJjZTwvaT4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJubyI+PGk+bm88L2k+PC9kdD4KKzxkZD4KKworPHA+T3BjamEgem9zdGEmI3gxNDI7YSBwcnplbWlhbm93YW5hIG5hIDxpPm5vbmU8L2k+LjwvcD4KKworPC9kZD4KKzwvZGw+CisKKzwvZGQ+Cis8ZHQgaWQ9InZlcmlmeS1QT1pJT00iPjxiPnZlcmlmeTwvYj4gPSBQT1pJT008L2R0PgorPGRkPgorCis8cD53ZXJ5ZmlrdWogY2VydHlmaWthdCBkcnVnaWVqIHN0cm9ueSBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhPC9wPgorCis8ZGw+CisKKzxkdCBpZD0icG96aW9tLTAiPjxpPnBvemlvbSAwPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPnphcnomI3gxMDU7ZGFqIGNlcnR5ZmlrYXR1IGkgemlnbm9ydWogZ288L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9InBvemlvbS0xIj48aT5wb3ppb20gMTwvaT48L2R0PgorPGRkPgorCis8cD53ZXJ5ZmlrdWosIGplJiN4MTdDO2VsaSB6b3N0YSYjeDE0MjsgcHJ6ZWRzdGF3aW9ueTwvcD4KKworPC9kZD4KKzxkdCBpZD0icG96aW9tLTIiPjxpPnBvemlvbSAyPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPndlcnlmaWt1aiB6IHphaW5zdGFsb3dhbnltIGNlcnR5ZmlrYXRlbSBDZW50cnVtIENlcnR5ZmlrYWNqaTwvcD4KKworPC9kZD4KKzxkdCBpZD0icG96aW9tLTMiPjxpPnBvemlvbSAzPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPndlcnlmaWt1aiB6IGxva2FsbmllIHphaW5zdGFsb3dhbnltIGNlcnR5ZmlrYXRlbSBkcnVnaWVqIHN0cm9ueTwvcD4KKworPC9kZD4KKzxkdCBpZD0icG96aW9tLTQiPjxpPnBvemlvbSA0PC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPndlcnlmaWt1aiB6IGNlcnR5ZmlrYXRlbSBkcnVnaWVqIHN0cm9ueSBpZ25vcnVqJiN4MTA1O2MgJiN4MTQyO2EmI3gxNDQ7Y3VjaCBDQTwvcD4KKworPC9kZD4KKzxkdCBpZD0iZG9teWxuaWUiPjxpPmRvbXkmI3gxNUI7bG5pZTwvaT48L2R0PgorPGRkPgorCis8cD5uaWUgd2VyeWZpa3VqPC9wPgorCis8L2RkPgorPC9kbD4KKworPC9kZD4KKzwvZGw+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJaV1JBQ0FOQS1XQVJUTyI+WldSQUNBTkEgV0FSVE8mI3gxNUE7JiN4MTA2OzwvaDE+PC9hPgorCis8cD48Yj5zdHVubmVsPC9iPiB6d3JhY2EgemVybyB3IHByenlwYWRrdSBzdWtjZXN1LCBsdWIgd2FydG8mI3gxNUI7JiN4MTA3OyBuaWV6ZXJvdyYjeDEwNTsgdyBwcnp5cGFka3UgYiYjeDE0MjsmI3gxMTk7ZHUuPC9wPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iU0lHTkFZIj5TSUdOQSYjeDE0MTtZPC9oMT48L2E+CisKKzxwPk5hc3QmI3gxMTk7cHVqJiN4MTA1O2NlIHN5Z25hJiN4MTQyO3kgbW9nJiN4MTA1OyBieSYjeDEwNzsgdSYjeDE3Qzt5dGUgZG8gc3Rlcm93YW5pYSBwcm9ncmFtZW0gdyBzeXN0ZW1pZSBVbml4OjwvcD4KKworPGRsPgorCis8ZHQgaWQ9IlNJR0hVUCI+U0lHSFVQPC9kdD4KKzxkZD4KKworPHA+WmEmI3gxNDI7YWR1aiBwb25vd25pZSBwbGlrIGtvbmZpZ3VyYWN5am55LjwvcD4KKworPHA+Tmlla3Qmb2FjdXRlO3JlIGdsb2JhbG5lIG9wY2plIG5pZSBiJiN4MTE5O2QmI3gxMDU7IHByemUmI3gxNDI7YWRvd2FuZTo8L3A+CisKKzx1bD4KKworPGxpPjxwPmNocm9vdDwvcD4KKworPC9saT4KKzxsaT48cD5mb3JlZ3JvdW5kPC9wPgorCis8L2xpPgorPGxpPjxwPnBpZDwvcD4KKworPC9saT4KKzxsaT48cD5zZXRnaWQ8L3A+CisKKzwvbGk+Cis8bGk+PHA+c2V0dWlkPC9wPgorCis8L2xpPgorPC91bD4KKworPHA+SmUmI3gxN0M7ZWxpIHd5a29yenlzdHl3YW5hIGplc3Qgb3BjamEgJiMzOTtzZXR1aWQmIzM5OyA8Yj5zdHVubmVsPC9iPiBuaWUgYiYjeDExOTtkemllIG0mb2FjdXRlO2cmI3gxNDI7IHphJiN4MTQyO2Fkb3dhJiN4MTA3OyBwb25vd25pZSBrb25maWd1cmFjamkgd3lrb3J6eXN0dWomI3gxMDU7Y2VqIHVwcnp5d2lsZWpvd2FuZSAoJmx0OzEwMjQpIHBvcnR5LjwvcD4KKworPHA+SmUmI3gxN0M7ZWxpIHd5a29yenlzdHl3YW5hIGplc3Qgb3BjamEgJiMzOTtjaHJvb3QmIzM5OyA8Yj5zdHVubmVsPC9iPiBiJiN4MTE5O2R6aWUgc3p1a2EmI3gxNDI7IHdzenlzdGtpY2ggcG90cnplYm55Y2ggcGxpayZvYWN1dGU7dyAoJiN4MTQyOyYjeDEwNTtjem5pZSB6IHBsaWtpZW0ga29uZmlndXJhY3lqbnltLCBjZXJ0eWZpa2F0YW1pLCBsb2dpZW0gaSBwbGlraWVtIHBpZCkgd2V3biYjeDEwNTt0cnoga2F0YWxvZ3Ugd3NrYXphbmVnbyBwcnpleiAmIzM5O2Nocm9vdCYjMzk7LjwvcD4KKworPC9kZD4KKzxkdCBpZD0iU0lHVVNSMSI+U0lHVVNSMTwvZHQ+Cis8ZGQ+CisKKzxwPlphbWtuaWogaSBvdHcmb2FjdXRlO3J6IHBvbm93bmllIGxvZy4gRnVua2NqYSB0YSBtbyYjeDE3QztlIHpvc3RhJiN4MTA3OyB1JiN4MTdDO3l0YSB3IHNrcnlwY2llIHJvdHVqJiN4MTA1O2N5bSBsb2cgcHJvZ3JhbXUgPGI+c3R1bm5lbDwvYj4uPC9wPgorCis8L2RkPgorPGR0IGlkPSJTSUdURVJNLVNJR1FVSVQtU0lHSU5UIj5TSUdURVJNLCBTSUdRVUlULCBTSUdJTlQ8L2R0PgorPGRkPgorCis8cD5aYWtvJiN4MTQ0O2N6IGR6aWEmI3gxNDI7YW5pZSBwcm9ncmFtdS48L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8cD5Ta3V0ZWsgd3lzJiN4MTQyO2FuaWEgaW5ueWNoIHN5Z25hJiN4MTQyOyZvYWN1dGU7dyBqZXN0IG5pZXpkZWZpbmlvd2FueS48L3A+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJQUlpZS0FEWSI+UFJaWUsmI3gxNDE7QURZPC9oMT48L2E+CisKKzxwPlN6eWZyb3dhbmllIHBvJiN4MTQyOyYjeDEwNTtjemUmI3gxNDQ7IGRvIGxva2FsbmVnbyBzZXJ3ZXJhIDxpPmltYXBkPC9pPiBtbyYjeDE3QztuYSB1JiN4MTdDO3kmI3gxMDc7OjwvcD4KKworPHByZT48Y29kZT4gICAgW2ltYXBkXQorICAgIGFjY2VwdCA9IDk5MworICAgIGV4ZWMgPSAvdXNyL3NiaW4vaW1hcGQKKyAgICBleGVjQXJncyA9IGltYXBkPC9jb2RlPjwvcHJlPgorCis8cD5hbGJvIHcgdHJ5YmllIHpkYWxueW06PC9wPgorCis8cHJlPjxjb2RlPiAgICBbaW1hcGRdCisgICAgYWNjZXB0ID0gOTkzCisgICAgY29ubmVjdCA9IDE0MzwvY29kZT48L3ByZT4KKworPHA+QWJ5IHVtbyYjeDE3QztsaXdpJiN4MTA3OyBsb2thbG5lbXUga2xpZW50b3dpIHBvY3p0eSBlbGVrdHJvbmljem5laiBrb3J6eXN0YW5pZSB6IHNlcndlcmEgPGk+aW1hcGQ8L2k+IHByemV6IFNTTCBuYWxlJiN4MTdDO3kgc2tvbmZpZ3Vyb3dhJiN4MTA3OyBwb2JpZXJhbmllIHBvY3p0eSB6IGFkcmVzdSBsb2NhbGhvc3QgaSBwb3J0dSAxMTksIG9yYXogdSYjeDE3Qzt5JiN4MTA3OyBuYXN0JiN4MTE5O3B1aiYjeDEwNTtjZWoga29uZmlndXJhY2ppOjwvcD4KKworPHByZT48Y29kZT4gICAgW2ltYXBdCisgICAgY2xpZW50ID0geWVzCisgICAgYWNjZXB0ID0gMTQzCisgICAgY29ubmVjdCA9IHNlcndlcjo5OTM8L2NvZGU+PC9wcmU+CisKKzxwPlcgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pdSB6IHByb2dyYW1lbSA8aT5wcHBkPC9pPiA8Yj5zdHVubmVsPC9iPiBwb3p3YWxhIHplc3Rhd2kmI3gxMDc7IHByb3N0eSBWUE4uIFBvIHN0cm9uaWUgc2Vyd2VyYSBuYXMmI3gxNDI7dWNodWomI3gxMDU7Y2VnbyBuYSBwb3JjaWUgMjAyMCBqZWdvIGtvbmZpZ3VyYWNqYSBtbyYjeDE3QztlIHd5Z2wmI3gxMDU7ZGEmI3gxMDc7IG5hc3QmI3gxMTk7cHVqJiN4MTA1O2NvOjwvcD4KKworPHByZT48Y29kZT4gICAgW3Zwbl0KKyAgICBhY2NlcHQgPSAyMDIwCisgICAgZXhlYyA9IC91c3Ivc2Jpbi9wcHBkCisgICAgZXhlY0FyZ3MgPSBwcHBkIGxvY2FsCisgICAgcHR5ID0geWVzPC9jb2RlPjwvcHJlPgorCis8cD5Qb25pJiN4MTdDO3N6eSBwbGlrIGtvbmZpZ3VyYWN5am55IG1vJiN4MTdDO2UgYnkmI3gxMDc7IHd5a29yenlzdGFueSBkbyB1cnVjaG9taWVuaWEgcHJvZ3JhbXUgPGI+c3R1bm5lbDwvYj4gdyB0cnliaWUgPGk+aW5ldGQ8L2k+LiBXYXJ0byB6YXV3YSYjeDE3Qzt5JiN4MTA3OywgJiN4MTdDO2UgdyBwbGlrdSBrb25maWd1cmFjeWpueW0gbmllIG1hIHNla2NqaSA8aT5bbmF6d2FfdXMmI3gxNDI7dWdpXTwvaT4uPC9wPgorCis8cHJlPjxjb2RlPiAgICBleGVjID0gL3Vzci9zYmluL2ltYXBkCisgICAgZXhlY0FyZ3MgPSBpbWFwZDwvY29kZT48L3ByZT4KKworPHA+QWJ5IHNrb25maWd1cm93YSYjeDEwNzsgVlBOIG1vJiN4MTdDO25hIHUmI3gxN0M7eSYjeDEwNzsgbmFzdCYjeDExOTtwdWomI3gxMDU7Y2VqIGtvbmZpZ3VyYWNqaSBrbGllbnRhOjwvcD4KKworPHByZT48Y29kZT4gICAgW3NvY2tzX2NsaWVudF0KKyAgICBjbGllbnQgPSB5ZXMKKyAgICBhY2NlcHQgPSAxMjcuMC4wLjE6MTA4MAorICAgIGNvbm5lY3QgPSB2cG5fc2VydmVyOjkwODAKKyAgICB2ZXJpZnkgPSA0CisgICAgQ0FmaWxlID0gc3R1bm5lbC5wZW08L2NvZGU+PC9wcmU+CisKKzxwPk9kcG93aWFkYWomI3gxMDU7Y2EgamVqIGtvbmZpZ3VyYWNqYSBzZXJ3ZXJhIHZwbl9zZXJ2ZXI6PC9wPgorCis8cHJlPjxjb2RlPiAgICBbc29ja3Nfc2VydmVyXQorICAgIHByb3RvY29sID0gc29ja3MKKyAgICBhY2NlcHQgPSA5MDgwCisgICAgY2VydCA9IHN0dW5uZWwucGVtCisgICAga2V5ID0gc3R1bm5lbC5rZXk8L2NvZGU+PC9wcmU+CisKKzxwPkRvIHByemV0ZXN0b3dhbmlhIGtvbmZpZ3VyYWNqaSBtbyYjeDE3QztuYSB3eWRhJiN4MTA3OyBuYSBtYXN6eW5pZSBrbGllbmNraWVqIGtvbWVuZCYjeDExOTs6PC9wPgorCis8cHJlPjxjb2RlPiAgICBjdXJsIC0tc29ja3M0YSBsb2NhbGhvc3QgaHR0cDovL3d3dy5leGFtcGxlLmNvbS88L2NvZGU+PC9wcmU+CisKKzxhIGhyZWY9IiNfcG9kdG9wXyI+PGgxIGlkPSJOT1RLSSI+Tk9US0k8L2gxPjwvYT4KKworPGgyIGlkPSJPR1JBTklDWkVOSUEiPk9HUkFOSUNaRU5JQTwvaDI+CisKKzxwPjxiPnN0dW5uZWw8L2I+IG5pZSBtbyYjeDE3QztlIGJ5JiN4MTA3OyB1JiN4MTdDO3l3YW55IGRvIHN6eWZyb3dhbmlhIHByb3Rva28mI3gxNDI7dSA8aT5GVFA8L2k+LCBwb25pZXdhJiN4MTdDOyBkbyBwcnplc3kmI3gxNDI7YW5pYSBwb3N6Y3plZyZvYWN1dGU7bG55Y2ggcGxpayZvYWN1dGU7dyB1JiN4MTdDO3l3YSBvbiBkb2RhdGtvd3ljaCBwbyYjeDE0MjsmI3gxMDU7Y3plJiN4MTQ0OyBvdHdpZXJhbnljaCBuYSBwb3J0YWNoIG8gZHluYW1pY3puaWUgcHJ6eWR6aWVsYW55Y2ggbnVtZXJhY2guIElzdG5pZWomI3gxMDU7IGplZG5hayBzcGVjamFsbmUgd2Vyc2plIGtsaWVudCZvYWN1dGU7dyBpIHNlcndlciZvYWN1dGU7dyBGVFAgcG96d2FsYWomI3gxMDU7Y2UgbmEgc3p5ZnJvd2FuaWUgcHJ6ZXN5JiN4MTQyO2FueWNoIGRhbnljaCBwcnp5IHBvbW9jeSBwcm90b2tvJiN4MTQyO3UgPGk+U1NMPC9pPi48L3A+CisKKzxoMiBpZD0iVFJZQi1JTkVURC10eWxrby1Vbml4Ij5UUllCIElORVREICh0eWxrbyBVbml4KTwvaDI+CisKKzxwPlcgd2kmI3gxMTk7a3N6byYjeDE1QjtjaSB6YXN0b3Nvd2EmI3gxNDQ7IDxiPnN0dW5uZWw8L2I+IHNhbW9kemllbG5pZSBuYXMmI3gxNDI7dWNodWplIG5hIHBvcmNpZSBwb2RhbnltIHcgcGxpa3Uga29uZmlndXJhY3lqbnltIGkgdHdvcnp5IHBvJiN4MTQyOyYjeDEwNTtjemVuaWUgeiBpbm55bSBwb3J0ZW0gcG9kYW55bSB3IG9wY2ppIDxpPmNvbm5lY3Q8L2k+IGx1YiBub3d5bSBwcm9ncmFtZW0gcG9kYW55bSB3IG9wY2ppIDxpPmV4ZWM8L2k+LiBOaWVrdCZvYWN1dGU7cnp5IHdvbCYjeDEwNTsgamVkbmFrIHd5a29yenlzdHl3YSYjeDEwNzsgb2RkemllbG55IHByb2dyYW0sIGt0Jm9hY3V0ZTtyeSBvZGJpZXJhIHBvJiN4MTQyOyYjeDEwNTtjemVuaWEsIHBvIGN6eW0gdXJ1Y2hhbWlhIHByb2dyYW0gPGI+c3R1bm5lbDwvYj4uIFByenlrJiN4MTQyO2FkYW1pIHRha2ljaCBwcm9ncmFtJm9hY3V0ZTt3IHMmI3gxMDU7IGluZXRkLCB4aW5ldGQgaSB0Y3BzZXJ2ZXIuPC9wPgorCis8cD5Qcnp5ayYjeDE0MjthZG93YSBsaW5pYSBwbGlrdSAvZXRjL2luZXRkLmNvbmYgbW8mI3gxN0M7ZSB3eWdsJiN4MTA1O2RhJiN4MTA3OyB0YWs6PC9wPgorCis8cHJlPjxjb2RlPiAgICBpbWFwcyBzdHJlYW0gdGNwIG5vd2FpdCByb290IEBiaW5kaXJAL3N0dW5uZWwKKyAgICAgICAgc3R1bm5lbCBAc3lzY29uZmRpckAvc3R1bm5lbC9pbWFwcy5jb25mPC9jb2RlPjwvcHJlPgorCis8cD5Qb25pZXdhJiN4MTdDOyB3IHRha2ljaCBwcnp5cGFka2FjaCBwbyYjeDE0MjsmI3gxMDU7Y3plbmllIG5hIHpkZWZpbmlvd2FueW0gcG9yY2llICh0dXRhaiA8aT5pbWFwczwvaT4pIG5hd2kmI3gxMDU7enVqZSBvc29ibnkgcHJvZ3JhbSAodHV0YWogPGk+aW5ldGQ8L2k+KSwgPGI+c3R1bm5lbDwvYj4gbmllIG1vJiN4MTdDO2UgdSYjeDE3Qzt5d2EmI3gxMDc7IG9wY2ppIDxpPmFjY2VwdDwvaT4uIFcgcGxpa3Uga29uZmlndXJhY3lqbnltIG5pZSBtbyYjeDE3QztlIGJ5JiN4MTA3OyByJm9hY3V0ZTt3bmllJiN4MTdDOyB6ZGVmaW5pb3dhbmEgJiN4MTdDO2FkbmEgdXMmI3gxNDI7dWdhICg8aT5bbmF6d2FfdXMmI3gxNDI7dWdpXTwvaT4pLCBwb25pZXdhJiN4MTdDOyBrb25maWd1cmFjamEgdGFrYSBwb3p3YWxhIG5hIG5hd2kmI3gxMDU7emFuaWUgdHlsa28gamVkbmVnbyBwbyYjeDE0MjsmI3gxMDU7Y3plbmlhLiBXc3p5c3RraWUgPGk+T1BDSkUgVVMmI3gxNDE7VUc8L2k+IHBvd2lubnkgYnkmI3gxMDc7IHVtaWVzemN6b25lIHJhemVtIHogb3BjamFtaSBnbG9iYWxueW1pLiBQcnp5ayYjeDE0MjthZCB0YWtpZWoga29uZmlndXJhY2ppIHpuYWpkdWplIHNpJiN4MTE5OyB3IHNla2NqaSA8aT5QUlpZSyYjeDE0MTtBRFk8L2k+LjwvcD4KKworPGgyIGlkPSJDRVJUWUZJS0FUWSI+Q0VSVFlGSUtBVFk8L2gyPgorCis8cD5Qcm90b2smb2FjdXRlOyYjeDE0MjsgU1NMIHd5bWFnYSwgYWJ5IGthJiN4MTdDO2R5IHNlcndlciBwcnplZHN0YXdpYSYjeDE0Mjsgc2kmI3gxMTk7IG5hd2kmI3gxMDU7enVqJiN4MTA1O2NlbXUgcG8mI3gxNDI7JiN4MTA1O2N6ZW5pZSBrbGllbnRvd2kgcHJhd2lkJiN4MTQyO293eW0gY2VydHlmaWthdGVtIFguNTA5LiBQb3R3aWVyZHplbmllIHRvJiN4MTdDO3NhbW8mI3gxNUI7Y2kgc2Vyd2VyYSBwb2xlZ2EgbmEgd3lrYXphbml1LCAmI3gxN0M7ZSBwb3NpYWRhIG9uIG9kcG93aWFkYWomI3gxMDU7Y3kgY2VydHlmaWthdG93aSBrbHVjeiBwcnl3YXRueS4gTmFqcHJvc3RzeiYjeDEwNTsgbWV0b2QmI3gxMDU7IHV6eXNrYW5pYSBjZXJ0eWZpa2F0dSBqZXN0IHd5Z2VuZXJvd2FuaWUgZ28gcHJ6eSBwb21vY3kgd29sbmVnbyBwYWtpZXR1IDxiPk9wZW5TU0w8L2I+LiBXaSYjeDExOTtjZWogaW5mb3JtYWNqaSBuYSB0ZW1hdCBnZW5lcm93YW5pYSBjZXJ0eWZpa2F0Jm9hY3V0ZTt3IG1vJiN4MTdDO25hIHpuYWxlJiN4MTdBOyYjeDEwNzsgbmEgdW1pZXN6Y3pvbnljaCBwb25pJiN4MTdDO2VqIHN0cm9uYWNoLjwvcD4KKworPHA+SXN0b3RuJiN4MTA1OyBrd2VzdGkmI3gxMDU7IGplc3Qga29sZWpubyYjeDE1QjsmI3gxMDc7IHphd2FydG8mI3gxNUI7Y2kgcGxpa3UgPGk+LnBlbTwvaT4uIFcgcGllcndzemVqIGtvbGVqbm8mI3gxNUI7Y2kgcG93aW5pZW4gb24gemF3aWVyYSYjeDEwNzsga2x1Y3ogcHJ5d2F0bnksIGEgZG9waWVybyB6YSBuaW0gcG9kcGlzYW55IGNlcnR5ZmlrYXQgKG5pZSAmI3gxN0M7JiN4MTA1O2RhbmllIGNlcnR5ZmlrYXR1KS4gUG8gY2VydHlmaWthY2llIGkga2x1Y3p1IHByeXdhdG55bSBwb3dpbm55IHpuYWpkb3dhJiN4MTA3OyBzaSYjeDExOTsgcHVzdGUgbGluaWUuIEplJiN4MTdDO2VsaSBwcnplZCBjZXJ0eWZpa2F0ZW0gem5hamR1aiYjeDEwNTsgc2kmI3gxMTk7IGRvZGF0a293ZSBpbmZvcm1hY2plIHRla3N0b3dlLCB0byBwb3dpbm55IG9uZSB6b3N0YSYjeDEwNzsgdXN1bmkmI3gxMTk7dGUuIE90cnp5bWFueSBwbGlrIHBvd2luaWVuIG1pZSYjeDEwNzsgbmFzdCYjeDExOTtwdWomI3gxMDU7YyYjeDEwNTsgcG9zdGEmI3gxMDc7OjwvcD4KKworPHByZT48Y29kZT4gICAgLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFt6YWtvZG93YW55IGtsdWN6XQorICAgIC0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCisgICAgW3B1c3RhIGxpbmlhXQorICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorICAgIFt6YWtvZG93YW55IGNlcnR5ZmlrYXRdCisgICAgLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorICAgIFtwdXN0YSBsaW5pYV08L2NvZGU+PC9wcmU+CisKKzxoMiBpZD0iTE9TT1dPIj5MT1NPV08mI3gxNUE7JiN4MTA2OzwvaDI+CisKKzxwPjxiPnN0dW5uZWw8L2I+IHBvdHJ6ZWJ1amUgemFpbmljam93YSYjeDEwNzsgUFJORyAoZ2VuZXJhdG9yIGxpY3piIHBzZXVkb2xvc293eWNoKSwgZ2R5JiN4MTdDOyBwcm90b2smb2FjdXRlOyYjeDE0MjsgU1NMIHd5bWFnYSBkbyBiZXpwaWVjemUmI3gxNDQ7c3R3YSBrcnlwdG9ncmFmaWN6bmVnbyAmI3gxN0E7ciZvYWN1dGU7ZCYjeDE0MjthIGRvYnJlaiBsb3Nvd28mI3gxNUI7Y2kuIE5hc3QmI3gxMTk7cHVqJiN4MTA1O2NlICYjeDE3QTtyJm9hY3V0ZTtkJiN4MTQyO2EgcyYjeDEwNTsga29sZWpubyBvZGN6eXR5d2FuZSBhJiN4MTdDOyBkbyB1enlza2FuaWEgd3lzdGFyY3phaiYjeDEwNTtjZWogaWxvJiN4MTVCO2NpIGVudHJvcGlpOjwvcD4KKworPHVsPgorCis8bGk+PHA+WmF3YXJ0byYjeDE1QjsmI3gxMDc7IHBsaWt1IHBvZGFuZWdvIHcgb3BjamkgPGk+Uk5EZmlsZTwvaT4uPC9wPgorCis8L2xpPgorPGxpPjxwPlphd2FydG8mI3gxNUI7JiN4MTA3OyBwbGlrdSBvIG5hendpZSBva3JlJiN4MTVCO2xvbmVqIHByemV6IHptaWVubiYjeDEwNTsgJiN4MTVCO3JvZG93aXNrb3cmI3gxMDU7IFJBTkRGSUxFLCBvIGlsZSBqZXN0IG9uYSB1c3Rhd2lvbmEuPC9wPgorCis8L2xpPgorPGxpPjxwPlBsaWsgLnJuZCB1bWllc3pjem9ueSB3IGthdGFsb2d1IGRvbW93eW0gdSYjeDE3Qzt5dGtvd25pa2EsIGplJiN4MTdDO2VsaSB6bWllbm5hIFJBTkRGSUxFIG5pZSBqZXN0IHVzdGF3aW9uYS48L3A+CisKKzwvbGk+Cis8bGk+PHA+UGxpayBwb2RhbnkgdyBvcGNqaSAmIzM5Oy0td2l0aC1yYW5kb20mIzM5OyB3IGN6YXNpZSBrb25maWd1cmFjamkgcHJvZ3JhbXUuPC9wPgorCis8L2xpPgorPGxpPjxwPlphd2FydG8mI3gxNUI7JiN4MTA3OyBla3JhbnUgdyBzeXN0ZW1pZSBXaW5kb3dzLjwvcD4KKworPC9saT4KKzxsaT48cD5HbmlhemRvIGVnZCwgamUmI3gxN0M7ZWxpIHUmI3gxN0M7eXRhIHpvc3RhJiN4MTQyO2Egb3BjamEgPGk+RUdEPC9pPi48L3A+CisKKzwvbGk+Cis8bGk+PHA+R25pYXpkbyBlZ2QgcG9kYW5lIHcgb3BjamkgJiMzOTstLXdpdGgtZWdkLXNvY2tldCYjMzk7IHcgY3phc2llIGtvbmZpZ3VyYWNqaSBwcm9ncmFtdS48L3A+CisKKzwvbGk+Cis8bGk+PHA+VXJ6JiN4MTA1O2R6ZW5pZSAvZGV2L3VyYW5kb20uPC9wPgorCis8L2xpPgorPC91bD4KKworPHA+V3NwJm9hY3V0ZTsmI3gxNDI7Y3plc25lICg8Yj4wLjkuNWE8L2I+IGx1YiBub3dzemUpIHdlcnNqZSBiaWJsaW90ZWtpIDxiPk9wZW5TU0w8L2I+IGF1dG9tYXR5Y3puaWUgemFwcnplc3RhaiYjeDEwNTsgJiN4MTQyO2Fkb3dhbmlhIGtvbGVqbnljaCBkYW55Y2ggdyBtb21lbmNpZSB1enlza2FuaWEgd3lzdGFyY3phaiYjeDEwNTtjZWogaWxvJiN4MTVCO2NpIGVudHJvcGlpLiBXY3plJiN4MTVCO25pZWpzemUgd2Vyc2plIGJpYmxpb3Rla2kgd3lrb3J6eXN0YWomI3gxMDU7IHdzenlzdGtpZSBwb3d5JiN4MTdDO3N6ZSAmI3gxN0E7ciZvYWN1dGU7ZCYjeDE0MjthLCBnZHkmI3gxN0M7IG5pZSBpc3RuaWVqZSB0YW0gZnVua2NqYSBwb3p3YWxhaiYjeDEwNTtjYSBva3JlJiN4MTVCO2xpJiN4MTA3OywgY3p5IHV6eXNrYW5vIGp1JiN4MTdDOyB3eXN0YXJjemFqJiN4MTA1O2NvIGR1JiN4MTdDO28gZGFueWNoLjwvcD4KKworPHA+V2FydG8gendyJm9hY3V0ZTtjaSYjeDEwNzsgdXdhZyYjeDExOTssICYjeDE3QztlIG5hIG1hc3p5bmFjaCB6IHN5c3RlbWVtIFdpbmRvd3MsIG5hIGt0Jm9hY3V0ZTtyeWNoIGtvbnNvbGkgbmllIHByYWN1amUgdSYjeDE3Qzt5dGtvd25paywgemF3YXJ0byYjeDE1QjsmI3gxMDc7IGVrcmFudSBuaWUgamVzdCB3eXN0YXJjemFqJiN4MTA1O2NvIHptaWVubmEsIGFieSB6YWluaWNqb3dhJiN4MTA3OyBQUk5HLiBXIHRha2ltIHByenlwYWRrdSBkbyB6YWluaWNqb3dhbmlhIGdlbmVyYXRvcmEgbmFsZSYjeDE3Qzt5IHUmI3gxN0M7eSYjeDEwNzsgb3BjamkgPGk+Uk5EZmlsZTwvaT4uPC9wPgorCis8cD5QbGlrIDxpPlJORGZpbGU8L2k+IHBvd2luaWVuIHphd2llcmEmI3gxMDc7IGRhbmUgbG9zb3dlIC0tIHImb2FjdXRlO3duaWUmI3gxN0M7IHcgdHltIHNlbnNpZSwgJiN4MTdDO2UgcG93aW5ueSBieSYjeDEwNzsgb25lIGlubmUgcHJ6eSBrYSYjeDE3QztkeW0gdXJ1Y2hvbWllbml1IHByb2dyYW11IDxiPnN0dW5uZWw8L2I+LiBPIGlsZSBuaWUgdSYjeDE3Qzt5dGEgem9zdGEmI3gxNDI7YSBvcGNqYSA8aT5STkRvdmVyd3JpdGU8L2k+IGplc3QgdG8gcm9iaW9uZSBhdXRvbWF0eWN6bmllLiBEbyByJiN4MTE5O2N6bmVnbyB1enlza2FuaWEgdGFraWVnbyBwbGlrdSB1JiN4MTdDO3l0ZWN6bmEgbW8mI3gxN0M7ZSBieSYjeDEwNzsga29tZW5kYSA8aT5vcGVuc3NsIHJhbmQ8L2k+IGRvc3RhcmN6YW5hIHplIHdzcCZvYWN1dGU7JiN4MTQyO2N6ZXNueW1pIHdlcnNqYW1pIHBha2lldHUgPGI+T3BlblNTTDwvYj4uPC9wPgorCis8cD5KZXN6Y3plIGplZG5hIGlzdG90bmEgaW5mb3JtYWNqYSAtLSBqZSYjeDE3QztlbGkgZG9zdCYjeDExOTtwbmUgamVzdCB1cnomI3gxMDU7ZHplbmllIDxpPi9kZXYvdXJhbmRvbTwvaT4gYmlibGlvdGVrYSA8Yj5PcGVuU1NMPC9iPiBtYSB6d3ljemFqIHphc2lsYW5pYSBuaW0gUFJORyB3IHRyYWtjaWUgc3ByYXdkemFuaWEgc3RhbnUgZ2VuZXJhdG9yYS4gVyBzeXN0ZW1hY2ggeiA8aT4vZGV2L3VyYW5kb208L2k+IHVyeiYjeDEwNTtkemVuaWUgdG8gYiYjeDExOTtkemllIG5hanByYXdkb3BvZG9ibmllaiB1JiN4MTdDO3l0ZSwgcG9taW1vICYjeDE3QztlIHpuYWpkdWplIHNpJiN4MTE5OyBuYSBzYW15bSBrbyYjeDE0NDtjdSBwb3d5JiN4MTdDO3N6ZWogbGlzdHkuIEplc3QgdG8gdyYjeDE0MjthJiN4MTVCO2Npd28mI3gxNUI7JiN4MTA3OyBiaWJsaW90ZWtpIDxiPk9wZW5TU0w8L2I+LCBhIG5pZSBwcm9ncmFtdSA8Yj5zdHVubmVsPC9iPi48L3A+CisKKzxoMiBpZD0iUEFSQU1FVFJZLURIIj5QQVJBTUVUUlkgREg8L2gyPgorCis8cD5Qb2N6JiN4MTA1O3dzenkgb2Qgd2Vyc2ppIDQuNDAgPGI+c3R1bm5lbDwvYj4gemF3aWVyYSB3IGtvZHppZSBwcm9ncmFtdSAyMDQ4LWJpdG93ZSBwYXJhbWV0cnkgREguIE9kIHdlcnNqaSA1LjE4IHRlIHBvY3omI3gxMDU7dGtvd2Ugd2FydG8mI3gxNUI7Y2kgcGFyYW1ldHImb2FjdXRlO3cgREggcyYjeDEwNTsgd3ltaWVuaWFuZSBuYSBhdXRvZ2VuZXJvd2FuZSBwYXJhbWV0cnkgdHltY3phc293ZS4gV3lnZW5lcm93YW5pZSBwYXJhbWV0ciZvYWN1dGU7dyBESCBtbyYjeDE3QztlIHphaiYjeDEwNTsmI3gxMDc7IG5hd2V0IHdpZWxlIG1pbnV0LjwvcD4KKworPHA+QWx0ZXJuYXR5d25pZSBwYXJhbWV0cnkgREggbW8mI3gxN0M7bmEgdW1pZSYjeDE1QjtjaSYjeDEwNzsgdyBwbGlrdSByYXplbSB6IGNlcnR5ZmlrYXRlbSwgY28gd3kmI3gxNDI7JiN4MTA1O2N6YSBnZW5lcm93YW5pZSBwYXJhbWV0ciZvYWN1dGU7dyB0eW1jemFzb3d5Y2g6PC9wPgorCis8cHJlPjxjb2RlPiAgICBvcGVuc3NsIGRocGFyYW0gMjA0OCAmZ3Q7Jmd0OyBzdHVubmVsLnBlbTwvY29kZT48L3ByZT4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IlBMSUtJIj5QTElLSTwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0ic3lzY29uZmRpci1zdHVubmVsLXN0dW5uZWwuY29uZiI+PGk+QHN5c2NvbmZkaXJAL3N0dW5uZWwvc3R1bm5lbC5jb25mPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPnBsaWsga29uZmlndXJhY3lqbnkgcHJvZ3JhbXU8L3A+CisKKzwvZGQ+Cis8L2RsPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iQkRZIj5CJiN4MTQxOyYjeDExODtEWTwvaDE+PC9hPgorCis8cD5PcGNqYSA8aT5leGVjQXJnczwvaT4gb3JheiBsaW5pYSBrb21lbmQgV2luMzIgbmllIG9icyYjeDE0Mjt1Z3VqZSBjeXRvd2FuaWEuPC9wPgorCis8YSBocmVmPSIjX3BvZHRvcF8iPjxoMSBpZD0iWk9CQUNaLVJXTklFIj5aT0JBQ1ogUiZPYWN1dGU7V05JRSYjeDE3Qjs8L2gxPjwvYT4KKworPGRsPgorCis8ZHQgaWQ9InRjcGQtOCI+PGEgaHJlZj0iaHR0cDovL21hbi5oZS5uZXQvbWFuOC90Y3BkIj50Y3BkKDgpPC9hPjwvZHQ+Cis8ZGQ+CisKKzxwPmJpYmxpb3Rla2Ega29udHJvbGkgZG9zdCYjeDExOTtwdSBkbyB1cyYjeDE0Mjt1ZyBpbnRlcm5ldG93eWNoPC9wPgorCis8L2RkPgorPGR0IGlkPSJpbmV0ZC04Ij48YSBocmVmPSJodHRwOi8vbWFuLmhlLm5ldC9tYW44L2luZXRkIj5pbmV0ZCg4KTwvYT48L2R0PgorPGRkPgorCis8cD4mIzM5O3N1cGVyLXNlcndlciYjMzk7IGludGVybmV0b3d5PC9wPgorCis8L2RkPgorPGR0IGlkPSJodHRwOi13d3cuc3R1bm5lbC5vcmciPjxpPmh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvPC9pPjwvZHQ+Cis8ZGQ+CisKKzxwPnN0cm9uYSBkb21vd2EgcHJvZ3JhbXUgPGI+c3R1bm5lbDwvYj48L3A+CisKKzwvZGQ+Cis8ZHQgaWQ9Imh0dHA6LXd3dy5vcGVuc3NsLm9yZyI+PGk+aHR0cDovL3d3dy5vcGVuc3NsLm9yZy88L2k+PC9kdD4KKzxkZD4KKworPHA+c3Ryb25hIHByb2pla3R1IDxiPk9wZW5TU0w8L2I+PC9wPgorCis8L2RkPgorPC9kbD4KKworPGEgaHJlZj0iI19wb2R0b3BfIj48aDEgaWQ9IkFVVE9SIj5BVVRPUjwvaDE+PC9hPgorCis8ZGw+CisKKzxkdCBpZD0iTWljaGEtVHJvam5hcmEiPk1pY2hhJiN4MTQyOyBUcm9qbmFyYTwvZHQ+Cis8ZGQ+CisKKzxwPiZsdDs8aT5NaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ8L2k+Jmd0OzwvcD4KKworPC9kZD4KKzwvZGw+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgorPHRyPjx0ZCBjbGFzcz0iX3BvZGJsb2NrXyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7IGNvbG9yOiAjMDAwIiB2YWxpZ249Im1pZGRsZSI+Cis8YmlnPjxzdHJvbmc+PHNwYW4gY2xhc3M9Il9wb2RibG9ja18iPiZuYnNwO3N0dW5uZWwgVExTIFByb3h5PC9zcGFuPjwvc3Ryb25nPjwvYmlnPgorPC90ZD48L3RyPgorPC90YWJsZT4KKworPC9ib2R5PgorCis8L2h0bWw+CisKKwpkaWZmIC0tZ2l0IGEvZG9jL3N0dW5uZWwucGwucG9kLmluIGIvZG9jL3N0dW5uZWwucGwucG9kLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDdiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3R1bm5lbC5wbC5wb2QuaW4KQEAgLTAsMCArMSwxNDA4IEBACis9aGVhZDEgTkFaV0EKKworPWVuY29kaW5nIHV0ZjgKKworc3R1bm5lbCAtIHVuaXdlcnNhbG55IHR1bmVsIHByb3Rva2/FgnUgU1NMCisKKworPWhlYWQxIFNLxYFBRE5JQQorCis9b3ZlciA0CisKKz1pdGVtIEI8VW5peDo+CisKK0I8c3R1bm5lbD4gW1M8UExJSz5dIHwgUzwtZmQgTj4gfCBTPC1oZWxwPiB8IFM8LXZlcnNpb24+IHwgUzwtc29ja2V0cz4gfCBTPC1vcHRpb25zPgorCis9aXRlbSBCPFdJTjMyOj4KKworQjxzdHVubmVsPiBbIFsgUzwtaW5zdGFsbD4gfCBTPC11bmluc3RhbGw+IHwgUzwtc3RhcnQ+IHwgUzwtc3RvcD4gfAorICAgIFM8LXJlbG9hZD4gfCBTPC1yZW9wZW4+IHwgUzwtZXhpdD4gXSBbUzwtcXVpZXQ+XSBbUzxQTElLPl0gXSB8CisgICAgUzwtaGVscD4gfCBTPC12ZXJzaW9uPiB8IFM8LXNvY2tldHM+IHwgUzwtb3B0aW9ucz4KKworPWJhY2sKKworCis9aGVhZDEgT1BJUworCitQcm9ncmFtIEI8c3R1bm5lbD4gem9zdGHFgiB6YXByb2pla3Rvd2FueSBkbyBvcGFrb3d5d2FuaWEgdyBwcm90b2vDs8WCIEk8U1NMPgorcG/FgsSFY3plxYQgcG9tacSZZHp5IHpkYWxueW1pIGtsaWVudGFtaSBhIGxva2FsbnltaSBsdWIgemRhbG55bWkgc2Vyd2VyYW1pLgorUHJ6ZXogc2Vyd2VyIGxva2Fsbnkgcm96dW1pYW5hIGplc3QgYXBsaWthY2phIHByemV6bmFjem9uYSBkbyB1cnVjaGFtaWFuaWEKK3ByenkgcG9tb2N5IEk8aW5ldGQ+LgorU3R1bm5lbCBwb3p3YWxhIG5hIHByb3N0ZSB6ZXN0YXdpZW5pZSBrb211bmlrYWNqaSBzZXJ3ZXLDs3cgbmllIHBvc2lhZGFqxIVjeWNoCitmdW5rY2pvbmFsbm/Fm2NpIEk8U1NMPiBwb3ByemV6IGJlenBpZWN6bmUga2FuYcWCeSBJPFNTTD4uCisKK0I8c3R1bm5lbD4gcG96d2FsYSBkb2RhxIcgZnVua2Nqb25hbG5vxZvEhyBJPFNTTD4gZG8gcG93c3plY2huaWUgc3Rvc293YW55Y2gKK2RlbW9uw7N3IEk8aW5ldGQ+LCBucC4gSTxwb3AzPiBsdWIgSTxpbWFwPiwgZG8gc2Ftb2R6aWVsbnljaCBkZW1vbsOzdywKK25wLiBJPG5udHA+LCBJPHNtdHA+IGx1YiBJPGh0dHA+LCBhIG5hd2V0IHR1bmVsb3dhxIcgcHBwIHBvcHJ6ZXogZ25pYXpkYSBzaWVjaW93ZQorYmV6IHptaWFuIHcga29kemllIMW6csOzZMWCb3d5bS4KKworCis9aGVhZDEgT1BDSkUKKworPW92ZXIgNAorCis9aXRlbSBCPFBMSUs+CisKK3XFvHlqIHBvZGFuZWdvIHBsaWt1IGtvbmZpZ3VyYWN5am5lZ28KKworPWl0ZW0gQjwtZmQgTj4gKHR5bGtvIFVuaXgpCisKK3djenl0YWoga29uZmlndXJhY2rEmSB6IHBvZGFuZWdvIGRlc2tyeXB0b3JhIHBsaWt1CisKKz1pdGVtIEI8LWhlbHA+CisKK2RydWt1aiBsaXN0xJkgd3NwaWVyYW55Y2ggb3BjamkKKworPWl0ZW0gQjwtdmVyc2lvbj4KKworZHJ1a3VqIHdlcnNqxJkgcHJvZ3JhbXUgaSBkb215xZtsbmUgd2FydG/Fm2NpIHBhcmFtZXRyw7N3CisKKz1pdGVtIEI8LXNvY2tldHM+CisKK2RydWt1aiBkb215xZtsbmUgb3BjamUgZ25pYXpkCisKKz1pdGVtIEI8LW9wdGlvbnM+CisKK2RydWt1aiB3c3BpZXJhbmUgb3BjamUgU1NMCisKKz1pdGVtIEI8LWluc3RhbGw+ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpCisKK2luc3RhbHVqIHNlcndpcyBOVAorCis9aXRlbSBCPC11bmluc3RhbGw+ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpCisKK29kaW5zdGFsdWogc2Vyd2lzIE5UCisKKz1pdGVtIEI8LXN0YXJ0PiAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KQorCit1cnVjaG9tIHNlcndpcyBOVAorCis9aXRlbSBCPC1zdG9wPiAodHlsa28gV2luZG93cyBOVCBsdWIgbm93c3p5KQorCit6YXRyenltYWogc2Vyd2lzIE5UCisKKz1pdGVtIEI8LXJlbG9hZD4gKHR5bGtvIFdpbmRvd3MgTlQgbHViIG5vd3N6eSkKKworcHJ6ZcWCYWR1aiBwbGlrIGtvbmZpZ3VyYWN5am55IHVydWNob21pb25lZ28gc2Vyd2lzdSBOVAorCis9aXRlbSBCPC1yZW9wZW4+ICh0eWxrbyBXaW5kb3dzIE5UIGx1YiBub3dzenkpCisKK290d8OzcnogcG9ub3duaWUgbG9nIHVydWNob21pb25lZ28gc2Vyd2lzdSBOVAorCis9aXRlbSBCPC1leGl0PiAodHlsa28gV2luMzIpCisKK3phdHJ6eW1haiB1cnVjaG9taW9ueSBwcm9ncmFtCisKKz1pdGVtIEI8LXF1aWV0PiAodHlsa28gV2luMzIpCisKK25pZSB3ecWbd2lldGxhaiBva2llbmVrIHoga29tdW5pa2F0YW1pCisKKz1iYWNrCisKKworPWhlYWQxIFBMSUsgS09ORklHVVJBQ1lKTlkKKworTGluaWEgdyBwbGlrdSBrb25maWd1cmFjeWpueW0gbW/FvGUgYnnEhzoKKworPW92ZXIgNAorCis9aXRlbSAqCisKK3B1c3RhIChpZ25vcm93YW5hKQorCis9aXRlbSAqCisKK2tvbWVudGFyemVtIHJvenBvY3p5bmFqxIVjeW0gc2nEmSB6bmFraWVtICc7JyAoaWdub3Jvd2FuYSkKKworPWl0ZW0gKgorCitwYXLEhSAnbmF6d2Ffb3BjamkgPSB3YXJ0b8WbxIdfb3BjamknCisKKz1pdGVtICoKKwordGVrc3RlbSAnW25hendhX3VzxYJ1Z2ldJyB3c2thenVqxIVjeW0gcG9jesSFdGVrIGRlZmluaWNqaSB1c8WCdWdpCisKKz1iYWNrCisKK1BhcmFtZXRyIGFkcmVzIG1vxbxlIGJ5xIc6CisKKz1vdmVyIDQKKworPWl0ZW0gKgorCitudW1lcmVtIHBvcnR1CisKKz1pdGVtICoKKworb2RkemllbG9uxIUgxZtyZWRuaWtpZW0gcGFyxIUgYWRyZXN1IChJUHY0LCBJUHY2LCBsdWIgbmF6d8SFIGRvbWVub3fEhSkgaSBudW1lcnUgcG9ydHUKKworPWl0ZW0gKgorCivFm2NpZcW8a8SFIGRvIGduaWF6ZGEgVW5peCAodHlsa28gVW5peCkKKworPWJhY2sKKworPWhlYWQyIE9QQ0pFIEdMT0JBTE5FCisKKz1vdmVyIDQKKworPWl0ZW0gQjxjaHJvb3Q+ID0gS0FUQUxPRyAodHlsa28gVW5peCkKKwora2F0YWxvZyByb2JvY3plZ28ga29yemVuaWEgc3lzdGVtdSBwbGlrw7N3CisKK09wY2phIG9rcmXFm2xhIGthdGFsb2csIHcga3TDs3J5bSB1d2nEmXppb255IHpvc3RhbmllIHByb2NlcyBwcm9ncmFtdQorQjxzdHVubmVsPiB0dcW8IHBvIGplZ28gaW5pY2phbGl6YWNqaSwgYSBwcnplZCByb3pwb2N6xJljaWVtIG9kYmllcmFuaWEKK3BvxYLEhWN6ZcWELiAgxZpjaWXFvGtpIHBvZGFuZSB3IG9wY2phY2ggSTxDQXBhdGg+LCBJPENSTHBhdGg+LCBJPHBpZD4KK29yYXogSTxleGVjPiBtdXN6xIUgYnnEhyB1bWllc3pjem9uZSB3ZXduxIV0cnoga2F0YWxvZ3UgcG9kYW5lZ28gdyBvcGNqaQorSTxjaHJvb3Q+IGkgb2tyZcWbbG9uZSB3emdsxJlkZW0gdGVnbyBrYXRhbG9ndS4KKworTmlla3TDs3JlIGZ1bmtjamUgc3lzdGVtdSBvcGVyYWN5am5lZ28gbW9nxIUgd3ltYWdhxIcgZG9kYXRrb3d5Y2ggcGxpa8OzdyB1bWllc3pjem9ueWNoIHcga2F0YWxvZ3UgcG9kYW5lZ28gdyBwYXJhbWV0cnplIGNocm9vdDoKKworPW92ZXIgNAorCis9aXRlbSAqCisKK29ww7PFum5pb25lIHJvendpbmnEmWNpZSBhZHJlc8OzdyBETlMgdHlwb3dvIHd5bWFnYSAvZXRjL25zc3dpdGNoLmNvbmYgaSAvZXRjL3Jlc29sdi5jb25mCisKKz1pdGVtICoKKworbG9rYWxpemFjamEgc3RyZWZ5IGN6YXNvd2VqIHcgbG9nYWNoIHd5bWFnYSBwbGlrdSAvZXRjL3RpbWV6b25lCisKKz1pdGVtICoKKworbmlla3TDs3JlIGlubmUgcGxpa2kgbW9nxIUgcG90cnplYm93YcSHIHBsaWvDs3cgdXJ6xIVkemXFhCwgbnAuIC9kZXYvemVybyBsdWIgL2Rldi9udWxsCisKKz1iYWNrCisKKz1pdGVtIEI8Y29tcHJlc3Npb24+ID0gZGVmbGF0ZSB8IHpsaWIKKword3liw7NyIGFsZ29yeXRtdSBrb21wcmVzamkgcHJ6ZXN5xYJhbnljaCBkYW55Y2gKKworZG9tecWbbG5pZTogYmV6IGtvbXByZXNqaQorCitBbGdvcnl0bSBkZWZsYXRlIGplc3Qgc3RhbmRhcmRvd8SFIG1ldG9kxIUga29tcHJlc2ppIHpnb2RuaWUgeiBSRkMgMTk1MS4KKworS29tcHJlc2phIHpsaWIgemFpbXBsZW1lbnRvd2FuYSB3IEI8T3BlblNTTCAwLjkuOD4gaSBub3dzenljaCBuaWUgamVzdAora29tcGF0eWJpbG5hIGltcGxlbWVudGFjasSFIEI8T3BlblNTTCAwLjkuNz4uCisKKz1pdGVtIEI8ZGVidWc+ID0gW1BPRFNZU1RFTV0uUE9aSU9NCisKK3N6Y3plZ8OzxYJvd2/Fm8SHIGxvZ293YW5pYQorCitQb3ppb20gbG9nb3dhbmlhIG1vxbxuYSBva3JlxZtsacSHIHByenkgcG9tb2N5IGplZG5laiB6IG5hencgbHViIGxpY3piOgorZW1lcmcgKDApLCBhbGVydCAoMSksIGNyaXQgKDIpLCBlcnIgKDMpLCB3YXJuaW5nICg0KSwgbm90aWNlICg1KSwKK2luZm8gKDYpIGx1YiBkZWJ1ZyAoNykuCitaYXBpc3l3YW5lIHPEhSBrb211bmlrYXR5IG8gcG96aW9taWUgbmnFvHN6eW0gKG51bWVyeWN6bmllKSBsdWIgcsOzd255bSBwb2RhbmVtdS4KK0RvIHV6eXNrYW5pYSBuYWp3ecW8c3plZ28gcG96aW9tdSBzemN6ZWfDs8WCb3dvxZtjaSBtb8W8bmEgdcW8ecSHIG9wY2ppCitJPGRlYnVnID0gZGVidWc+IGx1YiBJPGRlYnVnID0gNz4uICBEb215xZtsbnltIHBvemlvbWVtIGplc3Qgbm90aWNlICg1KS4KKworTyBpbGUgbmllIHd5c3BlY3lmaWtvd2FubyBwb2RzeXN0ZW11IHXFvHl0eSBixJlkemllIGRvbXnFm2xueTogZGFlbW9uLgorUG9kc3lzdGVteSBuaWUgc8SFIHdzcGllcmFuZSBwcnpleiBwbGF0Zm9ybcSZIFdpbjMyLgorCitXaWVsa2/Fm8SHIGxpdGVyIGplc3QgaWdub3Jvd2FuYSB6YXLDs3dubyBkbGEgcG96aW9tdSBqYWsgcG9kc3lzdGVtdS4KKworPWl0ZW0gQjxFR0Q+ID0gxZpDSUXFu0tBX0RPX0VHRCAodHlsa28gVW5peCkKKworxZtjaWXFvGthIGRvIGduaWF6ZGEgcHJvZ3JhbXUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uCisKK09wY2phIHBvendhbGEgb2tyZcWbbGnEhyDFm2NpZcW8a8SZIGRvIGduaWF6ZGEgcHJvZ3JhbXUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uCit1xbx5d2FuZWdvIGRvIHphaW5pY2phbGl6b3dhbmlhIGdlbmVyYXRvcmEgY2nEhWfDs3cgcHNldWRvbG9zb3d5Y2ggYmlibGlvdGVraQorQjxPcGVuU1NMPi4gIE9wY2phIGplc3QgZG9zdMSZcG5hIHogYmlibGlvdGVrxIUgQjxPcGVuU1NMIDAuOS41YT4gbHViIG5vd3N6xIUuCisKKz1pdGVtIEI8ZW5naW5lPiA9IGF1dG8gfCBJREVOVFlGSUtBVE9SX1VSWsSERFpFTklBCisKK3d5YsOzciBzcHJ6xJl0b3dlZ28gdXJ6xIVkemVuaWEga3J5cHRvZ3JhZmljem5lZ28KKworZG9tecWbbG5pZTogYmV6IHd5a29yenlzdGFuaWEgdXJ6xIVkemXFhCBrcnlwdG9ncmFmaWN6bnljaAorCitQcnp5a8WCYWRvd2Ega29uZmlndXJhY2phIHVtb8W8bGl3aWFqxIVjYSBvZGN6eXRhbmllIGtsdWN6YSBwcnl3YXRuZWdvIHoKK3VyesSFZHplbmlhIHpnb2RuZWdvIHogT3BlblNDOgorCisgICAgZW5naW5lPWR5bmFtaWMKKyAgICBlbmdpbmVDdHJsPVNPX1BBVEg6L3Vzci9saWIvb3BlbnNjL2VuZ2luZV9wa2NzMTEuc28KKyAgICBlbmdpbmVDdHJsPUlEOnBrY3MxMQorICAgIGVuZ2luZUN0cmw9TElTVF9BREQ6MQorICAgIGVuZ2luZUN0cmw9TE9BRAorICAgIGVuZ2luZUN0cmw9TU9EVUxFX1BBVEg6L3Vzci9saWIvcGtjczExL29wZW5zYy1wa2NzMTEuc28KKyAgICBlbmdpbmVDdHJsPUlOSVQKKworICAgIFtzZXJ2aWNlXQorICAgIGVuZ2luZU51bT0xCisgICAga2V5PWlkXzQ1CisKKz1pdGVtIEI8ZW5naW5lQ3RybD4gPSBLT01FTkRBWzpQQVJBTUVUUl0KKwora29uZmlndXJhY2phIHVyesSFZHplbmlhIGtyeXB0b2dyYWZpY3puZWdvCisKK1NwZWNqYWxuZSBrb21lbmR5ICJMT0FEIiBpICJJTklUIiBwb3p3YWxhasSFIG5hIHphxYJhZG93YW5pZSBpIGluaWNqYWxpemFjasSZCittb2R1xYJ1IGtyeXB0b2dyYWZpY3puZWdvIHVyesSFZHplbmlhLgorCis9aXRlbSBCPGVuZ2luZURlZmF1bHQ+ID0gTElTVEFfWkFEQcWDCisKK2xpc3RhIHphZGHFhCBPcGVuU1NMIG9kZGVsZWdvd2FueWNoIGRvIGJpZcW8xIVjZWdvIHVyesSFZHplbmlhCisKK1BhcmFtZXRyZW0gamVzdCBsaXN0YSBvZGR6aWVsb255Y2ggcHJ6ZWNpbmthbWkgemFkYcWEIE9wZW5TU0wsIGt0w7NyZSBtYWrEhQorem9zdGHEhyBvZGRlbGVnb3dhbmUgZG8gYmllxbzEhWNlZ28gdXJ6xIVkemVuaWEga3J5cHRvZ3JhZmljem5lZ28uCisKK1cgemFsZcW8bm/Fm2NpIG9kIGtvbmtyZXRuZWdvIHVyesSFZHplbmlhIGRvc3TEmXBuZSBtb2fEhSBiecSHIG5hc3TEmXB1asSFY2UgemFkYW5pYToKK0FMTCwgUlNBLCBEU0EsIEVDREgsIEVDRFNBLCBESCwgUkFORCwgQ0lQSEVSUywgRElHRVNUUywgUEtFWSwgUEtFWV9DUllQVE8sCitQS0VZX0FTTjEuCisKKz1pdGVtIEI8Zmlwcz4gPSB5ZXMgfCBubworCit0cnliIEZJUFMgMTQwLTIKKworT3BjamEgcG96d2FsYSB3ecWCxIVjennEhyB3ZWrFm2NpZSB3IHRyeWIgRklQUywgamXFm2xpIEI8c3R1bm5lbD4gem9zdGHFggorc2tvbXBpbG93YW55IHplIHdzcGFyY2llbSBkbGEgRklQUyAxNDAtMi4KKworZG9tecWbbG5pZTogbm8gKG9kIHdlcnNqaSA1LjAwKQorCis9aXRlbSBCPGZvcmVncm91bmQ+ID0geWVzIHwgbm8gKHR5bGtvIFVuaXgpCisKK3RyeWIgcGllcndzem9wbGFub3d5CisKK1XFvHljaWUgdGVqIG9wY2ppIHBvd29kdWplLCDFvGUgQjxzdHVubmVsPiBuaWUgcHJ6ZWNob2R6aSB3IHTFgm8gbG9ndWrEhWMKK3N3b2plIGtvbXVuaWthdHkgbmEga29uc29sxJkgemFtaWFzdCBwcnpleiBJPHN5c2xvZz4gKG8gaWxlIG5pZSB1xbx5dG8KK29wY2ppIEk8b3V0cHV0PikuCisKKz1pdGVtIEI8aWNvbkFjdGl2ZT4gPSBQTElLX1pfSUtPTkvEhCAodHlsa28gR1VJKQorCitpa29ua2Egd3nFm3dpZXRsYW5hIHByenkgb2JlY25vxZtjaSBha3R5d255Y2ggcG/FgsSFY3plxYQgZG8gdXPFgnVnaQorCitXIHN5c3RlbWllIFdpbmRvd3MgaWtvbmthIHRvIHBsaWsgLmljbyB6YXdpZXJhasSFY3kgb2JyYXplayAxNngxNiBwaWtzZWxpLgorCis9aXRlbSBCPGljb25FcnJvcj4gPSBQTElLX1pfSUtPTkvEhCAodHlsa28gR1VJKQorCitpa29ua2Egd3nFm3dpZXRsYW5hLCBqZcW8ZWxpIG5pZSB6b3N0YcWCIHphxYJhZG93YW55IHBvcHJhd255IHBsaWsga29uZmlndXJhY3lqbnkKKworVyBzeXN0ZW1pZSBXaW5kb3dzIGlrb25rYSB0byBwbGlrIC5pY28gemF3aWVyYWrEhWN5IG9icmF6ZWsgMTZ4MTYgcGlrc2VsaS4KKworPWl0ZW0gQjxpY29uSWRsZT4gPSBQTElLX1pfSUtPTkvEhCAodHlsa28gR1VJKQorCitpa29ua2Egd3nFm3dpZXRsYW5hIHByenkgYnJha3UgYWt0eXdueWNoIHBvxYLEhWN6ZcWEIGRvIHVzxYJ1Z2kKKworVyBzeXN0ZW1pZSBXaW5kb3dzIGlrb25rYSB0byBwbGlrIC5pY28gemF3aWVyYWrEhWN5IG9icmF6ZWsgMTZ4MTYgcGlrc2VsaS4KKworPWl0ZW0gQjxsb2c+ID0gYXBwZW5kIHwgb3ZlcndyaXRlCisKK2xvZyBmaWxlIGhhbmRsaW5nCisKK1RoaXMgb3B0aW9uIGFsbG93cyB0byBjaG9vc2Ugd2hldGhlciB0aGUgbG9nIGZpbGUgKHNwZWNpZmllZCB3aXRoIHRoZSBJPG91dHB1dD4KK29wdGlvbikgaXMgYXBwZW5kZWQgb3Igb3ZlcndyaXR0ZW4gd2hlbiBvcGVuZWQgb3IgcmUtb3BlbmVkLgorCitkb215xZtsbmllOiBhcHBlbmQKKworPWl0ZW0gQjxvdXRwdXQ+ID0gUExJSworCitwbGlrLCBkbyBrdMOzcmVnbyBkb3Bpc2FuZSB6b3N0YW7EhSBsb2dpCisKK1XFvHljaWUgdGVqIG9wY2ppIHBvd29kdWplIGRvcGlzYW5pZSBsb2fDs3cgZG8gcG9kYW5lZ28gcGxpa3UuCisKK0RvIGtpZXJvd2FuaWFrb211bmlrYXTDs3cgbmEgc3RhbmRhcmRvd2Ugd3lqxZtjaWUgKG5hIHByenlrxYJhZCBwbyB0bywgxbxlYnkKK3phbG9nb3dhxIcgamUgcHJvZ3JhbWVtIHNwbG9nZ2VyIHogcGFraWV0dSBkYWVtb250b29scykgbW/FvG5hIHBvZGHEhyBqYWtvCitwYXJhbWV0ciB1cnrEhWR6ZW5pZSAvZGV2L3N0ZG91dC4KKworPWl0ZW0gQjxwaWQ+ID0gUExJSyAodHlsa28gVW5peCkKKworcG/Fgm/FvGVuaWUgcGxpa3UgeiBudW1lcmVtIHByb2Nlc3UKKworSmXFvGVsaSBhcmd1bWVudCBqZXN0IHB1c3R5IHBsaWsgbmllIHpvc3RhbmllIHN0d29yem9ueS4KKworSmXFvGVsaSB6ZGVmaW5pb3dhbm8ga2F0YWxvZyBJPGNocm9vdD4sIHRvIMWbY2llxbxrYSBkbyBJPHBpZD4gamVzdCBva3JlxZtsb25hCit3emdsxJlkZW0gdGVnbyBrYXRhbG9ndS4KKworPWl0ZW0gQjxSTkRieXRlcz4gPSBMSUNaQkFfQkFKVMOTVworCitsaWN6YmEgYmFqdMOzdyBkbyB6YWluaWNqb3dhbmlhIGdlbmVyYXRvcmEgcHNldWRvbG9zb3dlZ28KKworVyB3ZXJzamFjaCBiaWJsaW90ZWtpIEI8T3BlblNTTD4gc3RhcnN6eWNoIG5pxbwgQjwwLjkuNWE+IG9wY2phIHRhIG9rcmXFm2xhCityw7N3bmllxbwgbGljemLEmSBiYWp0w7N3IHd5c3RhcmN6YWrEhWN5Y2ggZG8gemFpbmljam93YW5pYSBQUk5HLgorTm93c3plIHdlcnNqZSBiaWJsaW90ZWtpIG1hasSFIHdidWRvd2FuxIUgZnVua2NqxJkgb2tyZcWbbGFqxIVjxIUsIGN6eQorZG9zdGFyY3pvbmEgaWxvxZvEhyBsb3Nvd2/Fm2NpIGplc3Qgd3lzdGFyY3phasSFY2EgZG8gemFpbmljam93YW5pYSBnZW5lcmF0b3JhLgorCis9aXRlbSBCPFJORGZpbGU+ID0gUExJSworCivFm2NpZcW8a2EgZG8gcGxpa3UgemF3aWVyYWrEhWNlZ28gbG9zb3dlIGRhbmUKKworQmlibGlvdGVrYSBCPE9wZW5TU0w+IHXFvHlqZSBkYW55Y2ggeiB0ZWdvIHBsaWt1IGRvIHphaW5pY2pvd2FuaWEKK2dlbmVyYXRvcmEgcHNldWRvbG9zb3dlZ28uCisKKz1pdGVtIEI8Uk5Eb3ZlcndyaXRlPiA9IHllcyB8IG5vCisKK25hZHBpc3ogcGxpayBub3d5bWkgd2FydG/Fm2NpYW1pIHBzZXVkb2xvc293eW1pCisKK2RvbXnFm2xuaWU6IHllcyAobmFkcGlzeikKKworPWl0ZW0gQjxzZXJ2aWNlPiA9IFNFUldJUyAodHlsa28gVW5peCkKKworbmF6d2EgdXPFgnVnaQorCitQb2RhbmEgbmF6d2EgdXPFgnVnaSBixJlkemllIHXFvHl3YW5hIGpha28gbmF6d2EgdXPFgnVnaSBkbGEgaW5pY2phbGl6YWNqaSBzeXNsb2dhLAorb3JheiBkbGEgYmlibGlvdGVraSBUQ1AgV3JhcHBlciB3IHRyeWJpZSBJPGluZXRkPi4gIENob2NpYcW8IHRlY2huaWN6bmllIG1vxbxuYQordcW8ecSHIHRlaiBvcGNqaSB3IHRyeWJpZSB3IHNla2NqaSB1c8WCdWcsIHRvIGplc3Qgb25hIHXFvHl0ZWN6bmEgamVkeW5pZSB3IG9wY2phY2gKK2dsb2JhbG55Y2guCisKK2RvbXnFm2xuaWU6IHN0dW5uZWwKKworPWl0ZW0gQjxzZXRnaWQ+ID0gSURFTlRZRklLQVRPUl9HUlVQWSAodHlsa28gVW5peCkKKworZ3J1cGEgeiBrdMOzcmVqIHByYXdhbWkgcHJhY293YcWCIGLEmWR6aWUgQjxzdHVubmVsPgorCis9aXRlbSBCPHNldHVpZD4gPSBJREVOVFlGSUtBVE9SX1XFu1lUS09XTklLQSAodHlsa28gVW5peCkKKwordcW8eXRrb3duaWssIHoga3TDs3JlZ28gcHJhd2FtaSBwcmFjb3dhxYIgYsSZZHppZSBCPHN0dW5uZWw+CisKKz1pdGVtIEI8c29ja2V0PiA9IGF8bHxyOk9QQ0pBPVdBUlRPxZrEhls6V0FSVE/FmsSGXQorCit1c3RhdyBvcGNqxJkgbmEgYWtjZXB0dWrEhWN5bS9sb2thbG55bS96ZGFsbnltIGduaWXFumR6aWUKKworRGxhIG9wY2ppIGxpbmdlciB3YXJ0b8WbY2kgbWFqxIUgcG9zdGHEhyBsX29ub2Y6bF9saW5nZXIuCitEbGEgb3BjamkgdGltZSB3YXJ0b8WbY2kgbWFqxIUgcG9zdGHEhyB0dl9zZWM6dHZfdXNlYy4KKworUHJ6eWvFgmFkeToKKworICAgIHNvY2tldCA9IGw6U09fTElOR0VSPTE6NjAKKyAgICAgICAgdXN0YXcgamVkbm9taW51dG93ZSBwcnpldGVybWlub3dhbmllCisgICAgICAgIHByenkgemFteWthbml1IGxva2FsbmVnbyBnbmlhemRhCisgICAgc29ja2V0ID0gcjpTT19PT0JJTkxJTkU9eWVzCisgICAgICAgIHVtaWXFm8SHIGRhbmUgcG96YXBhc21vd2UgKG91dC1vZi1iYW5kKQorICAgICAgICBiZXpwb8WbcmVkbmlvIHcgc3RydW1pZW5pdSBkYW55Y2gKKyAgICAgICAgd2VqxZtjaW93eWNoIGRsYSB6ZGFsbnljaCBnbmlhemQKKyAgICBzb2NrZXQgPSBhOlNPX1JFVVNFQUREUj1ubworICAgICAgICB6YWJsb2t1aiBwb25vd25lIHXFvHl3YW5pZSBwb3J0dQorICAgICAgICAoZG9tecWbbG5pZSB3xYLEhWN6b25lKQorICAgIHNvY2tldCA9IGE6U09fQklORFRPREVWSUNFPWxvCisgICAgICAgIHByenlqbXVqIHBvxYLEhWN6ZW5pYSB3ecWCxIVjem5pZSBuYQorICAgICAgICBpbnRlcmZlanNpZSB6d3JvdG55bSAoYW5nLiBsb29wYmFjaykKKworPWl0ZW0gQjxzeXNsb2c+ID0geWVzIHwgbm8gKHR5bGtvIFVuaXgpCisKK3fFgsSFY3ogbG9nb3dhbmllIHBvcHJ6ZXogbWVjaGFuaXptIHN5c2xvZworCitkb215xZtsbmllOiB5ZXMgKHfFgsSFY3opCisKKz1pdGVtIEI8dGFza2Jhcj4gPSB5ZXMgfCBubyAodHlsa28gV0lOMzIpCisKK3fFgsSFY3ogaWtvbmvEmSB3IHByYXd5bSBkb2xueW0gcm9ndSBla3JhbnUKKworZG9tecWbbG5pZTogeWVzICh3xYLEhWN6KQorCis9YmFjaworCisKKz1oZWFkMiBPUENKRSBVU8WBVUcKKworS2HFvGRhIHNla2NqYSBrb25maWd1cmFjamkgdXPFgnVnaSB6YWN6eW5hIHNpxJkgamVqIG5henfEhSB1asSZdMSFIHcgbmF3aWFzCitrd2FkcmF0b3d5LiAgTmF6d2EgdXPFgnVnaSB1xbx5d2FuYSBqZXN0IGRvIGtvbnRyb2xpIGRvc3TEmXB1IHByemV6CitiaWJsaW90ZWvEmSBsaWJ3cmFwIChUQ1Agd3JhcHBlcnMpIG9yYXogcG96d2FsYSByb3pyw7PFvG5pxIcgcG9zemN6ZWfDs2xuZQordXPFgnVnaSB3IGxvZ2FjaC4KKworSmXFvGVsaSBCPHN0dW5uZWw+IG1hIHpvc3RhxIcgdcW8eXR5IHcgdHJ5YmllIEk8aW5ldGQ+LCBnZHppZSB6YSBvZGVicmFuaWUKK3BvxYLEhWN6ZW5pYSBvZHBvd2lhZGEgb3NvYm55IHByb2dyYW0gKHp3eWtsZSBJPGluZXRkPiwgSTx4aW5ldGQ+CitsdWIgSTx0Y3BzZXJ2ZXI+KSwgbmFsZcW8eSBwcnplY3p5dGHEhyBzZWtjasSZIEk8VFJZQiBJTkVURD4gcG9uacW8ZWouCisKKz1vdmVyIDQKKworPWl0ZW0gQjxhY2NlcHQ+ID0gW0hPU1Q6XVBPUlQKKworbmFzxYJ1Y2h1amUgbmEgcG/FgsSFY3plbmlhIG5hIHBvZGFueW0gYWRyZXNpZSBpIHBvcmNpZQorCitKZcW8ZWxpIG5pZSB6b3N0YcWCIHBvZGFueSBhZHJlcywgQjxzdHVubmVsPiBkb215xZtsbmllIG5hc8WCdWNodWplCituYSB3c3p5c3RraWNoIGFkcmVzYWNoIElQdjQgbG9rYWxueWNoIGludGVyZmVqc8Ozdy4KKworQWJ5IG5hc8WCdWNoaXdhxIcgbmEgd3N6eXN0a2ljaCBhZHJlc2FjaCBJUHY2IG5hbGXFvHkgdcW8ecSHOgorCisgICAgYWNjZXB0ID0gOjo6cG9ydAorCis9aXRlbSBCPENBcGF0aD4gPSBLQVRBTE9HX0NBCisKK2thdGFsb2cgQ2VudHJ1bSBDZXJ0eWZpa2FjamkKKworT3BjamEgb2tyZcWbbGEga2F0YWxvZywgdyBrdMOzcnltIEI8c3R1bm5lbD4gYsSZZHppZSBzenVrYcWCIGNlcnR5ZmlrYXTDs3csCitqZcW8ZWxpIHXFvHl0YSB6b3N0YcWCYSBvcGNqYSBJPHZlcmlmeT4uICBQbGlraSB6IGNlcnR5ZmlrYXRhbWkgbXVzesSFCitwb3NpYWRhxIcgc3BlY2phbG5lIG5hend5IFhYWFhYWFhYLjAsIGdkemllIFhYWFhYWFhYIGplc3Qgc2tyw7N0ZW0KK2tyeXB0b2dyYWZpY3pueW0gcmVwcmV6ZW50YWNqaSBERVIgbmF6d3kgcG9kbWlvdHUgY2VydHlmaWthdHUuCisKK0Z1bmtjamEgc2tyw7N0dSB6b3N0YcWCYSB6bWllbmlvbmEgdyBCPE9wZW5TU0wgMS4wLjA+LgorTmFsZcW8eSB3eWtvbmHEhyBjX3JlaGFzaCBwcnp5IHptaWFuaWUgQjxPcGVuU1NMIDAueC54PiBuYSBCPDEueC54Pi4KKworSmXFvGVsaSB6ZGVmaW5pb3dhbm8ga2F0YWxvZyBJPGNocm9vdD4sIHRvIMWbY2llxbxrYSBkbyBJPENBcGF0aD4gamVzdCBva3JlxZtsb25hCit3emdsxJlkZW0gdGVnbyBrYXRhbG9ndS4KKworPWl0ZW0gQjxDQWZpbGU+ID0gUExJS19DQQorCitwbGlrIENlbnRydW0gQ2VydHlmaWthY2ppCisKK09wY2phIHBvendhbGEgb2tyZcWbbGnEhyBwb8WCb8W8ZW5pZSBwbGlrdSB6YXdpZXJhasSFY2VnbyBjZXJ0eWZpa2F0eSB1xbx5d2FuZQorcHJ6ZXogb3BjasSZIEk8dmVyaWZ5Pi4KKworPWl0ZW0gQjxjZXJ0PiA9IFBMSUtfUEVNCisKK3BsaWsgeiDFgmHFhGN1Y2hlbSBjZXJ0eWZpa2F0w7N3CisKK09wY2phIG9rcmXFm2xhIHBvxYJvxbxlbmllIHBsaWt1IHphd2llcmFqxIVjZWdvIGNlcnR5ZmlrYXR5IHXFvHl3YW5lIHByemV6Citwcm9ncmFtIEI8c3R1bm5lbD4gZG8gdXdpZXJ6eXRlbG5pZW5pYSBzacSZIHByemVkIGRydWfEhSBzdHJvbsSFIHBvxYLEhWN6ZW5pYS4KK0NlcnR5ZmlrYXQgamVzdCBrb25pZWN6bnksIGFieSB1xbx5d2HEhyBwcm9ncmFtdSB3IHRyeWJpZSBzZXJ3ZXJhLgorVyB0cnliaWUga2xpZW50YSBjZXJ0eWZpa2F0IGplc3Qgb3Bjam9uYWxueS4KKworPWl0ZW0gQjxjaGVja0VtYWlsPiA9IEVNQUlMCisKK2FkcmVzIGVtYWlsIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dQorCitQb2plZHluY3phIHNla2NqYSBtb8W8ZSB6YXdpZXJhxIcgd2llbGUgd3lzdMSFcGllxYQgb3BjamkgQjxjaGVja0VtYWlsPi4KK0NlcnR5ZmlrYXR5IHPEhSBha2NlcHRvd2FuZSwgamXFvGVsaSBzZWtjamEgbmllIHphd2llcmEgb3BjamkgQjxjaGVja0VtYWlsPiwKK2FsYm8gYWRyZXMgZW1haWwgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1IHBhc3VqZSBkbyBqZWRuZWdvIHogYWRyZXPDs3cKK2VtYWlsIG9rcmXFm2xvbnljaCBwcnp5IHBvbW9jeSBCPGNoZWNrRW1haWw+LgorCis9aXRlbSBCPGNoZWNrSG9zdD4gPSBOQVpXQV9TRVJXRVJBCisKK25hendhIHNlcndlcmEgcHJ6ZWRzdGF3aW9uZWdvIGNlcnR5ZmlrYXR1CisKK1BvamVkeW5jemEgc2VrY2phIG1vxbxlIHphd2llcmHEhyB3aWVsZSB3eXN0xIVwaWXFhCBvcGNqaSBCPGNoZWNrSG9zdD4uCitDZXJ0eWZpa2F0eSBzxIUgYWtjZXB0b3dhbmUsIGplxbxlbGkgc2VrY2phIG5pZSB6YXdpZXJhIG9wY2ppIEI8Y2hlY2tIb3N0PiwgYWxibworbmF6d2Egc2Vyd2VyYSBwcnplZHN0YXdpb25lZ28gY2VydHlmaWthdHUgcGFzdWplIGRvIGplZG5lZ28gbmF6dyBva3JlxZtsb255Y2gKK3ByenkgcG9tb2N5IEI8Y2hlY2tIb3N0Pi4KKworPWl0ZW0gQjxjaGVja0lQPiA9IElQCisKK2FkcmVzIElQIHByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dQorCitQb2plZHluY3phIHNla2NqYSBtb8W8ZSB6YXdpZXJhxIcgd2llbGUgd3lzdMSFcGllxYQgb3BjamkgQjxjaGVja0lQPi4gIENlcnR5ZmlrYXR5CitzxIUgYWtjZXB0b3dhbmUsIGplxbxlbGkgc2VrY2phIG5pZSB6YXdpZXJhIG9wY2ppIEI8Y2hlY2tJUD4sIGFsYm8gYWRyZXMgSVAKK3ByemVkc3Rhd2lvbmVnbyBjZXJ0eWZpa2F0dSBwYXN1amUgZG8gamVkbmVnbyB6IGFkcmVzw7N3IElQIG9rcmXFm2xvbnljaCBwcnp5Citwb21vY3kgQjxjaGVja0lQPi4KKworPWl0ZW0gQjxjaXBoZXJzPiA9IExJU1RBX1NaWUZSw5NXCisKK2xpc3RhIGRvendvbG9ueWNoIHN6eWZyw7N3IFNTTAorCitQYXJhbWV0cmVtIHRlaiBvcGNqaSBqZXN0IGxpc3RhIHN6eWZyw7N3LCBrdMOzcmUgYsSZZMSFIHXFvHl0ZSBwcnp5CitvdHdpZXJhbml1IG5vd3ljaCBwb8WCxIVjemXFhCBTU0wsIG5wLjogIERFUy1DQkMzLVNIQTpJREVBLUNCQy1NRDUKKworPWl0ZW0gQjxjbGllbnQ+ID0geWVzIHwgbm8KKwordHJ5YiBrbGllbmNraSAoemRhbG5hIHVzxYJ1Z2EgdcW8eXdhIFNTTCkKKworZG9tecWbbG5pZTogbm8gKHRyeWIgc2Vyd2Vyb3d5KQorCis9aXRlbSBCPGNvbm5lY3Q+ID0gW0hPU1Q6XVBPUlQKKworcG/FgsSFY3ogc2nEmSB6ZSB6ZGFsbnltIHNlcndlcmVtIG5hIHBvZGFueSBwb3J0CisKK0plxbxlbGkgbmllIHpvc3RhxYIgcG9kYW55IGFkcmVzLCBCPHN0dW5uZWw+IGRvbXnFm2xuaWUgxYLEhWN6eSBzacSZCit6IGxva2FsbnltIHNlcndlcmVtLgorCitLb21lbmRhIG1vxbxlIGJ5YyB1xbx5dGEgd2llbG9rcm90bmllIHcgcG9qZWR5bmN6ZWogc2VrY2ppCitjZWxlbSB6YXBld25pZW5pYSB3eXNva2llaiBuaWV6YXdvZG5vxZtjaSBsdWIgcm96xYJvxbxlbmlhCitydWNodSBwb21pxJlkenkgd2llbGUgc2Vyd2Vyw7N3LgorCis9aXRlbSBCPENSTHBhdGg+ID0gS0FUQUxPR19DUkwKKwora2F0YWxvZyBMaXN0IE9kd2/FgmFueWNoIENlcnR5ZmlrYXTDs3cgKENSTCkKKworT3BjamEgb2tyZcWbbGEga2F0YWxvZywgdyBrdMOzcnltIEI8c3R1bm5lbD4gYsSZZHppZSBzenVrYcWCIGxpc3QgQ1JMLAoramXFvGVsaSB1xbx5dGEgem9zdGHFgmEgb3BjamEgSTx2ZXJpZnk+LiAgUGxpa2kgeiBsaXN0YW1pIENSTCBtdXN6xIUKK3Bvc2lhZGHEhyBzcGVjamFsbmUgbmF6d3kgWFhYWFhYWFgucjAsIGdkemllIFhYWFhYWFhYIGplc3Qgc2tyw7N0ZW0KK2xpc3R5IENSTC4KKworRnVua2NqYSBza3LDs3R1IHpvc3RhxYJhIHptaWVuaW9uYSBCPE9wZW5TU0wgMS4wLjA+LgorTmFsZcW8eSB3eWtvbmHEhyBjX3JlaGFzaCBwcnp5IHptaWFuaWUgQjxPcGVuU1NMIDAueC54PiBuYSBCPDEueC54Pi4KKworSmXFvGVsaSB6ZGVmaW5pb3dhbm8ga2F0YWxvZyBJPGNocm9vdD4sIHRvIMWbY2llxbxrYSBkbyBJPENSTHBhdGg+IGplc3Qgb2tyZcWbbG9uYQord3pnbMSZZGVtIHRlZ28ga2F0YWxvZ3UuCisKKz1pdGVtIEI8Q1JMZmlsZT4gPSBQTElLX0NSTAorCitwbGlrIExpc3QgT2R3b8WCYW55Y2ggQ2VydHlmaWthdMOzdyAoQ1JMKQorCitPcGNqYSBwb3p3YWxhIG9rcmXFm2xpxIcgcG/Fgm/FvGVuaWUgcGxpa3UgemF3aWVyYWrEhWNlZ28gbGlzdHkgQ1JMIHXFvHl3YW5lCitwcnpleiBvcGNqxJkgSTx2ZXJpZnk+LgorCis9aXRlbSBCPGN1cnZlPiA9IE5JRAorCitrcnp5d2EgZGxhIEVDREgKKworTGlzdMSZIGRvc3TEmXBueWNoIGtyenl3eWNoIG1vxbxuYSB1enlza2HEhyBwb2xlY2VuaWVtOgorCisgICAgb3BlbnNzbCBlY3BhcmFtIC1saXN0X2N1cnZlcworCitkb215xZtsbmllOiBwcmltZTI1NnYxCisKKz1pdGVtIEI8bG9nSWQ+ID0gVFlQCisKK3R5cCBpZGVudHlmaWthdG9yYSBwb8WCxIVjemVuaWEga2xpZW50YQorCitJZGVudHlmaWthdG9yIHRlbiBwb3p3YWxhIHJvenLDs8W8bmnEhyB3cGlzeSB3IGxvZ3Ugd3lnZW5lcm93YW5lIGRsYQorcG9zemN6ZWfDs2xueWNoIHBvxYLEhWN6ZcWELgorCitBa3R1YWxuaWUgd3NwaWVyYW5lIHR5cHk6CisKKz1vdmVyIDQKKworPWl0ZW0gSTxzZXF1ZW50aWFsPgorCitLb2xlam55IG51bWVyIHBvxYLEhWN6ZW5pYSBqZXN0IHVuaWthbG55IGplZHluaWUgdyBvYnLEmWJpZSBwb2plZHluY3plaiBpbnN0YW5jamkKK3Byb2dyYW11IEI8c3R1bm5lbD4sIGFsZSBiYXJkem8ga3LDs3RraS4gIEplc3Qgb24gc3pjemVnw7NsbmllIHXFvHl0Y3pueSBwcnp5CityxJljem5laiBhbmFsaXppZSBsb2fDs3cuCisKKz1pdGVtIEk8dW5pcXVlPgorCitUZW4gcm9kemFqIGlkZW50eWZpa2F0b3JhIGplc3QgZ2xvYmFsbmllIHVuaWthbG55LCBhbGUgem5hY3puaWUgZMWCdcW8c3p5LCBuacW8Citrb2xlam55IG51bWVyIHBvxYLEhWN6ZW5pYS4gIEplc3Qgb24gc3pjemVnw7NsbmllIHXFvHl0ZWN6bnkgcHJ6eSB6YXV0b21hdHl6b3dhbmVqCithbmFsaXppZSBsb2fDs3cuCisKKz1pdGVtIEk8dGhyZWFkPgorCitJZGVudHlmaWthdG9yIHfEhXRrdSBzeXN0ZW11IG9wZXJhY3lqbmVnbyBuaWUgamVzdCBhbmkgdW5pa2FsbnkgKG5hd2V0IHcgb2JyxJliaWUKK3BvamVkeW5jemVqIGluc3RhbmNqaSBwcm9ncmFtdSBCPHN0dW5uZWw+KSwgYW5pIGtyw7N0a2kuICBKZXN0IG9uIHN6Y3plZ8OzbG5pZQordcW8eXRlY3pueSBwcnp5IGRpYWdub3pvd2FuaXUgcHJvYmxlbcOzdyB6IG9wcm9ncmFtb3dhbmllbSBsdWIga29uZmlndXJhY2rEhS4KKworPWJhY2sKKworZG9tecWbbG5pZTogc2VxdWVudGlhbAorCis9aXRlbSBCPGRlYnVnPiA9IFBPWklPTQorCitzemN6ZWfDs8WCb3dvxZvEhyBsb2dvd2FuaWEKKworUG96aW9tIGxvZ293YW5pYSBtb8W8bmEgb2tyZcWbbGnEhyBwcnp5IHBvbW9jeSBqZWRuZWogeiBuYXp3IGx1YiBsaWN6YjoKK2VtZXJnICgwKSwgYWxlcnQgKDEpLCBjcml0ICgyKSwgZXJyICgzKSwgd2FybmluZyAoNCksIG5vdGljZSAoNSksCitpbmZvICg2KSBsdWIgZGVidWcgKDcpLgorWmFwaXN5d2FuZSBzxIUga29tdW5pa2F0eSBvIHBvemlvbWllIG5pxbxzenltIChudW1lcnljem5pZSkgbHViIHLDs3dueW0gcG9kYW5lbXUuCitEbyB1enlza2FuaWEgbmFqd3nFvHN6ZWdvIHBvemlvbXUgc3pjemVnw7PFgm93b8WbY2kgbW/FvG5hIHXFvHnEhyBvcGNqaQorSTxkZWJ1ZyA9IGRlYnVnPiBsdWIgSTxkZWJ1ZyA9IDc+LiAgRG9tecWbbG55bSBwb3ppb21lbSBqZXN0IG5vdGljZSAoNSkuCisKKz1pdGVtIEI8ZGVsYXk+ID0geWVzIHwgbm8KKworb3DDs8W6bmlqIHJvendpbmnEmWNpZSBhZHJlc3UgRE5TIHBvZGFuZWdvIHcgb3BjamkgSTxjb25uZWN0PgorCitPcGNqYSBqZXN0IHByenlkYXRuYSBwcnp5IGR5bmFtaWN6bnltIEROUywgYWxibyBnZHkgdXPFgnVnYSBETlMgbmllIGplc3QKK2Rvc3TEmXBuYSBwcnp5IHN0YXJjaWUgcHJvZ3JhbXUgQjxzdHVubmVsPiAoa2xpZW50IFZQTiwgcG/FgsSFY3plbmllIHdkendhbmlhbmUpLgorCitPcMOzxbpuaW9uZSByb3p3aWphbmllIGFkcmVzdSBETlMgamVzdCB3xYLEhWN6YW5lIGF1dG9tYXR5Y3puaWUsIGplxbxlbGkgbmllCitwb3dpZWR6aWUgc2nEmSByb3p3aW5pxJljaWUga3TDs3JlZ29rb2x3aWVrIHogYWRyZXPDs3cgSTxjb25uZWN0PiBkbGEgZGFuZWoKK3VzxYJ1Z2kuCisKK09ww7PFum5pb25lIHJvendpamFuaWUgYWRyZXN1IGF1dG9tYXR5Y3puaWUgYWt0eXd1amUgSTxmYWlsb3ZlciA9IHByaW8+LgorCitkZWZhdWx0OiBubworCis9aXRlbSBCPGVuZ2luZUlkPiA9IE5VTUVSX1VSWsSERFpFTklBCisKK3d5YmllcnogdXJ6xIVkemVuaWUgZGxhIHVzxYJ1Z2kKKworPWl0ZW0gQjxlbmdpbmVOdW0+ID0gTlVNRVJfVVJaxIREWkVOSUEKKword3liaWVyeiB1cnrEhWR6ZW5pZSBkbGEgdXPFgnVnaQorCitVcnrEhWR6ZW5pYSBzxIUgbnVtZXJvd2FuZSBvZCAxIHcgZ8OzcsSZLgorCis9aXRlbSBCPGV4ZWM+ID0gxZpDSUXFu0tBX0RPX1BST0dSQU1VCisKK3d5a29uYWogbG9rYWxueSBwcm9ncmFtIHByenlzdG9zb3dhbnkgZG8gcHJhY3kgeiBzdXBlcmRlbW9uZW0gaW5ldGQKKworSmXFvGVsaSB6ZGVmaW5pb3dhbm8ga2F0YWxvZyBJPGNocm9vdD4sIHRvIMWbY2llxbxrYSBkbyBJPGV4ZWM+IGplc3Qgb2tyZcWbbG9uYQord3pnbMSZZGVtIHRlZ28ga2F0YWxvZ3UuCisKK05hIHBsYXRmb3JtYWNoIFVuaXggdXN0YXdpYW5lIHPEhSBuYXN0xJlwdWrEhWNlIHptaWVubmUgxZtyb2Rvd2lza293ZToKK1JFTU9URV9IT1NULCBSRU1PVEVfUE9SVCwgU1NMX0NMSUVOVF9ETiwgU1NMX0NMSUVOVF9JX0ROLgorCis9aXRlbSBCPGV4ZWNBcmdzPiA9ICQwICQxICQyIC4uLgorCithcmd1bWVudHkgZG8gb3BjamkgSTxleGVjPiB3xYLEhWN6bmllIHogbmF6d8SFIHByb2dyYW11ICgkMCkKKworQ3l0b3dhbmllIG5pZSBqZXN0IHdzcGllcmFuZSB3IG9iZWNuZWogd2Vyc2ppIHByb2dyYW11LgorQXJndW1lbnR5IHPEhSByb3pkemllbG9uZSBkb3dvbG7EhSBsaWN6YsSFIGJpYcWCeWNoIHpuYWvDs3cuCisKKz1pdGVtIEI8ZmFpbG92ZXI+ID0gcnIgfCBwcmlvCisKK1N0cmF0ZWdpYSB3eWJpZXJhbmlhIHNlcndlcsOzdyB3eXNwZWN5Zmlrb3dhbnljaCBwYXJhbWV0cmFtaSAiY29ubmVjdCIuCisKKyAgICByciAocm91bmQgcm9iaW4pIC0gc3ByYXdpZWRsaXdlIHJvesWCb8W8ZW5pZSBvYmNpxIXFvGVuaWEKKyAgICBwcmlvIChwcmlvcml0eSkgLSB1xbx5aiBrb2xlam5vxZtjaSBvcGNqaSB3IHBsaWt1IGtvbmZpZ3VyYWN5am55bQorCitkb215xZtsbmllOiBycgorCis9aXRlbSBCPGlkZW50PiA9IE5BWldBX1XFu1lUS09XTklLQQorCit3ZXJ5ZmlrdWogbmF6d8SZIHpkYWxuZWdvIHXFvHl0a293bmlrYSBrb3J6eXN0YWrEhWMgeiBwcm90b2tvxYJ1IElERU5UIChSRkMgMTQxMykKKworPWl0ZW0gQjxpbmNsdWRlPiA9IEtBVEFMT0cKKword2N6eXRhaiBmcmFnbWVudHkgcGxpa8OzdyBrb25maWd1cmFjeWpueWNoIHogcG9kYW5lZ28ga2F0YWxvZ3UKKworUGxpa2kgc8SFIHdjenl0eXdhbmUgdyByb3NuxIVjZWoga29sZWpub8WbY2kgYWxmYWJldHljem5laiBpY2ggbmF6dy4KKworPWl0ZW0gQjxrZXk+ID0gUExJS19LTFVDWkEKKwora2x1Y3ogcHJ5d2F0bnkgZG8gY2VydHlmaWthdHUgcG9kYW5lZ28gdyBvcGNqaSBJPGNlcnQ+CisKK0tsdWN6IHByeXdhdG55IGplc3QgcG90cnplYm55IGRvIHV3aWVyenl0ZWxuaWVuaWEgd8WCYcWbY2ljaWVsYSBjZXJ0eWZpa2F0dS4KK1Bvbmlld2HFvCBwb3dpbmllbiBvbiBiecSHIHphY2hvd2FueSB3IHRhamVtbmljeSwgcHJhd2EgZG8gamVnbyBvZGN6eXR1Citwb3dpbmllbiBtaWXEhyB3ecWCxIVjem5pZSB3xYJhxZtjaWNpZWwgcGxpa3UuICBXIHN5c3RlbWllIFVuaXggbW/FvG5hIHRvIG9zacSFZ27EhcSHCitrb21lbmTEhToKKworICAgIGNobW9kIDYwMCBrZXlmaWxlCisKK2RvbXnFm2xuaWU6IHdhcnRvxZvEhyBvcGNqaSBJPGNlcnQ+CisKKz1pdGVtIEI8bGlid3JhcD4gPSB5ZXMgfCBubworCit3xYLEhWN6IGx1YiB3ecWCxIVjeiBrb3J6eXN0YW5pZSB6IC9ldGMvaG9zdHMuYWxsb3cgaSAvZXRjL2hvc3RzLmRlbnkuCisKK2RvbXnFm2xuaWU6IG5vIChvZCB3ZXJzamkgNS4wMCkKKworPWl0ZW0gQjxsb2NhbD4gPSBIT1NUCisKK0lQIMW6csOzZMWCYSBkbyBuYXdpxIV6eXdhbmlhIHpkYWxueWNoIHBvxYLEhWN6ZcWECisKK0RvbXnFm2xuaWUgdcW8eXdhbmUgamVzdCBJUCBuYWpiYXJkemllaiB6ZXduxJl0cnpuZWdvIGludGVyZmVqc3UgdyBzdHJvbsSZCitzZXJ3ZXJhLCBkbyBrdMOzcmVnbyBuYXdpxIV6eXdhbmUgamVzdCBwb8WCxIVjemVuaWUuCisKKz1pdGVtIEI8c25pPiA9IFVTxYFVR0E6V1pPUlpFQ19OQVpXWV9TRVJXRVJBICh0cnliIHNlcndlcmEpCisKK1XFvHlqIHVzxYJ1Z2kgamFrbyBwb2RyesSZZG5laiAodmlydHVhbG5lZ28gc2Vyd2VyYSkgZGxhIHJvenN6ZXJ6ZW5pYSBUTFMgU2VydmVyCitOYW1lIEluZGljYXRpb24gKFJGQyAzNTQ2KS4KKworSTxuYXp3YV91c8WCdWdpPiB3c2thenVqZSB1c8WCdWfEmSBuYWRyesSZZG7EhSwga3TDs3JhIG9kYmllcmEgcG/FgsSFY3plbmlhIG9kIGtsaWVudMOzdworcHJ6eSBwb21vY3kgb3BjamkgSTxhY2NlcHQ+LiAgSTx3em9yemVjX25hend5X3NlcndlcmE+IHdza2F6dWplIG5henfEmSBzZXJ3ZXJhCit3aXJ0dWFsbmVnby4gIFd6b3J6ZWMgbW/FvGUgemFjenluYcSHIHNpxJkgem5ha2llbSAnKicsIG5wLiAnKi5leGFtcGxlLmNvbSIuCitaIHBvamVkecWEY3rEhSB1c8WCdWfEhSBuYWRyesSZZG7EhSBwb3dpxIV6YW5lIGplc3Qgend5a2xlIHdpZWxlIHVzxYJ1ZyBwb2RyesSZZG55Y2guCitPcGNqYSBJPHNuaT4gbW/FvGUgYnnEhyByb3duaWXFvCB1xbx5dGEgd2llbG9rcm90bmllIHcgcmFtYWNoIGplZG5laiB1c8WCdWdpCitwb2RyesSZZG5lai4KKworWmFyw7N3bm8gdXPFgnVnYSBuYWRyesSZZG5hIGphayBpIHBvZHJ6xJlkbmEgbmllIG1vxbxlIGJ5xIcgc2tvbmZpZ3Vyb3dhbmEgdyB0cnliaWUKK2tsaWVuY2tpbS4KKworT3BjamEgSTxjb25uZWN0PiB1c8WCdWdpIHBvZHJ6xJlkbmVqIGplc3QgaWdub3Jvd2FuYSB3IHBvxYLEhWN6ZW5pdSB6IG9wY2rEhQorSTxwcm90b2NvbD4sIGdkecW8IHBvxYLEhWN6ZW5pZSBkbyB6ZGFsbmVnbyBzZXJ3ZXJhIGplc3QgdyB0eW0gd3lwYWRrdSBuYXdpxIV6eXdhbmUKK3ByemVkIG5lZ29jamFjasSFIFRMUy4KKworVXdpZXJ6eXRlbG5pZW5pZSBwcnp5IHBvbW9jeSBiaWJsaW90ZWtpIGxpYndyYXAgamVzdCByZWFsaXpvd2FuZSBkd3Vrcm90bmllOgorbmFqcGllcncgZGxhIHVzxYJ1Z2kgbmFkcnrEmWRuZWogcG8gb2RlYnJhbml1IHBvxYLEhWN6ZW5pYSBUQ1AsIGEgbmFzdMSZcG5pZSBkbGEKK3VzxYJ1Z2kgcG9kcnrEmWRuZWogcG9kY3phcyBuZWdvY2phY2ppIFRMUy4KKworT3BjamEgSTxzbmk+IGplc3QgZG9zdMSZcG5hIHBvY3rEhXdzenkgb2QgQjxPcGVuU1NMIDEuMC4wPi4KKworPWl0ZW0gQjxzbmk+ID0gSE9TVCAodHJ5YiBrbGllbnRhKQorCitVxbx5aiBwYXJhbWV0cnUgamFrbyB3YXJ0b8WbY2kgcm96c3plcnplbmlhIFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uCisoUkZDIDM1NDYpLgorCitPcGNqYSBJPHNuaT4gamVzdCBkb3N0xJlwbmEgcG9jesSFd3N6eSBvZCBCPE9wZW5TU0wgMS4wLjA+LgorCis9aXRlbSBCPE9DU1A+ID0gVVJMCisKK3NlcndlciBPQ1NQIGRvIHdlcnlmaWthY2ppIGNlcnR5ZmlrYXTDs3cKKworPWl0ZW0gQjxPQ1NQYWlhPiA9IHllcyB8IG5vCisKK3dlcnlmaWt1aiBjZXJ0eWZpa2F0eSBwcnp5IHXFvHljaXUgcmVzcG9uZGVydMOzdyBBSUEKKworT3BjamEgSTxPQ1NQYWlhPiBwb3p3YWxhIG5hIHdlcnlmaWtvd2FuaWUgY2VydHlmaWthdMOzdyBwcnp5IHBvbW9jeSBsaXN0eSBVUkxpCitzZXJ3ZXLDs3cgT0NTUCBwcnplc8WCYW55Y2ggdyByb3pzemVyemVuaWFjaCBBSUEgKEF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MpLgorCis9aXRlbSBCPE9DU1BmbGFnPiA9IEZMQUdBX09DU1AKKworZmxhZ2Egc2Vyd2VyYSBPQ1NQCisKK2FrdHVhbG5pZSB3c3BpZXJhbmUgZmxhZ2k6IE5PQ0VSVFMsIE5PSU5URVJOIE5PU0lHUywgTk9DSEFJTiwgTk9WRVJJRlksCitOT0VYUExJQ0lULCBOT0NBU0lHTiwgTk9ERUxFR0FURUQsIE5PQ0hFQ0tTLCBUUlVTVE9USEVSLCBSRVNQSURfS0VZLCBOT1RJTUUKKworQWJ5IHd5c3BlY3lmaWtvd2HEhyBraWxrYSBmbGFnIG5hbGXFvHkgdcW8ecSHIEk8T0NTUGZsYWc+IHdpZWxva3JvdG5pZS4KKworPWl0ZW0gQjxvcHRpb25zPiA9IE9QQ0pFX1NTTAorCitvcGNqZSBiaWJsaW90ZWtpIEI8T3BlblNTTD4KKworUGFyYW1ldHJlbSBqZXN0IG5hendhIG9wY2ppIHpnb2RuaWUgeiBvcGlzZW0gdyBJPFNTTF9DVFhfc2V0X29wdGlvbnMoM3NzbCk+LAorYWxlIGJleiBwcnplZHJvc3RrYSBJPFNTTF9PUF8+LgorSTxzdHVubmVsIC1vcHRpb25zPiB3ecWbd2lldGxhIG9wY2plIGRvendvbG9uZSB3IGFrdHVhbG5laiBrb21iaW5hY2ppCitwcm9ncmFtdSBJPHN0dW5uZWw+IGkgYmlibGlvdGVraSBJPE9wZW5TU0w+LgorCitBYnkgd3lzcGVjeWZpa293YcSHIGtpbGthIG9wY2ppIG5hbGXFvHkgdcW8ecSHIEk8b3B0aW9ucz4gd2llbG9rcm90bmllLgorTmF6d2Egb3BjamkgbW/FvGUgYnnEhyBwb3ByemVkem9uYSBtecWbbG5pa2llbSAoIi0iKSBjZWxlbSB3ecWCxIVjemVuaWEgb3BjamkuCisKK05hIHByenlrxYJhZCwgZGxhIHphY2hvd2FuaWEga29tcGF0eWJpbG5vxZtjaSB6IGLFgsSZZGFtaSBpbXBsZW1lbnRhY2ppIFNTTAordyBwcm9ncmFtaWUgRXVkb3JhLCBtb8W8bmEgdcW8ecSHIG9wY2ppOgorCisgICAgb3B0aW9ucyA9IERPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUworCitkb215xZtsbmllOgorCisgICAgb3B0aW9ucyA9IE5PX1NTTHYyCisgICAgb3B0aW9ucyA9IE5PX1NTTHYzCisKKz1pdGVtIEI8cHJvdG9jb2w+ID0gUFJPVE9Lw5PFgQorCituZWdvY2p1aiBTU0wgcG9kYW55bSBwcm90b2tvxYJlbSBhcGxpa2FjeWpueW0KKworT3BjamEgdGEgd8WCxIVjemEgd3N0xJlwbsSFIG5lZ29jamFjasSZIHN6eWZyb3dhbmlhIFNTTCBkbGEgd3licmFuZWdvIHByb3Rva2/FgnUKK2FwbGlrYWN5am5lZ28uCitPcGNqaSBJPHByb3RvY29sPiBuaWUgbmFsZcW8eSB1xbx5d2HEhyB6IHN6eWZyb3dhbmllbSBTU0wgbmEgb3NvYm55bSBwb3JjaWUuCisKK0FrdHVhbG5pZSB3c3BpZXJhbmUgcHJvdG9rb8WCeToKKworPW92ZXIgNAorCis9aXRlbSBJPGNpZnM+CisKK1VuaWV1ZG9rdW1lbnRvd2FuZSByb3pzemVyemVuaWUgcHJvdG9rb8WCdSBDSUZTIHdzcGllcmFuZSBwcnpleiBzZXJ3ZXIgU2FtYmEuCitXc3BhcmNpZSBkbGEgdGVnbyByb3pyemVjemVuaWEgem9zdGHFgm8gemFyenVjb25lIHcgd2Vyc2ppIDMuMC4wIHNlcndlcmEgU2FtYmEuCisKKz1pdGVtIEk8Y29ubmVjdD4KKworTmVnb2NqYWNqYSBSRkMgMjgxNyAtIEk8VXBncmFkaW5nIHRvIFRMUyBXaXRoaW4gSFRUUC8xLjE+LCByb3pkemlhxYIgNS4yIC0gSTxSZXF1ZXN0aW5nIGEgVHVubmVsIHdpdGggQ09OTkVDVD4KKworVGVuIHByb3Rva8OzxYIgamVzdCB3c3BpZXJhbnkgd3nFgsSFY3puaWUgdyB0cnliaWUga2xpZW5ja2ltLgorCis9aXRlbSBJPGltYXA+CisKK05lZ29jamFjamEgUkZDIDI1OTUgLSBJPFVzaW5nIFRMUyB3aXRoIElNQVAsIFBPUDMgYW5kIEFDQVA+CisKKz1pdGVtIEk8bm50cD4KKworTmVnb2NqYWNqYSBSRkMgNDY0MiAtIEk8VXNpbmcgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHdpdGggTmV0d29yayBOZXdzIFRyYW5zZmVyIFByb3RvY29sIChOTlRQKT4KKworVGVuIHByb3Rva8OzxYIgamVzdCB3c3BpZXJhbnkgd3nFgsSFY3puaWUgdyB0cnliaWUga2xpZW5ja2ltLgorCis9aXRlbSBJPHBnc3FsPgorCitOZWdvY2phY2phIGh0dHA6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy84LjMvc3RhdGljL3Byb3RvY29sLWZsb3cuaHRtbCNBRU43Mzk4MgorCis9aXRlbSBJPHBvcDM+CisKK05lZ29jamFjamEgUkZDIDI0NDkgLSBJPFBPUDMgRXh0ZW5zaW9uIE1lY2hhbmlzbT4KKworPWl0ZW0gSTxwcm94eT4KKworUHJ6ZWthenl3YW5pZSBhZHJlc3UgSVAgaGFwcm94eSBodHRwOi8vaGFwcm94eS4xd3QuZXUvZG93bmxvYWQvMS41L2RvYy9wcm94eS1wcm90b2NvbC50eHQKKworPWl0ZW0gSTxzbXRwPgorCitOZWdvY2phY2phIFJGQyAyNDg3IC0gSTxTTVRQIFNlcnZpY2UgRXh0ZW5zaW9uIGZvciBTZWN1cmUgU01UUCBvdmVyIFRMUz4KKworPWl0ZW0gSTxzb2Nrcz4KKworV3NwaWVyYW55IGplc3QgcHJvdG9rw7PFgiBTT0NLUyB3IHdlcnNqYWNoIDQsIDRhIGkgNS4KK1Byb3Rva8OzxYIgU09DS1MgZW5rYXBzdWxvd2FueSBqZXN0IHcgcHJvdG9rb2xlIFNTTC9UTFMsIHdpxJljIGFkcmVzIHNlcndlcmEKK2RvY2Vsb3dlZ28gbmllIGplc3Qgd2lkb2N6bnkgZGxhIG5hcGFzdG5pa2EgcHJ6ZWNod3l0dWrEhWNlZ28gcnVjaCBzaWVjaW93eS4KKworRjxodHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9zb2NrczQucHJvdG9jb2w+CisKK0Y8aHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvc29ja3M0YS5wcm90b2NvbD4KKworTmllIGplc3Qgd3NwaWVyYW5hIGtvbWVuZGEgQklORCBwcm90b2tvxYJ1IFNPQ0tTLgorUHJ6ZXPFgmFuYSB3YXJ0b8WbxIcgcGFyYW1ldHJ1IFVTRVJJRCBqZXN0IGlnbm9yb3dhbmEuCisKK1Nla2NqYSBQUlpZS8WBQURZIHphd2llcmEgcHJ6eWvFgmFkb3dlIHBsaWtpIGtvbmZpZ3VyYWN5am5lIFZQTmEgemJ1ZG93YW5lZ28KK3cgb3BhcmNpdSBvIHN6eWZyb3dhbnkgcHJvdG9rw7PFgiBTT0NLUy4KKworPWJhY2sKKworPWl0ZW0gQjxwcm90b2NvbEF1dGhlbnRpY2F0aW9uPiA9IGJhc2ljIHwgbnRsbQorCityb2R6YWogdXdpZXJ6eXRlbG5pZW5pYSBkbyBuZWdvY2phY2ppIHByb3Rva2/FgnUKKworT2JlY25pZSB0eXAgdXdpZXJ6eXRlbG5pZW5pYSBtYSB6YXN0b3Nvd2FuaWUgd3nFgsSFY3puaWUgdyBwcm90b2tvbGUgJ2Nvbm5lY3QnLgorCitkb215xZtsbmllOiBiYXNpYworCis9aXRlbSBCPHByb3RvY29sSG9zdD4gPSBIT1NUOlBPUlQKKworYWRyZXMgZG9jZWxvd3kgZG8gbmVnb2NqYWNqaSBwcm90b2tvxYJ1CisKK0k8cHJvdG9jb2xIb3N0PiBva3JlxZtsYSBkb2NlbG93eSBzZXJ3ZXIgU1NMLCBkbyBrdMOzcmVnbyBwb8WCxIVjennEhyBtYSBzacSZIHByb3h5LgorTmllIGplc3QgdG8gYWRyZXMgc2Vyd2VyYSBwcm94eSwgZG8ga3TDs3JlZ28gcG/FgsSFY3plbmllIHplc3Rhd2lhIEI8c3R1bm5lbD4uCitBZHJlcyBzZXJ3ZXJhIHByb3h5IHBvd2luaWVuIGJ5xIcgb2tyZcWbbG9ueSBwcnp5IHBvbW9jeSBvcGNqaSAnY29ubmVjdCcuCisKK1cgb2JlY25laiB3ZXJzamkgYWRyZXMgZG9jZWxvd3kgcHJvdG9rb8WCdSBtYSB6YXN0b3Nvd2FuaWUgd3nFgsSFY3puaWUgdyBwcm90b2tvbGUKKydjb25uZWN0Jy4KKworPWl0ZW0gQjxwcm90b2NvbFBhc3N3b3JkPiA9IEhBU8WBTworCitoYXPFgm8gZG8gbmVnb2NqYWNqaSBwcm90b2tvxYJ1CisKKz1pdGVtIEI8cHJvdG9jb2xVc2VybmFtZT4gPSBVxbtZVEtPV05JSworCituYXp3YSB1xbx5dGtvd25pa2EgZG8gbmVnb2NqYWNqaSBwcm90b2tvxYJ1CisKKz1pdGVtIEI8UFNLaWRlbnRpdHk+ID0gVE/Fu1NBTU/FmsSGCisKK3RvxbxzYW1vxZvEhyBrbGllbnRhIFBTSworCitJPFBTS2lkZW50aXR5PiBtb8W8ZSB6b3N0YcSHIHXFvHl0ZSB3IHNla2NqYWNoIGtsaWVuY2tpY2ggZG8gd3licmFuaWEKK3RvxbxzYW1vxZtjaSB1xbx5dGVqIGRvIHV3aWVyenl0ZWxuaWVuaWEgUFNLLgorT3BjamEgamVzdCBpZ25vcm93YW5hIHcgc2VrY2phY2ggc2Vyd2Vyb3d5Y2guCisKK2RvbXnFm2xuaWU6IHBpZXJ3c3phIHRvxbxzYW1vxZvEhyB6ZGVmaW5pb3dhbmEgdyBwbGlrdSBJPFBTS3NlY3JldHM+CisKKz1pdGVtIEI8UFNLc2VjcmV0cz4gPSBQTElLCisKK3BsaWsgeiB0b8W8c2Ftb8WbY2lhbWkgaSBrbHVjemFtaSBQU0sKKworS2HFvGRhIGxpbmlhIHBsaWt1IGplc3QgdyBuYXN0xJlwdWrEhWN5bSBmb3JtYWNpZToKKworICAgIFRPxbtTQU1PxZrEhjpLTFVDWgorCitLbHVjeiBtdXNpIGJ5xIcgbWllxIcgcHJ6eW5ham1uaWVqIDIwIHpuYWvDs3cuCitOYWxlxbx5IG9ncmFuaWN6ecSHIGRvc3TEmXAgZG8gY3p5dGFuaWEgbHViIHBpc2FuaWEgZG8gdGVnbyBwbGlrdS4KKworPWl0ZW0gQjxwdHk+ID0geWVzIHwgbm8gKHR5bGtvIFVuaXgpCisKK2Fsb2t1aiBwc2V1ZG90ZXJtaW5hbCBkbGEgcHJvZ3JhbXUgdXJ1Y2hhbWlhbmVnbyB3IG9wY2ppICdleGVjJworCis9aXRlbSBCPHJlZGlyZWN0PiA9IFtIT1NUOl1QT1JUCisKK3ByemVraWVydWoga2xpZW50YSwga3TDs3JlbXUgbmllIHVkYcWCbyBzacSZIHBvcHJhd25pZSB1d2llcnp5dGVsbmnEhyBwcnp5IHBvbW9jeSBjZXJ0eWZpa2F0dQorCitPcGNqYSBkemlhxYJhIHd5xYLEhWN6bmllIHcgdHJ5YmllIHNlcndlcmEuCitDesSZxZvEhyBuZWdvY2phY2ppIHByb3Rva2/FgsOzdyBqZXN0IG5pZWtvbXBhdHliaWxuYSB6IG9wY2rEhSBJPHJlZGlyZWN0Pi4KKworPWl0ZW0gQjxyZW5lZ290aWF0aW9uPiA9IHllcyB8IG5vCisKK3BvendhbGFqIG5hIHJlbmVnb2NqYWNqxJkgU1NMCisKK1fFm3LDs2QgemFzdG9zb3dhxYQgcmVuZWdvY2phY2ppIFNTTCBzxIUgbmlla3TDs3JlIHNjZW5hcml1c3plIHV3aWVyenl0ZWxuaWVuaWEsCitvcmF6IHJlbmVnb2NqYWNqYSBrbHVjenkgZGxhIGTFgnVnb3Ryd2HFgnljaCBwb8WCxIVjemXFhC4KKworWiBkcnVnaWVqIHN0cm9ueSB3xYJhc25vxZvEhyBuYSBtb8W8ZSB1xYJhdHdpxIcgdHJ5d2lhbG55IGF0YWsgRG9TIHBvcHJ6ZXoKK3d5Z2VuZXJvd2FuaWUgb2JjacSFxbxlbmlhIHByb2Nlc29yYToKKworaHR0cDovL3ZpbmNlbnQuYmVybmF0LmltL2VuL2Jsb2cvMjAxMS1zc2wtZG9zLW1pdGlnYXRpb24uaHRtbAorCitXYXJ0byB6YXV3YcW8ecSHLCDFvGUgemFibG9rb3dhbmllIHJlbmVnb2NqYWNqaSBTU0wgbmllIHplYmV6cGllY3phIHcgcGXFgm5pCitwcnplZCBvcGlzYW55bSBwcm9ibGVtZW0uCisKK2RvbXnFm2xuaWU6IHllcyAobyBpbGUgd3NwaWVyYW5lIHByemV6IEI8T3BlblNTTD4pCisKKz1pdGVtIEI8cmVzZXQ+ID0geWVzIHwgbm8KKworc3lnbmFsaXp1aiB3eXN0xIVwaWVuaWUgYsWCxJlkdSBwcnp5IHBvbW9jeSBmbGFnaSBUQ1AgUlNUCisKK09wY2phIG5pZSBqZXN0IHdzcGllcmFuYSBuYSBuaWVrdMOzcnljaCBwbGF0Zm9ybWFjaC4KKworZG9tecWbbG5pZTogeWVzCisKKz1pdGVtIEI8cmV0cnk+ID0geWVzIHwgbm8KKworcG/FgsSFY3ogcG9ub3duaWUgc2VrY2rEmSBjb25uZWN0K2V4ZWMgcG8gcm96xYLEhWN6ZW5pdQorCitkb215xZtsbmllOiBubworCis9aXRlbSBCPHNlc3Npb25DYWNoZVNpemU+ID0gTElDWkJBX1BPWllDSklfQ0FDSEUKKworcm96bWlhciBwYW1pxJljaSBwb2RyxJljem5laiBzZXNqaSBTU0wKKworUGFyYW1ldHIgb2tyZcWbbGEgbWFrc3ltYWxuxIUgbGljemLEmSBwb3p5Y2ppIHdld27EmXRyem5laiBwYW1pxJljaSBwb2RyxJljem5lagorc2VzamkuCisKK1dhcnRvxZvEhyAwIG96bmFjemEgYnJhayBvZ3JhbmljemVuaWEgcm96bWlhcnUuICBOaWUgamVzdCB0byB6YWxlY2FuZSBkbGEKK3N5c3RlbcOzdyBwcm9kdWtjeWpueWNoIHogdXdhZ2kgbmEgcnl6eWtvIGF0YWt1IERvUyBwcnpleiB3eWN6ZXJwYW5pZSBwYW1pxJljaQorUkFNLgorCis9aXRlbSBCPHNlc3Npb25DYWNoZVRpbWVvdXQ+ID0gTElDWkJBX1NFS1VORAorCitwcnpldGVybWlub3dhbmllIHBhbWnEmWNpIHBvZHLEmWN6bmVqIHNlc2ppIFNTTAorCitQYXJhbWV0ciBva3JlxZtsYSBjemFzIHcgc2VrdW5kYWNoLCBwbyBrdMOzcnltIHNlc2phIFNTTCB6b3N0YW5pZSB1c3VuacSZdGEgegorcGFtacSZY2kgcG9kcsSZY3puZWouCisKKz1pdGVtIEI8c2Vzc2lvbmQ+ID0gSE9TVDpQT1JUCisKK2FkcmVzIHNlc3Npb25kIC0gc2VydmVyYSBjYWNoZSBzZXNqaSBTU0wKKworPWl0ZW0gQjxzc2xWZXJzaW9uPiA9IFdFUlNKQV9TU0wKKword2Vyc2phIHByb3Rva2/FgnUgU1NMCisKK1dzcGllcmFuZSBvcGNqZTogYWxsLCBTU0x2MiwgU1NMdjMsIFRMU3YxLCBUTFN2MS4xLCBUTFN2MS4yCisKK0Rvc3TEmXBub8WbxIcga29ua3JldG55Y2ggcHJvdG9rb8WCw7N3IHphbGXFvHkgb2QgdcW8eXRlaiB3ZXJzamkgT3BlblNTTC4KK1N0YXJzemUgd2Vyc2plIE9wZW5TU0wgbmllIHdzcGllcmFqxIUgVExTdjEuMSBpIFRMU3YxLjIuCitOb3dzemUgd2Vyc2plIE9wZW5TU0wgbmllIHdzcGllcmFqxIUgU1NMdjIuCisKK1ByemVzdGFyemHFgmUgcHJvdG9rb8WCeSBTU0x2MiBpIFNTTHYzIHPEhSBkb215xZtsbmllIHd5xYLEhWN6b25lLgorU3pjemVnw7PFgm93ZSBpbmZvcm1hY2plIGRvc3TEmXBuZSBzxIUgdyBvcGlzaWUgb3BjamkgQjxvcHRpb25zPi4KKworPWl0ZW0gQjxzdGFjaz4gPSBMSUNaQkFfQkFKVMOTVyAoeiB3eWrEhXRraWVtIG1vZGVsdSBGT1JLKQorCityb3ptaWFyIHN0b3N1IHByb2Nlc29yYSB3xIV0a3UgCisKKz1pdGVtIEI8VElNRU9VVGJ1c3k+ID0gTElDWkJBX1NFS1VORAorCitjemFzIG9jemVraXdhbmlhIG5hIHNwb2R6aWV3YW5lIGRhbmUKKworPWl0ZW0gQjxUSU1FT1VUY2xvc2U+ID0gTElDWkJBX1NFS1VORAorCitjemFzIG9jemVraXdhbmlhIG5hIGNsb3NlX25vdGlmeSAodXN0YXcgbmEgMCwgamXFvGVsaSBrbGllbnRlbSBqZXN0IE1TSUUpCisKKz1pdGVtIEI8VElNRU9VVGNvbm5lY3Q+ID0gTElDWkJBX1NFS1VORAorCitjemFzIG9jemVraXdhbmlhIG5hIG5hd2nEhXphbmllIHBvxYLEhWN6ZW5pYQorCis9aXRlbSBCPFRJTUVPVVRpZGxlPiA9IExJQ1pCQV9TRUtVTkQKKworbWFrc3ltYWxueSBjemFzIHV0cnp5bXl3YW5pYSBiZXpjenlubmVnbyBwb8WCxIVjemVuaWEKKworPWl0ZW0gQjx0cmFuc3BhcmVudD4gPSBub25lIHwgc291cmNlIHwgZGVzdGluYXRpb24gfCBib3RoICh0eWxrbyBVbml4KQorCit0cnliIHByemV6cm9jenlzdGVnbyBwcm94eSBuYSB3c3BpZXJhbnljaCBwbGF0Zm9ybWFjaAorCitXc3BpZXJhbmUgb3BjamU6CisKKz1vdmVyIDQKKworPWl0ZW0gQjxub25lPgorCitaYWJsb2t1aiB3c3BhcmNpZSBkbGEgcHJ6ZXpyb2N6eXN0YWdvIHByb3h5LiAgSmVzdCB0byB3YXJ0b8WbxIcgZG9tecWbbG5hLgorCis9aXRlbSBCPHNvdXJjZT4KKworUHJ6ZXBpc3ogYWRyZXMsIGFieSBuYXdpxIV6eXdhbmUgcG/FgsSFY3plbmllIHd5ZGF3YcWCbyBzacSZIHBvY2hvZHppxIcKK2JlenBvxZtyZWRuaW8gb2Qga2xpZW50YSwgYSBuaWUgb2QgcHJvZ3JhbXUgQjxzdHVubmVsPi4KKworT3BjamEgamVzdCBha3R1YWxuaWUgb2JzxYJ1Z2l3YW5hIHc6CisKKz1vdmVyIDQKKworPWl0ZW0gVHJ5YmllIHpkYWxueW0gKG9wY2phIEk8Y29ubmVjdD4pIHcgc3lzdGVtaWUgSTxMaW51eCBFPGd0Pj0yLjYuMjg+CisKK0tvbmZpZ3VyYWNqYSB3eW1hZ2EgbmFzdMSZcHVqxIVjeWNoIHVzdGF3aWXFhCBpcHRhYmxlcyBvcmF6IHJvdXRpbmd1CisobmEgcHJ6eWvFgmFkIHcgcGxpa3UgL2V0Yy9yYy5sb2NhbCBsdWIgYW5hbG9naWN6bnltKToKKworICAgIGlwdGFibGVzIC10IG1hbmdsZSAtTiBESVZFUlQKKyAgICBpcHRhYmxlcyAtdCBtYW5nbGUgLUEgUFJFUk9VVElORyAtcCB0Y3AgLW0gc29ja2V0IC1qIERJVkVSVAorICAgIGlwdGFibGVzIC10IG1hbmdsZSAtQSBESVZFUlQgLWogTUFSSyAtLXNldC1tYXJrIDEKKyAgICBpcHRhYmxlcyAtdCBtYW5nbGUgLUEgRElWRVJUIC1qIEFDQ0VQVAorICAgIGlwIHJ1bGUgYWRkIGZ3bWFyayAxIGxvb2t1cCAxMDAKKyAgICBpcCByb3V0ZSBhZGQgbG9jYWwgMC4wLjAuMC8wIGRldiBsbyB0YWJsZSAxMDAKKyAgICBlY2hvIDAgPi9wcm9jL3N5cy9uZXQvaXB2NC9jb25mL2xvL3JwX2ZpbHRlcgorCitLb25maWd1cmFjamEgdGEgd3ltYWdhLCBhYnkgQjxzdHVubmVsPiBiecWCIHd5a29ueXdhbnkgamFrbyByb290IGkgYmV6IG9wY2ppIEk8c2V0dWlkPi4KKworPWl0ZW0gVHJ5YmllIHpkYWxueW0gKG9wY2phIEk8Y29ubmVjdD4pIHcgc3lzdGVtaWUgSTxMaW51eCAyLjIueD4KKworS29uZmlndXJhY2phIHRhIHd5bWFnYSBza29tcGlsb3dhbmlhIGrEhWRyYSB6IG9wY2rEhSBJPHRyYW5zcGFyZW50IHByb3h5Pi4KK0RvY2Vsb3dhIHVzxYJ1Z2EgbXVzaSBiecSHIHVtaWVzemN6b25hIG5hIG9zb2JuZWogbWFzenluaWUsIGRvIGt0w7NyZWogcm91dGluZwora2llcm93YW55IGplc3QgcG9wcnpleiBzZXJ3ZXIgQjxzdHVubmVsYT4uCisKK0RvZGF0a293byBCPHN0dW5uZWw+IHBvd2luaWVuIGJ5xIcgd3lrb255d2FueSBqYWtvIHJvb3QgaSBiZXogb3BjamkgSTxzZXR1aWQ+LgorCis9aXRlbSBUcnliaWUgemRhbG55bSAob3BjamEgSTxjb25uZWN0PikgdyBzeXN0ZW1pZSBJPEZyZWVCU0QgRTxndD49OC4wPgorCitLb25maWd1cmFjamEgdGEgd3ltYWdhIHNrb25maWd1cm93YW5pYSBmaXJld2FsbGEgaSByb3V0aW5ndS4KK0I8c3R1bm5lbD4gbXVzaSBiecSHIHd5a29ueXdhbnkgamFrbyByb290IGkgYmV6IG9wY2ppIEk8c2V0dWlkPi4KKworPWl0ZW0gVHJ5YmllIGxva2FsbnltIChvcGNqYSBJPGV4ZWM+KQorCitLb25maWd1cmFjamEgdGEgamVzdCByZWFsaXpvd2FuYSBwcnp5IHBvbW9jeSBiaWJsaW90ZWtpIEk8bGlic3R1bm5lbC5zbz4uCitEbyB6YcWCYWRvd2FuaWEgYmlibGlvdGVraSB3eWtvcnp5c3R5d2FuYSBqZXN0IHptaWVubmEgxZtyb2Rvd2lza293YSBfUkxEX0xJU1QgbmEKK3BsYXRmb3JtaWUgVHJ1NjQgbHViIExEX1BSRUxPQUQgbmEgaW5ueWNoIHBsYXRmb3JtYWNoLgorCis9YmFjaworCis9aXRlbSBJPGRlc3RpbmF0aW9uPgorCitPcnlnaW5hbG55IGFkcmVzIGRvY2Vsb3d5IGplc3QgdcW8eXdhbnkgemFtaWFzdCBvcGNqaSBJPGNvbm5lY3Q+LgorCitQcnp5a8WCYWRvd2FuYSBrb25maWd1cmFjamEgcHJ6ZXpyb2N6eXN0ZWdvIGFkcmVzdSBkb2NlbG93ZWdvOgorCisgICAgW3RyYW5zcGFyZW50XQorICAgIGNsaWVudD15ZXMKKyAgICBhY2NlcHQ9PHBvcnRfc3R1bm5lbGE+CisgICAgdHJhbnNwYXJlbnQ9ZGVzdGluYXRpb24KKworS29uZmlndXJhY2phIHd5bWFnYSB1c3Rhd2llxYQgaXB0YWJsZXMsIG5hIHByenlrxYJhZCB3IHBsaWt1CisvZXRjL3JjLmxvY2FsIGx1YiBhbmFsb2dpY3pueW0uCisKK1cgcHJ6eXBhZGt1IGRvY2Vsb3dlaiB1c8WCdWdpIHVtaWVzemN6b25laiBuYSB0ZWogc2FtZWogbWFzenluaWU6CisKKyAgICAvc2Jpbi9pcHRhYmxlcyAtdCBuYXQgLUkgT1VUUFVUIC1wIHRjcCAtLWRwb3J0IDxwb3J0X3ByemVraWVyb3dhbnk+IFwKKyAgICAgICAgLW0gISAtLXVpZC1vd25lciA8aWRlbnR5ZmlrYXRvcl91xbx5dGtvd25pa2Ffc3R1bm5lbGE+IFwKKyAgICAgICAgLWogRE5BVCAtLXRvLWRlc3RpbmF0aW9uIDxsb2thbG5lX2lwPjo8bG9rYWxueV9wb3J0PgorCitXIHByenlwYWRrdSBkb2NlbG93ZWogdXPFgnVnaSB1bWllc3pjem9uZWogbmEgemRhbG5laiBtYXN6eW5pZToKKworICAgIC9zYmluL2lwdGFibGVzIC1JIElOUFVUIC1pIGV0aDAgLXAgdGNwIC0tZHBvcnQgPHBvcnRfc3R1bm5lbGE+IC1qIEFDQ0VQVAorICAgIC9zYmluL2lwdGFibGVzIC10IG5hdCAtSSBQUkVST1VUSU5HIC1wIHRjcCAtLWRwb3J0IDxwb3J0X3ByemVraWVyb3dhbnk+IFwKKyAgICAgICAgLWkgZXRoMCAtaiBETkFUIC0tdG8tZGVzdGluYXRpb24gPGxva2FsbmVfaXA+Ojxwb3J0X3N0dW5uZWxhPgorCitQcnplenJvY3p5c3R5IGFkcmVzIGRvY2Vsb3d5IGplc3QgYWt0dWFsbmllIHdzcGllcmFueSB3ecWCxIVjem5pZSB3IHN5c3RlbWllIExpbnV4LgorCis9aXRlbSBJPGJvdGg+CisKK1XFvHlqIHByemV6cm9jenlzdGVnbyBwcm94eSB6YXLDs3dubyBkbGEgYWRyZXN1IMW6csOzZMWCb3dlZ28gamFrIGkgZG9jZWxvd2Vnby4KKworPWJhY2sKKworRGxhIHphcGV3bmllbmlhIGtvbXBhdHliaWxub8WbY2kgeiB3Y3plxZtuaWVqc3p5bWltIHdlcnNqYW1pIHdzcGllcmFuZSBzxIUgZHdpZQorZG9kYXRrb3dlIG9wY2plOgorCis9b3ZlciA0CisKKz1pdGVtIEk8eWVzPgorCitPcGNqYSB6b3N0YcWCYSBwcnplbWlhbm93YW5hIG5hIEk8c291cmNlPi4KKworPWl0ZW0gSTxubz4KKworT3BjamEgem9zdGHFgmEgcHJ6ZW1pYW5vd2FuYSBuYSBJPG5vbmU+LgorCis9YmFjaworCis9aXRlbSBCPHZlcmlmeT4gPSBQT1pJT00KKword2VyeWZpa3VqIGNlcnR5ZmlrYXQgZHJ1Z2llaiBzdHJvbnkgcG/FgsSFY3plbmlhCisKKz1vdmVyIDQKKworPWl0ZW0gSTxwb3ppb20gMD4KKworemFyesSFZGFqIGNlcnR5ZmlrYXR1IGkgemlnbm9ydWogZ28KKworPWl0ZW0gSTxwb3ppb20gMT4KKword2VyeWZpa3VqLCBqZcW8ZWxpIHpvc3RhxYIgcHJ6ZWRzdGF3aW9ueQorCis9aXRlbSBJPHBvemlvbSAyPgorCit3ZXJ5ZmlrdWogeiB6YWluc3RhbG93YW55bSBjZXJ0eWZpa2F0ZW0gQ2VudHJ1bSBDZXJ0eWZpa2FjamkKKworPWl0ZW0gSTxwb3ppb20gMz4KKword2VyeWZpa3VqIHogbG9rYWxuaWUgemFpbnN0YWxvd2FueW0gY2VydHlmaWthdGVtIGRydWdpZWogc3Ryb255CisKKz1pdGVtIEk8cG96aW9tIDQ+CisKK3dlcnlmaWt1aiB6IGNlcnR5ZmlrYXRlbSBkcnVnaWVqIHN0cm9ueSBpZ25vcnVqxIVjIMWCYcWEY3VjaCBDQQorCis9aXRlbSBJPGRvbXnFm2xuaWU+CisKK25pZSB3ZXJ5ZmlrdWoKKworPWJhY2sKKworPWJhY2sKKworCis9aGVhZDEgWldSQUNBTkEgV0FSVE/FmsSGCisKK0I8c3R1bm5lbD4gendyYWNhIHplcm8gdyBwcnp5cGFka3Ugc3VrY2VzdSwgbHViIHdhcnRvxZvEhyBuaWV6ZXJvd8SFCit3IHByenlwYWRrdSBixYLEmWR1LgorCisKKz1oZWFkMSBTSUdOQcWBWQorCitOYXN0xJlwdWrEhWNlIHN5Z25hxYJ5IG1vZ8SFIGJ5xIcgdcW8eXRlIGRvIHN0ZXJvd2FuaWEgcHJvZ3JhbWVtIHcgc3lzdGVtaWUgVW5peDoKKworPW92ZXIgNAorCis9aXRlbSBTSUdIVVAKKworWmHFgmFkdWogcG9ub3duaWUgcGxpayBrb25maWd1cmFjeWpueS4KKworTmlla3TDs3JlIGdsb2JhbG5lIG9wY2plIG5pZSBixJlkxIUgcHJ6ZcWCYWRvd2FuZToKKworPW92ZXIgNAorCis9aXRlbSAqCisKK2Nocm9vdAorCis9aXRlbSAqCisKK2ZvcmVncm91bmQKKworPWl0ZW0gKgorCitwaWQKKworPWl0ZW0gKgorCitzZXRnaWQKKworPWl0ZW0gKgorCitzZXR1aWQKKworPWJhY2sKKworSmXFvGVsaSB3eWtvcnp5c3R5d2FuYSBqZXN0IG9wY2phICdzZXR1aWQnIEI8c3R1bm5lbD4gbmllIGLEmWR6aWUgbcOzZ8WCIHphxYJhZG93YcSHCitwb25vd25pZSBrb25maWd1cmFjamkgd3lrb3J6eXN0dWrEhWNlaiB1cHJ6eXdpbGVqb3dhbmUgKDwxMDI0KSBwb3J0eS4KKworSmXFvGVsaSB3eWtvcnp5c3R5d2FuYSBqZXN0IG9wY2phICdjaHJvb3QnIEI8c3R1bm5lbD4gYsSZZHppZSBzenVrYcWCIHdzenlzdGtpY2gKK3BvdHJ6ZWJueWNoIHBsaWvDs3cgKMWCxIVjem5pZSB6IHBsaWtpZW0ga29uZmlndXJhY3lqbnltLCBjZXJ0eWZpa2F0YW1pLCBsb2dpZW0gaQorcGxpa2llbSBwaWQpIHdld27EhXRyeiBrYXRhbG9ndSB3c2themFuZWdvIHByemV6ICdjaHJvb3QnLgorCis9aXRlbSBTSUdVU1IxCisKK1phbWtuaWogaSBvdHfDs3J6IHBvbm93bmllIGxvZy4KK0Z1bmtjamEgdGEgbW/FvGUgem9zdGHEhyB1xbx5dGEgdyBza3J5cGNpZSByb3R1asSFY3ltIGxvZyBwcm9ncmFtdSBCPHN0dW5uZWw+LgorCis9aXRlbSBTSUdURVJNLCBTSUdRVUlULCBTSUdJTlQKKworWmFrb8WEY3ogZHppYcWCYW5pZSBwcm9ncmFtdS4KKworPWJhY2sKKworU2t1dGVrIHd5c8WCYW5pYSBpbm55Y2ggc3lnbmHFgsOzdyBqZXN0IG5pZXpkZWZpbmlvd2FueS4KKworCis9aGVhZDEgUFJaWUvFgUFEWQorCitTenlmcm93YW5pZSBwb8WCxIVjemXFhCBkbyBsb2thbG5lZ28gc2Vyd2VyYSBJPGltYXBkPiBtb8W8bmEgdcW8ecSHOgorCisgICAgW2ltYXBkXQorICAgIGFjY2VwdCA9IDk5MworICAgIGV4ZWMgPSAvdXNyL3NiaW4vaW1hcGQKKyAgICBleGVjQXJncyA9IGltYXBkCisKK2FsYm8gdyB0cnliaWUgemRhbG55bToKKworICAgIFtpbWFwZF0KKyAgICBhY2NlcHQgPSA5OTMKKyAgICBjb25uZWN0ID0gMTQzCisKK0FieSB1bW/FvGxpd2nEhyBsb2thbG5lbXUga2xpZW50b3dpIHBvY3p0eSBlbGVrdHJvbmljem5laiBrb3J6eXN0YW5pZSB6IHNlcndlcmEKK0k8aW1hcGQ+IHByemV6IFNTTCBuYWxlxbx5IHNrb25maWd1cm93YcSHIHBvYmllcmFuaWUgcG9jenR5IHogYWRyZXN1IGxvY2FsaG9zdCBpCitwb3J0dSAxMTksIG9yYXogdcW8ecSHIG5hc3TEmXB1asSFY2VqIGtvbmZpZ3VyYWNqaToKKworICAgIFtpbWFwXQorICAgIGNsaWVudCA9IHllcworICAgIGFjY2VwdCA9IDE0MworICAgIGNvbm5lY3QgPSBzZXJ3ZXI6OTkzCisKK1cgcG/FgsSFY3plbml1IHogcHJvZ3JhbWVtIEk8cHBwZD4gQjxzdHVubmVsPiBwb3p3YWxhIHplc3Rhd2nEhyBwcm9zdHkgVlBOLgorUG8gc3Ryb25pZSBzZXJ3ZXJhIG5hc8WCdWNodWrEhWNlZ28gbmEgcG9yY2llIDIwMjAgamVnbyBrb25maWd1cmFjamEKK21vxbxlIHd5Z2zEhWRhxIcgbmFzdMSZcHVqxIVjbzoKKworICAgIFt2cG5dCisgICAgYWNjZXB0ID0gMjAyMAorICAgIGV4ZWMgPSAvdXNyL3NiaW4vcHBwZAorICAgIGV4ZWNBcmdzID0gcHBwZCBsb2NhbAorICAgIHB0eSA9IHllcworCitQb25pxbxzenkgcGxpayBrb25maWd1cmFjeWpueSBtb8W8ZSBiecSHIHd5a29yenlzdGFueSBkbyB1cnVjaG9taWVuaWEKK3Byb2dyYW11IEI8c3R1bm5lbD4gdyB0cnliaWUgSTxpbmV0ZD4uICBXYXJ0byB6YXV3YcW8ecSHLCDFvGUgdyBwbGlrdQora29uZmlndXJhY3lqbnltIG5pZSBtYSBzZWtjamkgSTxbbmF6d2FfdXPFgnVnaV0+LgorCisgICAgZXhlYyA9IC91c3Ivc2Jpbi9pbWFwZAorICAgIGV4ZWNBcmdzID0gaW1hcGQKKworQWJ5IHNrb25maWd1cm93YcSHIFZQTiBtb8W8bmEgdcW8ecSHIG5hc3TEmXB1asSFY2VqIGtvbmZpZ3VyYWNqaSBrbGllbnRhOgorCisgICAgW3NvY2tzX2NsaWVudF0KKyAgICBjbGllbnQgPSB5ZXMKKyAgICBhY2NlcHQgPSAxMjcuMC4wLjE6MTA4MAorICAgIGNvbm5lY3QgPSB2cG5fc2VydmVyOjkwODAKKyAgICB2ZXJpZnkgPSA0CisgICAgQ0FmaWxlID0gc3R1bm5lbC5wZW0KKworT2Rwb3dpYWRhasSFY2EgamVqIGtvbmZpZ3VyYWNqYSBzZXJ3ZXJhIHZwbl9zZXJ2ZXI6CisKKyAgICBbc29ja3Nfc2VydmVyXQorICAgIHByb3RvY29sID0gc29ja3MKKyAgICBhY2NlcHQgPSA5MDgwCisgICAgY2VydCA9IHN0dW5uZWwucGVtCisgICAga2V5ID0gc3R1bm5lbC5rZXkKKworRG8gcHJ6ZXRlc3Rvd2FuaWEga29uZmlndXJhY2ppIG1vxbxuYSB3eWRhxIcgbmEgbWFzenluaWUga2xpZW5ja2llaiBrb21lbmTEmToKKworICAgIGN1cmwgLS1zb2NrczRhIGxvY2FsaG9zdCBodHRwOi8vd3d3LmV4YW1wbGUuY29tLworCis9aGVhZDEgTk9US0kKKworPWhlYWQyIE9HUkFOSUNaRU5JQQorCitCPHN0dW5uZWw+IG5pZSBtb8W8ZSBiecSHIHXFvHl3YW55IGRvIHN6eWZyb3dhbmlhIHByb3Rva2/FgnUgSTxGVFA+LAorcG9uaWV3YcW8IGRvIHByemVzecWCYW5pYSBwb3N6Y3plZ8OzbG55Y2ggcGxpa8OzdyB1xbx5d2Egb24gZG9kYXRrb3d5Y2gKK3BvxYLEhWN6ZcWEIG90d2llcmFueWNoIG5hIHBvcnRhY2ggbyBkeW5hbWljem5pZSBwcnp5ZHppZWxhbnljaCBudW1lcmFjaC4KK0lzdG5pZWrEhSBqZWRuYWsgc3BlY2phbG5lIHdlcnNqZSBrbGllbnTDs3cgaSBzZXJ3ZXLDs3cgRlRQIHBvendhbGFqxIVjZQorbmEgc3p5ZnJvd2FuaWUgcHJ6ZXN5xYJhbnljaCBkYW55Y2ggcHJ6eSBwb21vY3kgcHJvdG9rb8WCdSBJPFNTTD4uCisKKz1oZWFkMiBUUllCIElORVREICh0eWxrbyBVbml4KQorCitXIHdpxJlrc3pvxZtjaSB6YXN0b3Nvd2HFhCBCPHN0dW5uZWw+IHNhbW9kemllbG5pZSBuYXPFgnVjaHVqZSBuYSBwb3JjaWUKK3BvZGFueW0gdyBwbGlrdSBrb25maWd1cmFjeWpueW0gaSB0d29yenkgcG/FgsSFY3plbmllIHogaW5ueW0gcG9ydGVtCitwb2RhbnltIHcgb3BjamkgSTxjb25uZWN0PiBsdWIgbm93eW0gcHJvZ3JhbWVtIHBvZGFueW0gdyBvcGNqaSBJPGV4ZWM+LgorTmlla3TDs3J6eSB3b2zEhSBqZWRuYWsgd3lrb3J6eXN0eXdhxIcgb2RkemllbG55IHByb2dyYW0sIGt0w7NyeSBvZGJpZXJhCitwb8WCxIVjemVuaWEsIHBvIGN6eW0gdXJ1Y2hhbWlhIHByb2dyYW0gQjxzdHVubmVsPi4gIFByenlrxYJhZGFtaSB0YWtpY2gKK3Byb2dyYW3Ds3cgc8SFIGluZXRkLCB4aW5ldGQgaSB0Y3BzZXJ2ZXIuCisKK1ByenlrxYJhZG93YSBsaW5pYSBwbGlrdSAvZXRjL2luZXRkLmNvbmYgbW/FvGUgd3lnbMSFZGHEhyB0YWs6CisKKyAgICBpbWFwcyBzdHJlYW0gdGNwIG5vd2FpdCByb290IEBiaW5kaXJAL3N0dW5uZWwKKyAgICAgICAgc3R1bm5lbCBAc3lzY29uZmRpckAvc3R1bm5lbC9pbWFwcy5jb25mCisKK1Bvbmlld2HFvCB3IHRha2ljaCBwcnp5cGFka2FjaCBwb8WCxIVjemVuaWUgbmEgemRlZmluaW93YW55bSBwb3JjaWUKKyh0dXRhaiBJPGltYXBzPikgbmF3acSFenVqZSBvc29ibnkgcHJvZ3JhbSAodHV0YWogSTxpbmV0ZD4pLCBCPHN0dW5uZWw+CituaWUgbW/FvGUgdcW8eXdhxIcgb3BjamkgSTxhY2NlcHQ+LiAgVyBwbGlrdSBrb25maWd1cmFjeWpueW0gbmllIG1vxbxlCitiecSHIHLDs3duaWXFvCB6ZGVmaW5pb3dhbmEgxbxhZG5hIHVzxYJ1Z2EgKEk8W25hendhX3VzxYJ1Z2ldPiksIHBvbmlld2HFvAora29uZmlndXJhY2phIHRha2EgcG96d2FsYSBuYSBuYXdpxIV6YW5pZSB0eWxrbyBqZWRuZWdvIHBvxYLEhWN6ZW5pYS4KK1dzenlzdGtpZSBJPE9QQ0pFIFVTxYFVRz4gcG93aW5ueSBiecSHIHVtaWVzemN6b25lIHJhemVtIHogb3BjamFtaQorZ2xvYmFsbnltaS4gIFByenlrxYJhZCB0YWtpZWoga29uZmlndXJhY2ppIHpuYWpkdWplIHNpxJkgdyBzZWtjamkKK0k8UFJaWUvFgUFEWT4uCisKKz1oZWFkMiBDRVJUWUZJS0FUWQorCitQcm90b2vDs8WCIFNTTCB3eW1hZ2EsIGFieSBrYcW8ZHkgc2Vyd2VyIHByemVkc3Rhd2lhxYIgc2nEmSBuYXdpxIV6dWrEhWNlbXUKK3BvxYLEhWN6ZW5pZSBrbGllbnRvd2kgcHJhd2lkxYJvd3ltIGNlcnR5ZmlrYXRlbSBYLjUwOS4KK1BvdHdpZXJkemVuaWUgdG/FvHNhbW/Fm2NpIHNlcndlcmEgcG9sZWdhIG5hIHd5a2F6YW5pdSwgxbxlIHBvc2lhZGEgb24KK29kcG93aWFkYWrEhWN5IGNlcnR5ZmlrYXRvd2kga2x1Y3ogcHJ5d2F0bnkuCitOYWpwcm9zdHN6xIUgbWV0b2TEhSB1enlza2FuaWEgY2VydHlmaWthdHUgamVzdCB3eWdlbmVyb3dhbmllIGdvIHByenkgcG9tb2N5Cit3b2xuZWdvIHBha2lldHUgQjxPcGVuU1NMPi4gIFdpxJljZWogaW5mb3JtYWNqaSBuYSB0ZW1hdCBnZW5lcm93YW5pYQorY2VydHlmaWthdMOzdyBtb8W8bmEgem5hbGXFusSHIG5hIHVtaWVzemN6b255Y2ggcG9uacW8ZWogc3Ryb25hY2guCisKK0lzdG90bsSFIGt3ZXN0acSFIGplc3Qga29sZWpub8WbxIcgemF3YXJ0b8WbY2kgcGxpa3UgSTwucGVtPi4KK1cgcGllcndzemVqIGtvbGVqbm/Fm2NpIHBvd2luaWVuIG9uIHphd2llcmHEhyBrbHVjeiBwcnl3YXRueSwKK2EgZG9waWVybyB6YSBuaW0gcG9kcGlzYW55IGNlcnR5ZmlrYXQgKG5pZSDFvMSFZGFuaWUgY2VydHlmaWthdHUpLgorUG8gY2VydHlmaWthY2llIGkga2x1Y3p1IHByeXdhdG55bSBwb3dpbm55IHpuYWpkb3dhxIcgc2nEmSBwdXN0ZSBsaW5pZS4KK0plxbxlbGkgcHJ6ZWQgY2VydHlmaWthdGVtIHpuYWpkdWrEhSBzacSZIGRvZGF0a293ZSBpbmZvcm1hY2plIHRla3N0b3dlLAordG8gcG93aW5ueSBvbmUgem9zdGHEhyB1c3VuacSZdGUuICBPdHJ6eW1hbnkgcGxpayBwb3dpbmllbiBtaWXEhworbmFzdMSZcHVqxIVjxIUgcG9zdGHEhzoKKworICAgIC0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KKyAgICBbemFrb2Rvd2FueSBrbHVjel0KKyAgICAtLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFtwdXN0YSBsaW5pYV0KKyAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KKyAgICBbemFrb2Rvd2FueSBjZXJ0eWZpa2F0XQorICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAgICBbcHVzdGEgbGluaWFdCisKKz1oZWFkMiBMT1NPV0/FmsSGCisKK0I8c3R1bm5lbD4gcG90cnplYnVqZSB6YWluaWNqb3dhxIcgUFJORyAoZ2VuZXJhdG9yIGxpY3piIHBzZXVkb2xvc293eWNoKSwKK2dkecW8IHByb3Rva8OzxYIgU1NMIHd5bWFnYSBkbyBiZXpwaWVjemXFhHN0d2Ega3J5cHRvZ3JhZmljem5lZ28gxbpyw7NkxYJhCitkb2JyZWogbG9zb3dvxZtjaS4gIE5hc3TEmXB1asSFY2Ugxbpyw7NkxYJhIHPEhSBrb2xlam5vIG9kY3p5dHl3YW5lIGHFvCBkbwordXp5c2thbmlhICB3eXN0YXJjemFqxIVjZWogaWxvxZtjaSBlbnRyb3BpaToKKworPW92ZXIgNAorCis9aXRlbSAqCisKK1phd2FydG/Fm8SHIHBsaWt1IHBvZGFuZWdvIHcgb3BjamkgSTxSTkRmaWxlPi4KKworPWl0ZW0gKgorCitaYXdhcnRvxZvEhyBwbGlrdSBvIG5hendpZSBva3JlxZtsb25laiBwcnpleiB6bWllbm7EhSDFm3JvZG93aXNrb3fEhQorUkFOREZJTEUsIG8gaWxlIGplc3Qgb25hIHVzdGF3aW9uYS4KKworPWl0ZW0gKgorCitQbGlrIC5ybmQgdW1pZXN6Y3pvbnkgdyBrYXRhbG9ndSBkb21vd3ltIHXFvHl0a293bmlrYSwKK2plxbxlbGkgem1pZW5uYSBSQU5ERklMRSBuaWUgamVzdCB1c3Rhd2lvbmEuCisKKz1pdGVtICoKKworUGxpayBwb2RhbnkgdyBvcGNqaSAnLS13aXRoLXJhbmRvbScgdyBjemFzaWUga29uZmlndXJhY2ppIHByb2dyYW11LgorCis9aXRlbSAqCisKK1phd2FydG/Fm8SHIGVrcmFudSB3IHN5c3RlbWllIFdpbmRvd3MuCisKKz1pdGVtICoKKworR25pYXpkbyBlZ2QsIGplxbxlbGkgdcW8eXRhIHpvc3RhxYJhIG9wY2phIEk8RUdEPi4KKworPWl0ZW0gKgorCitHbmlhemRvIGVnZCBwb2RhbmUgdyBvcGNqaSAnLS13aXRoLWVnZC1zb2NrZXQnIHcgY3phc2llIGtvbmZpZ3VyYWNqaQorcHJvZ3JhbXUuCisKKz1pdGVtICoKKworVXJ6xIVkemVuaWUgL2Rldi91cmFuZG9tLgorCis9YmFjaworCitXc3DDs8WCY3plc25lIChCPDAuOS41YT4gbHViIG5vd3N6ZSkgd2Vyc2plIGJpYmxpb3Rla2kgQjxPcGVuU1NMPiBhdXRvbWF0eWN6bmllCit6YXByemVzdGFqxIUgxYJhZG93YW5pYSBrb2xlam55Y2ggZGFueWNoIHcgbW9tZW5jaWUgdXp5c2thbmlhIHd5c3RhcmN6YWrEhWNlagoraWxvxZtjaSBlbnRyb3BpaS4gIFdjemXFm25pZWpzemUgd2Vyc2plIGJpYmxpb3Rla2kgd3lrb3J6eXN0YWrEhSB3c3p5c3RraWUKK3Bvd3nFvHN6ZSDFunLDs2TFgmEsIGdkecW8IG5pZSBpc3RuaWVqZSB0YW0gZnVua2NqYSBwb3p3YWxhasSFY2Egb2tyZcWbbGnEhywgY3p5Cit1enlza2FubyBqdcW8IHd5c3RhcmN6YWrEhWNvIGR1xbxvIGRhbnljaC4KKworV2FydG8gendyw7NjacSHIHV3YWfEmSwgxbxlIG5hIG1hc3p5bmFjaCB6IHN5c3RlbWVtIFdpbmRvd3MsIG5hIGt0w7NyeWNoCitrb25zb2xpIG5pZSBwcmFjdWplIHXFvHl0a293bmlrLCB6YXdhcnRvxZvEhyBla3JhbnUgbmllIGplc3Qgd3lzdGFyY3phasSFY28KK3ptaWVubmEsIGFieSB6YWluaWNqb3dhxIcgUFJORy4gIFcgdGFraW0gcHJ6eXBhZGt1IGRvIHphaW5pY2pvd2FuaWEKK2dlbmVyYXRvcmEgbmFsZcW8eSB1xbx5xIcgb3BjamkgSTxSTkRmaWxlPi4KKworUGxpayBJPFJORGZpbGU+IHBvd2luaWVuIHphd2llcmHEhyBkYW5lIGxvc293ZSAtLSByw7N3bmllxbwgdyB0eW0gc2Vuc2llLAorxbxlIHBvd2lubnkgYnnEhyBvbmUgaW5uZSBwcnp5IGthxbxkeW0gdXJ1Y2hvbWllbml1IHByb2dyYW11IEI8c3R1bm5lbD4uCitPIGlsZSBuaWUgdcW8eXRhIHpvc3RhxYJhIG9wY2phIEk8Uk5Eb3ZlcndyaXRlPiBqZXN0IHRvIHJvYmlvbmUKK2F1dG9tYXR5Y3puaWUuICBEbyByxJljem5lZ28gdXp5c2thbmlhIHRha2llZ28gcGxpa3UgdcW8eXRlY3puYQorbW/FvGUgYnnEhyBrb21lbmRhIEk8b3BlbnNzbCByYW5kPiBkb3N0YXJjemFuYSB6ZSB3c3DDs8WCY3plc255bWkKK3dlcnNqYW1pIHBha2lldHUgQjxPcGVuU1NMPi4KKworSmVzemN6ZSBqZWRuYSBpc3RvdG5hIGluZm9ybWFjamEgLS0gamXFvGVsaSBkb3N0xJlwbmUgamVzdCB1cnrEhWR6ZW5pZQorSTwvZGV2L3VyYW5kb20+IGJpYmxpb3Rla2EgQjxPcGVuU1NMPiBtYSB6d3ljemFqIHphc2lsYW5pYSBuaW0gUFJORyB3IHRyYWtjaWUKK3NwcmF3ZHphbmlhIHN0YW51IGdlbmVyYXRvcmEuICBXIHN5c3RlbWFjaCB6IEk8L2Rldi91cmFuZG9tPiB1cnrEhWR6ZW5pZQordG8gYsSZZHppZSBuYWpwcmF3ZG9wb2RvYm5pZWogdcW8eXRlLCBwb21pbW8gxbxlIHpuYWpkdWplIHNpxJkgbmEgc2FteW0ga2/FhGN1Citwb3d5xbxzemVqIGxpc3R5LiAgSmVzdCB0byB3xYJhxZtjaXdvxZvEhyBiaWJsaW90ZWtpIEI8T3BlblNTTD4sIGEgbmllIHByb2dyYW11CitCPHN0dW5uZWw+LgorCis9aGVhZDIgUEFSQU1FVFJZIERICisKK1BvY3rEhXdzenkgb2Qgd2Vyc2ppIDQuNDAgQjxzdHVubmVsPiB6YXdpZXJhIHcga29kemllIHByb2dyYW11IDIwNDgtYml0b3dlCitwYXJhbWV0cnkgREguICBPZCB3ZXJzamkgNS4xOCB0ZSBwb2N6xIV0a293ZSB3YXJ0b8WbY2kgcGFyYW1ldHLDs3cgREggc8SFCit3eW1pZW5pYW5lIG5hIGF1dG9nZW5lcm93YW5lIHBhcmFtZXRyeSB0eW1jemFzb3dlLgorV3lnZW5lcm93YW5pZSBwYXJhbWV0csOzdyBESCBtb8W8ZSB6YWrEhcSHIG5hd2V0IHdpZWxlIG1pbnV0LgorCitBbHRlcm5hdHl3bmllIHBhcmFtZXRyeSBESCBtb8W8bmEgdW1pZcWbY2nEhyB3IHBsaWt1IHJhemVtIHogY2VydHlmaWthdGVtLAorY28gd3nFgsSFY3phIGdlbmVyb3dhbmllIHBhcmFtZXRyw7N3IHR5bWN6YXNvd3ljaDoKKworICAgIG9wZW5zc2wgZGhwYXJhbSAyMDQ4ID4+IHN0dW5uZWwucGVtCisKKworPWhlYWQxIFBMSUtJCisKKz1vdmVyIDQKKworPWl0ZW0gRjxAc3lzY29uZmRpckAvc3R1bm5lbC9zdHVubmVsLmNvbmY+CisKK3BsaWsga29uZmlndXJhY3lqbnkgcHJvZ3JhbXUKKworPWJhY2sKKworCis9aGVhZDEgQsWBxJhEWQorCitPcGNqYSBJPGV4ZWNBcmdzPiBvcmF6IGxpbmlhIGtvbWVuZCBXaW4zMiBuaWUgb2JzxYJ1Z3VqZSBjeXRvd2FuaWEuCisKKworPWhlYWQxIFpPQkFDWiBSw5NXTklFxbsKKworPW92ZXIgNAorCis9aXRlbSBMPHRjcGQoOCk+CisKK2JpYmxpb3Rla2Ega29udHJvbGkgZG9zdMSZcHUgZG8gdXPFgnVnIGludGVybmV0b3d5Y2gKKworPWl0ZW0gTDxpbmV0ZCg4KT4KKworJ3N1cGVyLXNlcndlcicgaW50ZXJuZXRvd3kKKworPWl0ZW0gRjxodHRwOi8vd3d3LnN0dW5uZWwub3JnLz4KKworc3Ryb25hIGRvbW93YSBwcm9ncmFtdSBCPHN0dW5uZWw+CisKKz1pdGVtIEY8aHR0cDovL3d3dy5vcGVuc3NsLm9yZy8+CisKK3N0cm9uYSBwcm9qZWt0dSBCPE9wZW5TU0w+CisKKz1iYWNrCisKKworPWhlYWQxIEFVVE9SCisKKz1vdmVyIDQKKworPWl0ZW0gTWljaGHFgiBUcm9qbmFyYQorCis8RjxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+PgorCis9YmFjaworCis9Zm9yIGNvbW1lbnQKK3ZpbTpzcGVsbGxhbmc9cGw6c3BlbGwKZGlmZiAtLWdpdCBhL2RvYy9zdHVubmVsLnBvZC5pbiBiL2RvYy9zdHVubmVsLnBvZC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRiNTMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N0dW5uZWwucG9kLmluCkBAIC0wLDAgKzEsMTM4MiBAQAorPWhlYWQxIE5BTUUKKworPWVuY29kaW5nIHV0ZjgKKworc3R1bm5lbCAtIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorCisKKz1oZWFkMSBTWU5PUFNJUworCis9b3ZlciA0CisKKz1pdGVtIEI8VW5peDo+CisKK0I8c3R1bm5lbD4gW1M8RklMRT5dIHwgUzwtZmQgTj4gfCBTPC1oZWxwPiB8IFM8LXZlcnNpb24+IHwgUzwtc29ja2V0cz4gfCBTPC1vcHRpb25zPgorCis9aXRlbSBCPFdJTjMyOj4KKworQjxzdHVubmVsPiBbIFsgUzwtaW5zdGFsbD4gfCBTPC11bmluc3RhbGw+IHwgUzwtc3RhcnQ+IHwgUzwtc3RvcD4gfAorICAgIFM8LXJlbG9hZD4gfCBTPC1yZW9wZW4+IHwgUzwtZXhpdD4gXSBbUzwtcXVpZXQ+XSBbUzxGSUxFPl0gXSB8CisgICAgUzwtaGVscD4gfCBTPC12ZXJzaW9uPiB8IFM8LXNvY2tldHM+IHwgUzwtb3B0aW9ucz4KKworPWJhY2sKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIEI8c3R1bm5lbD4gcHJvZ3JhbSBpcyBkZXNpZ25lZCB0byB3b3JrIGFzIEk8U1NMPiBlbmNyeXB0aW9uIHdyYXBwZXIgCitiZXR3ZWVuIHJlbW90ZSBjbGllbnRzIGFuZCBsb2NhbCAoSTxpbmV0ZD4tc3RhcnRhYmxlKSBvciByZW1vdGUKK3NlcnZlcnMuIFRoZSBjb25jZXB0IGlzIHRoYXQgaGF2aW5nIG5vbi1TU0wgYXdhcmUgZGFlbW9ucyBydW5uaW5nIG9uCit5b3VyIHN5c3RlbSB5b3UgY2FuIGVhc2lseSBzZXQgdGhlbSB1cCB0byBjb21tdW5pY2F0ZSB3aXRoIGNsaWVudHMgb3Zlcgorc2VjdXJlIFNTTCBjaGFubmVscy4KKworQjxzdHVubmVsPiBjYW4gYmUgdXNlZCB0byBhZGQgU1NMIGZ1bmN0aW9uYWxpdHkgdG8gY29tbW9ubHkgdXNlZCBJPEluZXRkPgorZGFlbW9ucyBsaWtlIFBPUC0yLCBQT1AtMywgYW5kIElNQVAgc2VydmVycywgdG8gc3RhbmRhbG9uZSBkYWVtb25zIGxpa2UKK05OVFAsIFNNVFAgYW5kIEhUVFAsIGFuZCBpbiB0dW5uZWxpbmcgUFBQIG92ZXIgbmV0d29yayBzb2NrZXRzIHdpdGhvdXQKK2NoYW5nZXMgdG8gdGhlIHNvdXJjZSBjb2RlLgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CitFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKworCis9aGVhZDEgT1BUSU9OUworCis9b3ZlciA0CisKKz1pdGVtIEI8RklMRT4KKworVXNlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUKKworPWl0ZW0gQjwtZmQgTj4gKFVuaXggb25seSkKKworUmVhZCB0aGUgY29uZmlnIGZpbGUgZnJvbSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCisKKz1pdGVtIEI8LWhlbHA+CisKK1ByaW50IEI8c3R1bm5lbD4gaGVscCBtZW51CisKKz1pdGVtIEI8LXZlcnNpb24+CisKK1ByaW50IEI8c3R1bm5lbD4gdmVyc2lvbiBhbmQgY29tcGlsZSB0aW1lIGRlZmF1bHRzCisKKz1pdGVtIEI8LXNvY2tldHM+CisKK1ByaW50IGRlZmF1bHQgc29ja2V0IG9wdGlvbnMKKworPWl0ZW0gQjwtb3B0aW9ucz4KKworUHJpbnQgc3VwcG9ydGVkIFNTTCBvcHRpb25zCisKKz1pdGVtIEI8LWluc3RhbGw+IChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KQorCitJbnN0YWxsIE5UIFNlcnZpY2UKKworPWl0ZW0gQjwtdW5pbnN0YWxsPiAoV2luZG93cyBOVCBhbmQgbGF0ZXIgb25seSkKKworVW5pbnN0YWxsIE5UIFNlcnZpY2UKKworPWl0ZW0gQjwtc3RhcnQ+IChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KQorCitTdGFydCBOVCBTZXJ2aWNlCisKKz1pdGVtIEI8LXN0b3A+IChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KQorCitTdG9wIE5UIFNlcnZpY2UKKworPWl0ZW0gQjwtcmVsb2FkPiAoV2luZG93cyBOVCBhbmQgbGF0ZXIgb25seSkKKworUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIHJ1bm5pbmcgTlQgU2VydmljZQorCis9aXRlbSBCPC1yZW9wZW4+IChXaW5kb3dzIE5UIGFuZCBsYXRlciBvbmx5KQorCitSZW9wZW4gdGhlIGxvZyBmaWxlIG9mIHRoZSBydW5uaW5nIE5UIFNlcnZpY2UKKworPWl0ZW0gQjwtZXhpdD4gKFdpbjMyIG9ubHkpCisKK0V4aXQgYW4gYWxyZWFkeSBzdGFydGVkIHN0dW5uZWwKKworPWl0ZW0gQjwtcXVpZXQ+IChXaW4zMiBvbmx5KQorCitEb24ndCBkaXNwbGF5IGFueSBtZXNzYWdlIGJveGVzCisKKz1iYWNrCisKKworPWhlYWQxIENPTkZJR1VSQVRJT04gRklMRQorCitFYWNoIGxpbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUgZWl0aGVyOgorCis9b3ZlciA0CisKKz1pdGVtICoKKworQW4gZW1wdHkgbGluZSAoaWdub3JlZCkuCisKKz1pdGVtICoKKworQSBjb21tZW50IHN0YXJ0aW5nIHdpdGggJzsnIChpZ25vcmVkKS4KKworPWl0ZW0gKgorCitBbiAnb3B0aW9uX25hbWUgPSBvcHRpb25fdmFsdWUnIHBhaXIuCisKKz1pdGVtICoKKworJ1tzZXJ2aWNlX25hbWVdJyBpbmRpY2F0aW5nIGEgc3RhcnQgb2YgYSBzZXJ2aWNlIGRlZmluaXRpb24uCisKKz1iYWNrCisKK0FuIGFkZHJlc3MgcGFyYW1ldGVyIG9mIGFuIG9wdGlvbiBtYXkgYmUgZWl0aGVyOgorCis9b3ZlciA0CisKKz1pdGVtICoKKworQSBwb3J0IG51bWJlci4KKworPWl0ZW0gKgorCitBIGNvbG9uLXNlcGFyYXRlZCBwYWlyIG9mIElQIGFkZHJlc3MgKGVpdGhlciBJUHY0LCBJUHY2LCBvciBkb21haW4gbmFtZSkgYW5kIHBvcnQgbnVtYmVyLgorCis9aXRlbSAqCisKK0EgVW5peCBzb2NrZXQgcGF0aCAoVW5peCBvbmx5KS4KKworPWJhY2sKKworPWhlYWQyIEdMT0JBTCBPUFRJT05TCisKKz1vdmVyIDQKKworPWl0ZW0gQjxjaHJvb3Q+ID0gRElSRUNUT1JZIChVbml4IG9ubHkpCisKK2RpcmVjdG9yeSB0byBjaHJvb3QgQjxzdHVubmVsPiBwcm9jZXNzCisKK0I8Y2hyb290PiBrZWVwcyBCPHN0dW5uZWw+IGluIGEgY2hyb290ZWQgamFpbC4gIEk8Q0FwYXRoPiwgSTxDUkxwYXRoPiwgSTxwaWQ+CithbmQgSTxleGVjPiBhcmUgbG9jYXRlZCBpbnNpZGUgdGhlIGphaWwgYW5kIHRoZSBwYXRjaGVzIGhhdmUgdG8gYmUgcmVsYXRpdmUKK3RvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHdpdGggQjxjaHJvb3Q+LgorCitTZXZlcmFsIGZ1bmN0aW9ucyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbHNvIG5lZWQgdGhlaXIgZmlsZXMgdG8gYmUgbG9jYXRlZCB3aXRoaW4gdGhlIGNocm9vdCBqYWlsLCBlLmcuOgorCis9b3ZlciA0CisKKz1pdGVtICoKKworRGVsYXllZCByZXNvbHZlciB0eXBpY2FsbHkgbmVlZHMgL2V0Yy9uc3N3aXRjaC5jb25mIGFuZCAvZXRjL3Jlc29sdi5jb25mLgorCis9aXRlbSAqCisKK0xvY2FsIHRpbWUgaW4gbG9nIGZpbGVzIG5lZWRzIC9ldGMvdGltZXpvbmUuCisKKz1pdGVtICoKKworU29tZSBvdGhlciBmdW5jdGlvbnMgbWF5IG5lZWQgZGV2aWNlcywgZS5nLiAvZGV2L3plcm8gb3IgL2Rldi9udWxsLgorCis9YmFjaworCis9aXRlbSBCPGNvbXByZXNzaW9uPiA9IGRlZmxhdGUgfCB6bGliCisKK3NlbGVjdCBkYXRhIGNvbXByZXNzaW9uIGFsZ29yaXRobQorCitkZWZhdWx0OiBubyBjb21wcmVzc2lvbgorCitkZWZsYXRlIGlzIHRoZSBzdGFuZGFyZCBjb21wcmVzc2lvbiBtZXRob2QgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUxLgorCit6bGliIGNvbXByZXNzaW9uIG9mIEI8T3BlblNTTCAwLjkuOD4gb3IgYWJvdmUgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aAorQjxPcGVuU1NMIDAuOS43Pi4KKworPWl0ZW0gQjxkZWJ1Zz4gPSBbRkFDSUxJVFkuXUxFVkVMCisKK2RlYnVnZ2luZyBsZXZlbAorCitMZXZlbCBpcyBvbmUgb2YgdGhlIHN5c2xvZyBsZXZlbCBuYW1lcyBvciBudW1iZXJzCitlbWVyZyAoMCksIGFsZXJ0ICgxKSwgY3JpdCAoMiksIGVyciAoMyksIHdhcm5pbmcgKDQpLCBub3RpY2UgKDUpLAoraW5mbyAoNiksIG9yIGRlYnVnICg3KS4gIEFsbCBsb2dzIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsIGFuZAorYWxsIGxldmVscyBudW1lcmljYWxseSBsZXNzIHRoYW4gaXQgd2lsbCBiZSBzaG93bi4gIFVzZSBJPGRlYnVnID0gZGVidWc+IG9yCitJPGRlYnVnID0gNz4gZm9yIGdyZWF0ZXN0IGRlYnVnZ2luZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyBub3RpY2UgKDUpLgorCitUaGUgc3lzbG9nIGZhY2lsaXR5ICdkYWVtb24nIHdpbGwgYmUgdXNlZCB1bmxlc3MgYSBmYWNpbGl0eSBuYW1lIGlzIHN1cHBsaWVkLgorKEZhY2lsaXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luMzIuKQorCitDYXNlIGlzIGlnbm9yZWQgZm9yIGJvdGggZmFjaWxpdGllcyBhbmQgbGV2ZWxzLgorCis9aXRlbSBCPEVHRD4gPSBFR0RfUEFUSCAoVW5peCBvbmx5KQorCitwYXRoIHRvIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQKKworRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCB0byB1c2UgdG8gZmVlZCB0aGUgQjxPcGVuU1NMPiByYW5kb20gbnVtYmVyCitnZW5lcmF0b3IuICAoQXZhaWxhYmxlIG9ubHkgaWYgY29tcGlsZWQgd2l0aCBCPE9wZW5TU0wgMC45LjVhPiBvciBoaWdoZXIpCisKKz1pdGVtIEI8ZW5naW5lPiA9IGF1dG8gfCBFTkdJTkVfSUQKKworc2VsZWN0IGhhcmR3YXJlIGVuZ2luZQorCitkZWZhdWx0OiBzb2Z0d2FyZS1vbmx5IGNyeXB0b2dyYXBoeQorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYWR2YW5jZWQgZW5naW5lIGNvbmZpZ3VyYXRpb24gdG8gcmVhZCB0aGUgcHJpdmF0ZSBrZXkgZnJvbSBhbgorT3BlblNDIGVuZ2luZQorCisgICAgZW5naW5lPWR5bmFtaWMKKyAgICBlbmdpbmVDdHJsPVNPX1BBVEg6L3Vzci9saWIvb3BlbnNjL2VuZ2luZV9wa2NzMTEuc28KKyAgICBlbmdpbmVDdHJsPUlEOnBrY3MxMQorICAgIGVuZ2luZUN0cmw9TElTVF9BREQ6MQorICAgIGVuZ2luZUN0cmw9TE9BRAorICAgIGVuZ2luZUN0cmw9TU9EVUxFX1BBVEg6L3Vzci9saWIvcGtjczExL29wZW5zYy1wa2NzMTEuc28KKyAgICBlbmdpbmVDdHJsPUlOSVQKKworICAgIFtzZXJ2aWNlXQorICAgIGVuZ2luZU51bT0xCisgICAga2V5PWlkXzQ1CisKKz1pdGVtIEI8ZW5naW5lQ3RybD4gPSBDT01NQU5EWzpQQVJBTUVURVJdCisKK2NvbnRyb2wgaGFyZHdhcmUgZW5naW5lCisKK1NwZWNpYWwgY29tbWFuZHMgIkxPQUQiIGFuZCAiSU5JVCIgY2FuIGJlIHVzZWQgdG8gbG9hZCBhbmQgaW5pdGlhbGl6ZSB0aGUKK2VuZ2luZSBjcnlwdG9nYXBoaWMgbW9kdWxlLgorCis9aXRlbSBCPGVuZ2luZURlZmF1bHQ+ID0gVEFTS19MSVNUCisKK3NldCBPcGVuU1NMIHRhc2tzIGRlbGVnYXRlZCB0byB0aGUgY3VycmVudCBlbmdpbmUKKworVGhlIHBhcmFtZXRlciBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrIHRvIGJlIGRlbGVnYXRlZCB0byB0aGUKK2N1cnJlbnQgZW5naW5lLgorCitUaGUgZm9sbG93aW5nIHRhc2tzIG1heSBiZSBhdmFpbGFibGUsIGlmIHN1cHBvcnRlZCBieSB0aGUgZW5naW5lOiBBTEwsIFJTQSwKK0RTQSwgRUNESCwgRUNEU0EsIERILCBSQU5ELCBDSVBIRVJTLCBESUdFU1RTLCBQS0VZLCBQS0VZX0NSWVBUTywgUEtFWV9BU04xLgorCis9aXRlbSBCPGZpcHM+ID0geWVzIHwgbm8KKworRW5hYmxlIG9yIGRpc2FibGUgRklQUyAxNDAtMiBtb2RlLgorCitUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRpc2FibGUgZW50ZXJpbmcgRklQUyBtb2RlIGlmIEI8c3R1bm5lbD4gd2FzIGNvbXBpbGVkCit3aXRoIEZJUFMgMTQwLTIgc3VwcG9ydC4KKworZGVmYXVsdDogbm8gKHNpbmNlIHZlcnNpb24gNS4wMCkKKworPWl0ZW0gQjxmb3JlZ3JvdW5kPiA9IHllcyB8IG5vIChVbml4IG9ubHkpCisKK2ZvcmVncm91bmQgbW9kZQorCitTdGF5IGluIGZvcmVncm91bmQgKGRvbid0IGZvcmspIGFuZCBsb2cgdG8gc3RkZXJyCitpbnN0ZWFkIG9mIHZpYSBzeXNsb2cgKHVubGVzcyBJPG91dHB1dD4gaXMgc3BlY2lmaWVkKS4KKworZGVmYXVsdDogYmFja2dyb3VuZCBpbiBkYWVtb24gbW9kZQorCis9aXRlbSBCPGljb25BY3RpdmU+ID0gSUNPTl9GSUxFIChHVUkgb25seSkKKworR1VJIGljb24gdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zCisKK09uIFdpbmRvd3MgcGxhdGZvcm0gdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gLmljbyBmaWxlIGNvbnRhaW5pbmcgYSAxNngxNgorcGl4ZWwgaW1hZ2UuCisKKz1pdGVtIEI8aWNvbkVycm9yPiA9IElDT05fRklMRSAoR1VJIG9ubHkpCisKK0dVSSBpY29uIHRvIGJlIGRpc3BsYXllZCB3aGVuIG5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkCisKK09uIFdpbmRvd3MgcGxhdGZvcm0gdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gLmljbyBmaWxlIGNvbnRhaW5pbmcgYSAxNngxNgorcGl4ZWwgaW1hZ2UuCisKKz1pdGVtIEI8aWNvbklkbGU+ID0gSUNPTl9GSUxFIChHVUkgb25seSkKKworR1VJIGljb24gdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zCisKK09uIFdpbmRvd3MgcGxhdGZvcm0gdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gLmljbyBmaWxlIGNvbnRhaW5pbmcgYSAxNngxNgorcGl4ZWwgaW1hZ2UuCisKKz1pdGVtIEI8bG9nPiA9IGFwcGVuZCB8IG92ZXJ3cml0ZQorCitsb2cgZmlsZSBoYW5kbGluZworCitUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNob29zZSB3aGV0aGVyIHRoZSBsb2cgZmlsZSAoc3BlY2lmaWVkIHdpdGggdGhlIEk8b3V0cHV0Pgorb3B0aW9uKSBpcyBhcHBlbmRlZCBvciBvdmVyd3JpdHRlbiB3aGVuIG9wZW5lZCBvciByZS1vcGVuZWQuCisKK2RlZmF1bHQ6IGFwcGVuZAorCis9aXRlbSBCPG91dHB1dD4gPSBGSUxFCisKK2FwcGVuZCBsb2cgbWVzc2FnZXMgdG8gYSBmaWxlCisKKy9kZXYvc3Rkb3V0IGRldmljZSBjYW4gYmUgdXNlZCB0byBzZW5kIGxvZyBtZXNzYWdlcyB0byB0aGUgc3RhbmRhcmQKK291dHB1dCAoZm9yIGV4YW1wbGUgdG8gbG9nIHRoZW0gd2l0aCBkYWVtb250b29scyBzcGxvZ2dlcikuCisKKz1pdGVtIEI8cGlkPiA9IEZJTEUgKFVuaXggb25seSkKKworcGlkIGZpbGUgbG9jYXRpb24KKworSWYgdGhlIGFyZ3VtZW50IGlzIGVtcHR5LCB0aGVuIG5vIHBpZCBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KKworSTxwaWQ+IHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIEk8Y2hyb290PiBkaXJlY3RvcnkgaWYgc3BlY2lmaWVkLgorCis9aXRlbSBCPFJORGJ5dGVzPiA9IEJZVEVTCisKK2J5dGVzIHRvIHJlYWQgZnJvbSByYW5kb20gc2VlZCBmaWxlcworCitOdW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSByZWFkIGZyb20gcmFuZG9tIHNlZWQgZmlsZXMuICBXaXRoIFNTTCB2ZXJzaW9ucyBsZXNzCit0aGFuIEI8MC45LjVhPiwgYWxzbyBkZXRlcm1pbmVzIGhvdyBtYW55IGJ5dGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQKK3N1ZmZpY2llbnQgdG8gc2VlZCB0aGUgUFJORy4gIE1vcmUgcmVjZW50IEI8T3BlblNTTD4gdmVyc2lvbnMgaGF2ZSBhIGJ1aWx0aW4KK2Z1bmN0aW9uIHRvIGRldGVybWluZSB3aGVuIHN1ZmZpY2llbnQgcmFuZG9tbmVzcyBpcyBhdmFpbGFibGUuCisKKz1pdGVtIEI8Uk5EZmlsZT4gPSBGSUxFCisKK3BhdGggdG8gZmlsZSB3aXRoIHJhbmRvbSBzZWVkIGRhdGEKKworVGhlIFNTTCBsaWJyYXJ5IHdpbGwgdXNlIGRhdGEgZnJvbSB0aGlzIGZpbGUgZmlyc3QgdG8gc2VlZCB0aGUgcmFuZG9tCitudW1iZXIgZ2VuZXJhdG9yLgorCis9aXRlbSBCPFJORG92ZXJ3cml0ZT4gPSB5ZXMgfCBubworCitvdmVyd3JpdGUgdGhlIHJhbmRvbSBzZWVkIGZpbGVzIHdpdGggbmV3IHJhbmRvbSBkYXRhCisKK2RlZmF1bHQ6IHllcworCis9aXRlbSBCPHNlcnZpY2U+ID0gU0VSVklDRSAoVW5peCBvbmx5KQorCitzdHVubmVsIHNlcnZpY2UgbmFtZQorCitUaGUgc3BlY2lmaWVkIHNlcnZpY2UgbmFtZSBpcyB1c2VkIGZvciBzeXNsb2cgYW5kIGFzIHRoZSBJPGluZXRkPiBtb2RlIHNlcnZpY2UKK25hbWUgZm9yIFRDUCBXcmFwcGVycy4gIFdoaWxlIHRoaXMgb3B0aW9uIGNhbiB0ZWNobmljYWxseSBiZSBzcGVjaWZpZWQgaW4gdGhlCitzZXJ2aWNlIHNlY3Rpb25zLCBpdCBpcyBvbmx5IHVzZWZ1bCBpbiBnbG9iYWwgb3B0aW9ucy4KKworZGVmYXVsdDogc3R1bm5lbAorCis9aXRlbSBCPHNldGdpZD4gPSBHUk9VUCAoVW5peCBvbmx5KQorCitzZXRnaWQoKSB0byB0aGUgc3BlY2lmaWVkIGdyb3VwIGluIGRhZW1vbiBtb2RlIGFuZCBjbGVhciBhbGwgb3RoZXIgZ3JvdXBzCisKKz1pdGVtIEI8c2V0dWlkPiA9IFVTRVIgKFVuaXggb25seSkKKworc2V0dWlkKCkgdG8gdGhlIHNwZWNpZmllZCB1c2VyIGluIGRhZW1vbiBtb2RlCisKKz1pdGVtIEI8c29ja2V0PiA9IGF8bHxyOk9QVElPTj1WQUxVRVs6VkFMVUVdCisKK1NldCBhbiBvcHRpb24gb24gdGhlIGFjY2VwdC9sb2NhbC9yZW1vdGUgc29ja2V0CisKK1RoZSB2YWx1ZXMgZm9yIHRoZSBsaW5nZXIgb3B0aW9uIGFyZSBsX29ub2Y6bF9saW5nZXIuCitUaGUgdmFsdWVzIGZvciB0aGUgdGltZSBhcmUgdHZfc2VjOnR2X3VzZWMuCisKK0V4YW1wbGVzOgorCisgICAgc29ja2V0ID0gbDpTT19MSU5HRVI9MTo2MAorICAgICAgICBzZXQgb25lIG1pbnV0ZSB0aW1lb3V0IGZvciBjbG9zaW5nIGxvY2FsIHNvY2tldAorICAgIHNvY2tldCA9IHI6U09fT09CSU5MSU5FPXllcworICAgICAgICBwbGFjZSBvdXQtb2YtYmFuZCBkYXRhIGRpcmVjdGx5IGludG8gdGhlCisgICAgICAgIHJlY2VpdmUgZGF0YSBzdHJlYW0gZm9yIHJlbW90ZSBzb2NrZXRzCisgICAgc29ja2V0ID0gYTpTT19SRVVTRUFERFI9bm8KKyAgICAgICAgZGlzYWJsZSBhZGRyZXNzIHJldXNlIChlbmFibGVkIGJ5IGRlZmF1bHQpCisgICAgc29ja2V0ID0gYTpTT19CSU5EVE9ERVZJQ0U9bG8KKyAgICAgICAgb25seSBhY2NlcHQgY29ubmVjdGlvbnMgb24gbG9vcGJhY2sgaW50ZXJmYWNlCisKKz1pdGVtIEI8c3lzbG9nPiA9IHllcyB8IG5vIChVbml4IG9ubHkpCisKK2VuYWJsZSBsb2dnaW5nIHZpYSBzeXNsb2cKKworZGVmYXVsdDogeWVzCisKKz1pdGVtIEI8dGFza2Jhcj4gPSB5ZXMgfCBubyAoV0lOMzIgb25seSkKKworZW5hYmxlIHRoZSB0YXNrYmFyIGljb24KKworZGVmYXVsdDogeWVzCisKKz1iYWNrCisKKworPWhlYWQyIFNFUlZJQ0UtTEVWRUwgT1BUSU9OUworCitFYWNoIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBiZWdpbnMgd2l0aCBhIHNlcnZpY2UgbmFtZSBpbiBzcXVhcmUgYnJhY2tldHMuCitUaGUgc2VydmljZSBuYW1lIGlzIHVzZWQgZm9yIGxpYndyYXAgKFRDUCBXcmFwcGVycykgYWNjZXNzIGNvbnRyb2wgYW5kIGxldHMKK3lvdSBkaXN0aW5ndWlzaCBCPHN0dW5uZWw+IHNlcnZpY2VzIGluIHlvdXIgbG9nIGZpbGVzLgorCitOb3RlIHRoYXQgaWYgeW91IHdpc2ggdG8gcnVuIEI8c3R1bm5lbD4gaW4gSTxpbmV0ZD4gbW9kZSAod2hlcmUgaXQKK2lzIHByb3ZpZGVkIGEgbmV0d29yayBzb2NrZXQgYnkgYSBzZXJ2ZXIgc3VjaCBhcyBJPGluZXRkPiwgSTx4aW5ldGQ+LAorb3IgSTx0Y3BzZXJ2ZXI+KSB0aGVuIHlvdSBzaG91bGQgcmVhZCB0aGUgc2VjdGlvbiBlbnRpdGxlZCBJPElORVREIE1PREU+CitiZWxvdy4KKworCis9b3ZlciA0CisKKz1pdGVtIEI8YWNjZXB0PiA9IFtIT1NUOl1QT1JUCisKK2FjY2VwdCBjb25uZWN0aW9ucyBvbiBzcGVjaWZpZWQgYWRkcmVzcworCitJZiBubyBob3N0IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gYWxsIElQdjQgYWRkcmVzc2VzIGZvciB0aGUgbG9jYWwgaG9zdC4KKworVG8gbGlzdGVuIG9uIGFsbCBJUHY2IGFkZHJlc3NlcyB1c2U6CisKKyAgICBhY2NlcHQgPSA6OjpQT1JUCisKKz1pdGVtIEI8Q0FwYXRoPiA9IERJUkVDVE9SWQorCitDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgZGlyZWN0b3J5CisKK1RoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBCPHN0dW5uZWw+IHdpbGwgbG9vayBmb3IgY2VydGlmaWNhdGVzIHdoZW4gdXNpbmcKK3RoZSBJPHZlcmlmeT4gb3B0aW9uLiAgTm90ZSB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG5hbWVkCitYWFhYWFhYWC4wIHdoZXJlIFhYWFhYWFhYIGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBERVIgZW5jb2RlZCBzdWJqZWN0IG9mIHRoZQorY2VydC4KKworVGhlIGhhc2ggYWxnb3JpdGhtIGhhcyBiZWVuIGNoYW5nZWQgaW4gQjxPcGVuU1NMIDEuMC4wPi4gIEl0IGlzIHJlcXVpcmVkIHRvCitjX3JlaGFzaCB0aGUgZGlyZWN0b3J5IG9uIHVwZ3JhZGUgZnJvbSBCPE9wZW5TU0wgMC54Lng+IHRvIEI8T3BlblNTTCAxLngueD4uCisKK0k8Q0FwYXRoPiBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBJPGNocm9vdD4gZGlyZWN0b3J5IGlmIHNwZWNpZmllZC4KKworPWl0ZW0gQjxDQWZpbGU+ID0gQ0VSVF9GSUxFCisKK0NlcnRpZmljYXRlIEF1dGhvcml0eSBmaWxlCisKK1RoaXMgZmlsZSBjb250YWlucyBtdWx0aXBsZSBDQSBjZXJ0aWZpY2F0ZXMsIHVzZWQgd2l0aCB0aGUgSTx2ZXJpZnk+IG9wdGlvbi4KKworPWl0ZW0gQjxjZXJ0PiA9IFBFTV9GSUxFCisKK2NlcnRpZmljYXRlIGNoYWluIFBFTSBmaWxlIG5hbWUKKworVGhlIGNlcnRpZmljYXRlcyBtdXN0IGJlIGluIFBFTSBmb3JtYXQsIGFuZCBtdXN0IGJlIGZyb20gdGhlCithY3R1YWwgc2VydmVyL2NsaWVudCBjZXJ0aWZpY2F0ZSB0byB0aGUgc2VsZi1zaWduZWQgcm9vdCBDQSBjZXJ0aWZpY2F0ZS4KKworQSBjZXJ0aWZpY2F0ZSBpcyByZXF1aXJlZCBpbiBzZXJ2ZXIgbW9kZSwgYW5kIG9wdGlvbmFsIGluIGNsaWVudCBtb2RlLgorCis9aXRlbSBCPGNoZWNrRW1haWw+ID0gRU1BSUwKKworZW1haWwgYWRkcmVzcyBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBzdWJqZWN0CisKK011bHRpcGxlIEk8Y2hlY2tFbWFpbD4gb3B0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHNpbmdsZSBzZXJ2aWNlIHNlY3Rpb24uCitDZXJ0aWZpY2F0ZXMgYXJlIGFjY2VwdGVkIGlmIG5vIEk8Y2hlY2tFbWFpbD4gb3B0aW9uIHdhcyBzcGVjaWZpZWQsIG9yIHRoZQorZW1haWwgYWRkcmVzcyBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBtYXRjaGVzIGFueSBvZiB0aGUgZW1haWwgYWRkcmVzc2VzCitzcGVjaWZpZWQgd2l0aCBJPGNoZWNrRW1haWw+LgorCis9aXRlbSBCPGNoZWNrSG9zdD4gPSBIT1NUCisKK2hvc3Qgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgc3ViamVjdAorCitNdWx0aXBsZSBJPGNoZWNrSG9zdD4gb3B0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHNpbmdsZSBzZXJ2aWNlIHNlY3Rpb24uCitDZXJ0aWZpY2F0ZXMgYXJlIGFjY2VwdGVkIGlmIG5vIEk8Y2hlY2tIb3N0PiBvcHRpb24gd2FzIHNwZWNpZmllZCwgb3IgdGhlIGhvc3QKK25hbWUgb2YgdGhlIHBlZXIgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbnkgb2YgdGhlIGhvc3RzIHNwZWNpZmllZCB3aXRoCitJPGNoZWNrSG9zdD4uCisKKz1pdGVtIEI8Y2hlY2tJUD4gPSBJUAorCitJUCBhZGRyZXNzIG9mIHRoZSBwZWVyIGNlcnRpZmljYXRlIHN1YmplY3QKKworTXVsdGlwbGUgSTxjaGVja0lQPiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi4KK0NlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgaWYgbm8gSTxjaGVja0lQPiBvcHRpb24gd2FzIHNwZWNpZmllZCwgb3IgdGhlIElQCithZGRyZXNzIG9mIHRoZSBwZWVyIGNlcnRpZmljYXRlIG1hdGNoZXMgYW55IG9mIHRoZSBJUCBhZGRyZXNzZXMgc3BlY2lmaWVkIHdpdGgKK0k8Y2hlY2tJUD4uCisKKz1pdGVtIEI8Y2lwaGVycz4gPSBDSVBIRVJfTElTVAorCitTZWxlY3QgcGVybWl0dGVkIFNTTCBjaXBoZXJzCisKK0EgY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGNpcGhlcnMgdG8gYWxsb3cgaW4gdGhlIFNTTCBjb25uZWN0aW9uLAorZm9yIGV4YW1wbGUgREVTLUNCQzMtU0hBOklERUEtQ0JDLU1ENS4KKworPWl0ZW0gQjxjbGllbnQ+ID0geWVzIHwgbm8KKworY2xpZW50IG1vZGUgKHJlbW90ZSBzZXJ2aWNlIHVzZXMgU1NMKQorCitkZWZhdWx0OiBubyAoc2VydmVyIG1vZGUpCisKKz1pdGVtIEI8Y29ubmVjdD4gPSBbSE9TVDpdUE9SVAorCitjb25uZWN0IHRvIGEgcmVtb3RlIGFkZHJlc3MKKworSWYgbm8gaG9zdCBpcyBzcGVjaWZpZWQsIHRoZSBob3N0IGRlZmF1bHRzIHRvIGxvY2FsaG9zdC4KKworTXVsdGlwbGUgSTxjb25uZWN0PiBvcHRpb25zIGFyZSBhbGxvd2VkIGluIGEgc2luZ2xlIHNlcnZpY2Ugc2VjdGlvbi4KKworSWYgaG9zdCByZXNvbHZlcyB0byBtdWx0aXBsZSBhZGRyZXNzZXMgYW5kL29yIGlmIG11bHRpcGxlIEk8Y29ubmVjdD4KK29wdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgcmVtb3RlIGFkZHJlc3MgaXMgY2hvc2VuIHVzaW5nIGEKK3JvdW5kLXJvYmluIGFsZ29yaXRobS4KKworPWl0ZW0gQjxDUkxwYXRoPiA9IERJUkVDVE9SWQorCitDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIGRpcmVjdG9yeQorCitUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggQjxzdHVubmVsPiB3aWxsIGxvb2sgZm9yIENSTHMgd2hlbgordXNpbmcgdGhlIEk8dmVyaWZ5PiBvcHRpb24uIE5vdGUgdGhhdCB0aGUgQ1JMcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQKK2JlIG5hbWVkIFhYWFhYWFhYLnIwIHdoZXJlIFhYWFhYWFhYIGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBDUkwuCisKK1RoZSBoYXNoIGFsZ29yaXRobSBoYXMgYmVlbiBjaGFuZ2VkIGluIEI8T3BlblNTTCAxLjAuMD4uICBJdCBpcyByZXF1aXJlZCB0bworY19yZWhhc2ggdGhlIGRpcmVjdG9yeSBvbiB1cGdyYWRlIGZyb20gQjxPcGVuU1NMIDAueC54PiB0byBCPE9wZW5TU0wgMS54Lng+LgorCitJPENSTHBhdGg+IHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIEk8Y2hyb290PiBkaXJlY3RvcnkgaWYgc3BlY2lmaWVkLgorCis9aXRlbSBCPENSTGZpbGU+ID0gQ0VSVF9GSUxFCisKK0NlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgZmlsZQorCitUaGlzIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgQ1JMcywgdXNlZCB3aXRoIHRoZSBJPHZlcmlmeT4gb3B0aW9uLgorCis9aXRlbSBCPGN1cnZlPiA9IE5JRAorCitzcGVjaWZ5IEVDREggY3VydmUgbmFtZQorCitUbyBnZXQgYSBsaXN0IG9mIHN1cHBvcnRlZCBjdXJ2ZXMgdXNlOgorCisgICAgb3BlbnNzbCBlY3BhcmFtIC1saXN0X2N1cnZlcworCitkZWZhdWx0OiBwcmltZTI1NnYxCisKKz1pdGVtIEI8bG9nSWQ+ID0gVFlQRQorCitjb25uZWN0aW9uIGlkZW50aWZpZXIgdHlwZQorCitUaGlzIGlkZW50aWZpZXIgYWxsb3dzIHlvdSB0byBkaXN0aW5ndWlzaCBsb2cgZW50cmllcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2YgdGhlCitjb25uZWN0aW9ucy4KKworQ3VycmVudGx5IHN1cHBvcnRlZCB0eXBlczoKKworPW92ZXIgNAorCis9aXRlbSBJPHNlcXVlbnRpYWw+CisKK1RoZSBudW1lcmljIHNlcXVlbnRpYWwgaWRlbnRpZmllciBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgaW5zdGFuY2Ugb2YKK0I8c3R1bm5lbD4sIGJ1dCB2ZXJ5IGNvbXBhY3QuICBJdCBpcyBtb3N0IHVzZWZ1bCBmb3IgbWFudWFsIGxvZyBhbmFseXNpcy4KKworPWl0ZW0gSTx1bmlxdWU+CisKK1RoaXMgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgaXMgZ2xvYmFsbHkgdW5pcXVlLCBidXQgbG9uZ2VyIHRoYW4gdGhlIHNlcXVlbnRpYWwKK251bWJlci4gIEl0IGlzIG1vc3QgdXNlZnVsIGZvciBhdXRvbWF0ZWQgbG9nIGFuYWx5c2lzLgorCis9aXRlbSBJPHRocmVhZD4KKworVGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhyZWFkIGlkZW50aWZpZXIgaXMgbmVpdGhlciB1bmlxdWUgKGV2ZW4gd2l0aGluIGEgc2luZ2xlCitpbnN0YW5jZSBvZiBCPHN0dW5uZWw+KSBub3Igc2hvcnQuICBJdCBpcyBtb3N0IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHNvZnR3YXJlCitvciBjb25maWd1cmF0aW9uIGlzc3Vlcy4KKworPWJhY2sKKworZGVmYXVsdDogc2VxdWVudGlhbAorCis9aXRlbSBCPGRlYnVnPiA9IExFVkVMCisKK2RlYnVnZ2luZyBsZXZlbAorCitMZXZlbCBpcyBhIG9uZSBvZiB0aGUgc3lzbG9nIGxldmVsIG5hbWVzIG9yIG51bWJlcnMKK2VtZXJnICgwKSwgYWxlcnQgKDEpLCBjcml0ICgyKSwgZXJyICgzKSwgd2FybmluZyAoNCksIG5vdGljZSAoNSksCitpbmZvICg2KSwgb3IgZGVidWcgKDcpLiAgQWxsIGxvZ3MgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwgYW5kCithbGwgbGV2ZWxzIG51bWVyaWNhbGx5IGxlc3MgdGhhbiBpdCB3aWxsIGJlIHNob3duLiAgVXNlIEk8ZGVidWcgPSBkZWJ1Zz4gb3IKK0k8ZGVidWcgPSA3PiBmb3IgZ3JlYXRlc3QgZGVidWdnaW5nIG91dHB1dC4gIFRoZSBkZWZhdWx0IGlzIG5vdGljZSAoNSkuCisKKz1pdGVtIEI8ZGVsYXk+ID0geWVzIHwgbm8KKworZGVsYXkgRE5TIGxvb2t1cCBmb3IgdGhlIEk8Y29ubmVjdD4gb3B0aW9uCisKK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZHluYW1pYyBETlMsIG9yIHdoZW4gRE5TIGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nCitCPHN0dW5uZWw+IHN0YXJ0dXAgKHJvYWQgd2FycmlvciBWUE4sIGRpYWwtdXAgY29uZmlndXJhdGlvbnMpLgorCitEZWxheWVkIHJlc29sdmVyIG1vZGUgaXMgYXV0b21hdGljYWxseSBlbmdhZ2VkIHdoZW4gc3R1bm5lbCBmYWlscyB0byByZXNvbHZlIG9uCitzdGFydHVwIGFueSBvZiB0aGUgSTxjb25uZWN0PiB0YXJnZXRzIGZvciBhIHNlcnZpY2UuCisKK0RlbGF5ZWQgcmVzb2x2ZXIgaW5mbGljdHMgSTxmYWlsb3ZlciA9IHByaW8+LgorCitkZWZhdWx0OiBubworCis9aXRlbSBCPGVuZ2luZUlkPiA9IEVOR0lORV9JRAorCitzZWxlY3QgZW5naW5lIElEIGZvciB0aGUgc2VydmljZQorCis9aXRlbSBCPGVuZ2luZU51bT4gPSBFTkdJTkVfTlVNQkVSCisKK3NlbGVjdCBlbmdpbmUgbnVtYmVyIGZvciB0aGUgc2VydmljZQorCitUaGUgZW5naW5lcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxLgorCis9aXRlbSBCPGV4ZWM+ID0gRVhFQ1VUQUJMRV9QQVRICisKK2V4ZWN1dGUgYSBsb2NhbCBpbmV0ZC10eXBlIHByb2dyYW0gCisKK0k8ZXhlYz4gcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgSTxjaHJvb3Q+IGRpcmVjdG9yeSBpZiBzcGVjaWZpZWQuCisKK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMgYXJlIHNldCBvbiBVbml4IHBsYXRmb3JtczoKK1JFTU9URV9IT1NULCBSRU1PVEVfUE9SVCwgU1NMX0NMSUVOVF9ETiwgU1NMX0NMSUVOVF9JX0ROLgorCis9aXRlbSBCPGV4ZWNBcmdzPiA9ICQwICQxICQyIC4uLgorCithcmd1bWVudHMgZm9yIEk8ZXhlYz4gaW5jbHVkaW5nIHRoZSBwcm9ncmFtIG5hbWUgKCQwKQorCitRdW90aW5nIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorQXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHdoaXRlc3BhY2UuCisKKz1pdGVtIEI8ZmFpbG92ZXI+ID0gcnIgfCBwcmlvCisKK0ZhaWxvdmVyIHN0cmF0ZWd5IGZvciBtdWx0aXBsZSAiY29ubmVjdCIgdGFyZ2V0cy4KKworICAgIHJyIChyb3VuZCByb2JpbikgLSBmYWlyIGxvYWQgZGlzdHJpYnV0aW9uCisgICAgcHJpbyAocHJpb3JpdHkpIC0gdXNlIHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gY29uZmlnIGZpbGUKKworZGVmYXVsdDogcnIKKworPWl0ZW0gQjxpZGVudD4gPSBVU0VSTkFNRQorCit1c2UgSURFTlQgKFJGQyAxNDEzKSB1c2VybmFtZSBjaGVja2luZworCis9aXRlbSBCPGluY2x1ZGU+ID0gRElSRUNUT1JZCisKK2luY2x1ZGUgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJ0cyBsb2NhdGVkIGluIERJUkVDVE9SWQorCitUaGUgZmlsZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBhc2NlbmRpbmcgYWxwaGFiZXRpY2FsIG9yZGVyIG9mIHRoZWlyIG5hbWVzLgorCis9aXRlbSBCPGtleT4gPSBLRVlfRklMRQorCitwcml2YXRlIGtleSBmb3IgdGhlIGNlcnRpZmljYXRlIHNwZWNpZmllZCB3aXRoIEk8Y2VydD4gb3B0aW9uCisKK0EgcHJpdmF0ZSBrZXkgaXMgbmVlZGVkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgY2VydGlmaWNhdGUgb3duZXIuCitTaW5jZSB0aGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgc2VjcmV0IGl0IHNob3VsZCBvbmx5IGJlIHJlYWRhYmxlCitieSBpdHMgb3duZXIuICBPbiBVbml4IHN5c3RlbXMgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgY2htb2QgNjAwIGtleWZpbGUKKworZGVmYXVsdDogdGhlIHZhbHVlIG9mIHRoZSBJPGNlcnQ+IG9wdGlvbgorCis9aXRlbSBCPGxpYndyYXA+ID0geWVzIHwgbm8KKworRW5hYmxlIG9yIGRpc2FibGUgdGhlIHVzZSBvZiAvZXRjL2hvc3RzLmFsbG93IGFuZCAvZXRjL2hvc3RzLmRlbnkuCisKK2RlZmF1bHQ6IG5vIChzaW5jZSB2ZXJzaW9uIDUuMDApCisKKz1pdGVtIEI8bG9jYWw+ID0gSE9TVAorCitCeSBkZWZhdWx0LCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgb3V0Z29pbmcgaW50ZXJmYWNlIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBmb3IgcmVtb3RlIGNvbm5lY3Rpb25zLgorVXNlIHRoaXMgb3B0aW9uIHRvIGJpbmQgYSBzdGF0aWMgbG9jYWwgSVAgYWRkcmVzcyBpbnN0ZWFkLgorCis9aXRlbSBCPHNuaT4gPSBTRVJWSUNFOlNFUlZFUl9QQVRURVJOIChzZXJ2ZXIgbW9kZSkKKworVXNlIHRoZSBzZXJ2aWNlIGFzIGEgc2xhdmUgc2VydmljZSAoYSBuYW1lLWJhc2VkIHZpcnR1YWwgc2VydmVyKSBmb3IgU2VydmVyCitOYW1lIEluZGljYXRpb24gVExTIGV4dGVuc2lvbiAoUkZDIDM1NDYpLgorCitJPHNlcnZpY2VfbmFtZT4gc3BlY2lmaWVzIHRoZSBtYXN0ZXIgc2VydmljZSB0aGF0IGFjY2VwdHMgY2xpZW50IGNvbm5lY3Rpb25zCit3aXRoIHRoZSBJPGFjY2VwdD4gb3B0aW9uLiAgSTxzZXJ2ZXJfbmFtZV9wYXR0ZXJuPiBzcGVjaWZpZXMgdGhlIGhvc3QgbmFtZSB0byBiZQorcmVkaXJlY3RlZC4gIFRoZSBwYXR0ZXJuIG1heSBzdGFydCB3aXRoIHRoZSAnKicgY2hhcmFjdGVyLCBlLmcuICcqLmV4YW1wbGUuY29tJy4KK011bHRpcGxlIHNsYXZlIHNlcnZpY2VzIGFyZSBub3JtYWxseSBzcGVjaWZpZWQgZm9yIGEgc2luZ2xlIG1hc3RlciBzZXJ2aWNlLgorVGhlIEk8c25pPiBvcHRpb24gY2FuIGFsc28gYmUgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIHdpdGhpbiBhIHNpbmdsZSBzbGF2ZQorc2VydmljZS4KKworVGhpcyBzZXJ2aWNlLCBhcyB3ZWxsIGFzIHRoZSBtYXN0ZXIgc2VydmljZSwgbWF5IG5vdCBiZSBjb25maWd1cmVkIGluIGNsaWVudAorbW9kZS4KKworVGhlIEk8Y29ubmVjdD4gb3B0aW9uIG9mIHRoZSBzbGF2ZSBzZXJ2aWNlIGlzIGlnbm9yZWQgd2hlbiB0aGUgSTxwcm90b2NvbD4gb3B0aW9uIGlzCitzcGVjaWZpZWQsIGFzIEk8cHJvdG9jb2w+IGNvbm5lY3RzIHRvIHRoZSByZW1vdGUgaG9zdCBiZWZvcmUgVExTIGhhbmRzaGFrZS4KKworTGlid3JhcCBjaGVja3MgKFVuaXggb25seSkgYXJlIHBlcmZvcm1lZCB0d2ljZTogd2l0aCB0aGUgbWFzdGVyIHNlcnZpY2UgbmFtZSBhZnRlcgorVENQIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIGFuZCB3aXRoIHRoZSBzbGF2ZSBzZXJ2aWNlIG5hbWUgZHVyaW5nIHRoZSBUTFMgaGFuZHNoYWtlLgorCitUaGUgSTxzbmk+IG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggQjxPcGVuU1NMIDEuMC4wPiBhbmQgbGF0ZXIuCisKKz1pdGVtIEI8c25pPiA9IFNFUlZFUiAoY2xpZW50IG1vZGUpCisKK1VzZSB0aGUgcGFyYW1ldGVyIGFzIHRoZSB2YWx1ZSBvZiBUTFMgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoUkZDIDM1NDYpCitleHRlbnNpb24uCisKK1RoZSBJPHNuaT4gb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCBCPE9wZW5TU0wgMS4wLjA+IGFuZCBsYXRlci4KKworPWl0ZW0gQjxPQ1NQPiA9IFVSTAorCitzZWxlY3QgT0NTUCBzZXJ2ZXIgZm9yIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbgorCis9aXRlbSBCPE9DU1BhaWE+ID0geWVzIHwgbm8KKwordmFsaWRhdGUgY2VydGlmaWNhdGVzIHdpdGggdGhlaXIgQUlBIE9DU1AgcmVzcG9uZGVycworCitUaGlzIG9wdGlvbiBlbmFibGVzIEk8c3R1bm5lbD4gdG8gdmFsaWRhdGUgY2VydGlmaWNhdGVzIHdpdGggdGhlIGxpc3Qgb2YKK09DU1AgcmVzcG9uZGVyIFVSTHMgcmV0cmlldmVkIGZyb20gdGhlaXIgQUlBIChBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzKQorZXh0ZW5zaW9uLgorCis9aXRlbSBCPE9DU1BmbGFnPiA9IE9DU1BfRkxBRworCitzcGVjaWZ5IE9DU1Agc2VydmVyIGZsYWcKKworU2V2ZXJhbCBJPE9DU1BmbGFnPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIGZsYWdzLgorCitjdXJyZW50bHkgc3VwcG9ydGVkIGZsYWdzOiBOT0NFUlRTLCBOT0lOVEVSTiBOT1NJR1MsIE5PQ0hBSU4sIE5PVkVSSUZZLAorTk9FWFBMSUNJVCwgTk9DQVNJR04sIE5PREVMRUdBVEVELCBOT0NIRUNLUywgVFJVU1RPVEhFUiwgUkVTUElEX0tFWSwgTk9USU1FCisKKz1pdGVtIEI8b3B0aW9ucz4gPSBTU0xfT1BUSU9OUworCitCPE9wZW5TU0w+IGxpYnJhcnkgb3B0aW9ucworCitUaGUgcGFyYW1ldGVyIGlzIHRoZSBCPE9wZW5TU0w+IG9wdGlvbiBuYW1lIGFzIGRlc2NyaWJlZCBpbiB0aGUKK0k8U1NMX0NUWF9zZXRfb3B0aW9ucygzc3NsKT4gbWFudWFsLCBidXQgd2l0aG91dCBJPFNTTF9PUF8+IHByZWZpeC4KK0k8c3R1bm5lbCAtb3B0aW9ucz4gbGlzdHMgdGhlIG9wdGlvbnMgZm91bmQgdG8gYmUgYWxsb3dlZCBpbiB0aGUKK2N1cnJlbnQgY29tYmluYXRpb24gb2YgSTxzdHVubmVsPiBhbmQgdGhlIEk8T3BlblNTTD4gbGlicmFyeSB1c2VkCit0byBidWlsZCBpdC4KKworU2V2ZXJhbCBJPG9wdGlvbnM+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbXVsdGlwbGUgb3B0aW9ucy4KK0FuIG9wdGlvbiBuYW1lIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCBhIGRhc2ggKCItIikgdG8gZGlzYWJsZSB0aGUgb3B0aW9uLgorCitGb3IgZXhhbXBsZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXJyb25lb3VzIEV1ZG9yYSBTU0wKK2ltcGxlbWVudGF0aW9uLCB0aGUgZm9sbG93aW5nIG9wdGlvbiBjYW4gYmUgdXNlZDoKKworICAgIG9wdGlvbnMgPSBET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKKworZGVmYXVsdDoKKworICAgIG9wdGlvbnMgPSBOT19TU0x2MgorICAgIG9wdGlvbnMgPSBOT19TU0x2MworCis9aXRlbSBCPHByb3RvY29sPiA9IFBST1RPCisKK2FwcGxpY2F0aW9uIHByb3RvY29sIHRvIG5lZ290aWF0ZSBTU0wKKworVGhpcyBvcHRpb24gZW5hYmxlcyBpbml0aWFsLCBwcm90b2NvbC1zcGVjaWZpYyBuZWdvdGlhdGlvbiBvZiB0aGUgU1NML1RMUworZW5jcnlwdGlvbi4KK1RoZSBJPHByb3RvY29sPiBvcHRpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggU1NMIGVuY3J5cHRpb24gb24gYSBzZXBhcmF0ZSBwb3J0LgorCitDdXJyZW50bHkgc3VwcG9ydGVkIHByb3RvY29sczoKKworPW92ZXIgNAorCis9aXRlbSBJPGNpZnM+CisKK1Byb3ByaWV0YXJ5ICh1bmRvY3VtbWVudGVkKSBleHRlbnNpb24gb2YgQ0lGUyBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiBTYW1iYS4KK1N1cHBvcnQgZm9yIHRoaXMgZXh0ZW5zaW9uIHdhcyBkcm9wcGVkIGluIFNhbWJhIDMuMC4wLgorCis9aXRlbSBJPGNvbm5lY3Q+CisKK0Jhc2VkIG9uIFJGQyAyODE3IC0gSTxVcGdyYWRpbmcgdG8gVExTIFdpdGhpbiBIVFRQLzEuMT4sIHNlY3Rpb24gNS4yIC0gSTxSZXF1ZXN0aW5nIGEgVHVubmVsIHdpdGggQ09OTkVDVD4KKworVGhpcyBwcm90b2NvbCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjbGllbnQgbW9kZS4KKworPWl0ZW0gSTxpbWFwPgorCitCYXNlZCBvbiBSRkMgMjU5NSAtIEk8VXNpbmcgVExTIHdpdGggSU1BUCwgUE9QMyBhbmQgQUNBUD4KKworPWl0ZW0gSTxubnRwPgorCitCYXNlZCBvbiBSRkMgNDY0MiAtIEk8VXNpbmcgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHdpdGggTmV0d29yayBOZXdzIFRyYW5zZmVyIFByb3RvY29sIChOTlRQKT4KKworVGhpcyBwcm90b2NvbCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjbGllbnQgbW9kZS4KKworPWl0ZW0gSTxwZ3NxbD4KKworQmFzZWQgb24KK0Y8aHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzguMy9zdGF0aWMvcHJvdG9jb2wtZmxvdy5odG1sI0FFTjczOTgyPgorCis9aXRlbSBJPHBvcDM+CisKK0Jhc2VkIG9uIFJGQyAyNDQ5IC0gSTxQT1AzIEV4dGVuc2lvbiBNZWNoYW5pc20+CisKKz1pdGVtIEk8cHJveHk+CisKK0hhcHJveHkgY2xpZW50IElQIGFkZHJlc3MKK0Y8aHR0cDovL2hhcHJveHkuMXd0LmV1L2Rvd25sb2FkLzEuNS9kb2MvcHJveHktcHJvdG9jb2wudHh0PgorCis9aXRlbSBJPHNtdHA+CisKK0Jhc2VkIG9uIFJGQyAyNDg3IC0gSTxTTVRQIFNlcnZpY2UgRXh0ZW5zaW9uIGZvciBTZWN1cmUgU01UUCBvdmVyIFRMUz4KKworPWl0ZW0gSTxzb2Nrcz4KKworU09DS1MgdmVyc2lvbnMgNCwgNGEsIGFuZCA1IGFyZSBzdXBwb3J0ZWQuICBUaGUgU09DS1MgcHJvdG9jb2wgaXRzZWxmCitpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIFNTTC9UTFMgZW5jcnlwdGlvbiBsYXllciB0byBwcm90ZWN0IHRoZSBmaW5hbAorZGVzdGluYXRpb24gYWRkcmVzcy4KKworRjxodHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9zb2NrczQucHJvdG9jb2w+CisKK0Y8aHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvc29ja3M0YS5wcm90b2NvbD4KKworVGhlIEJJTkQgY29tbWFuZCBvZiB0aGUgU09DS1MgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KK1RoZSBVU0VSSUQgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisKK1NlZSBFeGFtcGxlcyBzZWN0aW9uIGZvciBzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgVlBOIGJhc2VkIG9uIFNPQ0tTCitlbmNyeXB0aW9uLgorCis9YmFjaworCis9aXRlbSBCPHByb3RvY29sQXV0aGVudGljYXRpb24+ID0gYmFzaWMgfCBudGxtCisKK2F1dGhlbnRpY2F0aW9uIHR5cGUgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucworCitDdXJyZW50bHkgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgb25seSBhcHBsaWVzIHRvIHRoZSAnY29ubmVjdCcgcHJvdG9jb2wuCisKK2RlZmF1bHQ6IGJhc2ljCisKKz1pdGVtIEI8cHJvdG9jb2xIb3N0PiA9IEhPU1Q6UE9SVAorCitkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBwcm90b2NvbCBuZWdvdGlhdGlvbnMKKworSTxwcm90b2NvbEhvc3Q+IHNwZWNpZmllcyB0aGUgZmluYWwgU1NMIHNlcnZlciB0byBiZSBjb25uZWN0ZWQgdG8gYnkgdGhlIHByb3h5LAorYW5kIG5vdCB0aGUgcHJveHkgc2VydmVyIGRpcmVjdGx5IGNvbm5lY3RlZCBieSBCPHN0dW5uZWw+LgorVGhlIHByb3h5IHNlcnZlciBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGggdGhlICdjb25uZWN0JyBvcHRpb24uCisKK0N1cnJlbnRseSB0aGUgcHJvdG9jb2wgZGVzdGluYXRpb24gYWRkcmVzcyBvbmx5IGFwcGxpZXMgdG8gJ2Nvbm5lY3QnIHByb3RvY29sLgorCis9aXRlbSBCPHByb3RvY29sUGFzc3dvcmQ+ID0gUEFTU1dPUkQKKworcGFzc3dvcmQgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucworCis9aXRlbSBCPHByb3RvY29sVXNlcm5hbWU+ID0gVVNFUk5BTUUKKwordXNlcm5hbWUgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucworCis9aXRlbSBCPFBTS2lkZW50aXR5PiA9IElERU5USVRZCisKK1BTSyBpZGVudGl0eSBmb3IgdGhlIFBTSyBjbGllbnQKKworSTxQU0tpZGVudGl0eT4gY2FuIGJlIHVzZWQgb24gQjxzdHVubmVsPiBjbGllbnRzIHRvIHNlbGVjdCB0aGUgUFNLIGlkZW50aXR5Cit1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4gIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaW4gc2VydmVyIHNlY3Rpb25zLgorCitkZWZhdWx0OiB0aGUgZmlyc3QgaWRlbnRpdHkgc3BlY2lmaWVkIGluIHRoZSBJPFBTS3NlY3JldHM+IGZpbGUuCisKKz1pdGVtIEI8UFNLc2VjcmV0cz4gPSBGSUxFCisKK2ZpbGUgd2l0aCBQU0sgaWRlbnRpdGllcyBhbmQgY29ycmVzcG9uZGluZyBrZXlzCisKK0VhY2ggbGluZSBvZiB0aGUgZmlsZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgIElERU5USVRZOktFWQorCitUaGUga2V5IGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDIwIGNoYXJhY3RlcnMgbG9uZy4KK1RoZSBmaWxlIHNob3VsZCBub3QgYmUgd29ybGQtcmVhZGFibGUgbm9yIHdvcmxkLXdyaXRhYmxlLgorCis9aXRlbSBCPHB0eT4gPSB5ZXMgfCBubyAoVW5peCBvbmx5KQorCithbGxvY2F0ZSBhIHBzZXVkb3Rlcm1pbmFsIGZvciAnZXhlYycgb3B0aW9uCisKKz1pdGVtIEI8cmVkaXJlY3Q+ID0gW0hPU1Q6XVBPUlQKKworcmVkaXJlY3QgU1NMIGNsaWVudCBjb25uZWN0aW9ucyBvbiBjZXJ0aWZpY2F0ZS1iYXNlZCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlcworCitUaGlzIG9wdGlvbiBvbmx5IHdvcmtzIGluIHNlcnZlciBtb2RlLgorU29tZSBwcm90b2NvbCBuZWdvdGlhdGlvbnMgYXJlIGFsc28gaW5jb21wYXRpYmxlIHdpdGggdGhlIEk8cmVkaXJlY3Q+IG9wdGlvbi4KKworPWl0ZW0gQjxyZW5lZ290aWF0aW9uPiA9IHllcyB8IG5vCisKK3N1cHBvcnQgU1NMIHJlbmVnb3RpYXRpb24KKworQXBwbGljYXRpb25zIG9mIHRoZSBTU0wgcmVuZWdvdGlhdGlvbiBpbmNsdWRlIHNvbWUgYXV0aGVudGljYXRpb24gc2NlbmFyaW9zLAorb3IgcmUta2V5aW5nIGxvbmcgbGFzdGluZyBjb25uZWN0aW9ucy4KKworT24gdGhlIG90aGVyIGhhbmQgdGhpcyBmZWF0dXJlIGNhbiBmYWNpbGl0YXRlIGEgdHJpdmlhbCBDUFUtZXhoYXVzdGlvbgorRG9TIGF0dGFjazoKKworRjxodHRwOi8vdmluY2VudC5iZXJuYXQuaW0vZW4vYmxvZy8yMDExLXNzbC1kb3MtbWl0aWdhdGlvbi5odG1sPgorCitQbGVhc2Ugbm90ZSB0aGF0IGRpc2FibGluZyBTU0wgcmVuZWdvdGlhdGlvbiBkb2VzIG5vdCBmdWxseSBtaXRpZ2F0ZQordGhpcyBpc3N1ZS4KKworZGVmYXVsdDogeWVzIChpZiBzdXBwb3J0ZWQgYnkgQjxPcGVuU1NMPikKKworPWl0ZW0gQjxyZXNldD4gPSB5ZXMgfCBubworCithdHRlbXB0IHRvIHVzZSB0aGUgVENQIFJTVCBmbGFnIHRvIGluZGljYXRlIGFuIGVycm9yCisKK1RoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMuCisKK2RlZmF1bHQ6IHllcworCis9aXRlbSBCPHJldHJ5PiA9IHllcyB8IG5vCisKK3JlY29ubmVjdCBhIGNvbm5lY3QrZXhlYyBzZWN0aW9uIGFmdGVyIGl0J3MgZGlzY29ubmVjdGVkCisKK2RlZmF1bHQ6IG5vCisKKz1pdGVtIEI8c2Vzc2lvbkNhY2hlU2l6ZT4gPSBOVU1fRU5UUklFUworCitzZXNzaW9uIGNhY2hlIHNpemUKKworSTxzZXNzaW9uQ2FjaGVTaXplPiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlCitlbnRyaWVzLgorCitUaGUgdmFsdWUgb2YgMCBjYW4gYmUgdXNlZCBmb3IgdW5saW1pdGVkIHNpemUuICBJdCBpcyBub3QgcmVjb21tZW5kZWQKK2ZvciBwcm9kdWN0aW9uIHVzZSBkdWUgdG8gdGhlIHJpc2sgb2YgYSBtZW1vcnkgZXhoYXVzdGlvbiBEb1MgYXR0YWNrLgorCis9aXRlbSBCPHNlc3Npb25DYWNoZVRpbWVvdXQ+ID0gVElNRU9VVAorCitzZXNzaW9uIGNhY2hlIHRpbWVvdXQKKworVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8ga2VlcCBjYWNoZWQgU1NMIHNlc3Npb25zLgorCis9aXRlbSBCPHNlc3Npb25kPiA9IEhPU1Q6UE9SVAorCithZGRyZXNzIG9mIHNlc3Npb25kIFNTTCBjYWNoZSBzZXJ2ZXIKKworPWl0ZW0gQjxzc2xWZXJzaW9uPiA9IFNTTF9WRVJTSU9OCisKK3NlbGVjdCB0aGUgU1NMIHByb3RvY29sIHZlcnNpb24KKworU3VwcG9ydGVkIHZhbHVlczogYWxsLCBTU0x2MiwgU1NMdjMsIFRMU3YxLCBUTFN2MS4xLCBUTFN2MS4yCisKK0F2YWlsYWJpbGl0eSBvZiBzcGVjaWZpYyBwcm90b2NvbHMgZGVwZW5kcyBvbiB0aGUgbGlua2VkIE9wZW5TU0wgbGlicmFyeS4KK09sZGVyIHZlcnNpb25zIG9mIE9wZW5TU0wgZG8gbm90IHN1cHBvcnQgVExTdjEuMSBhbmQgVExTdjEuMi4KK05ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wgZG8gbm90IHN1cHBvcnQgU1NMdjIuCisKK09ic29sZXRlIFNTTHYyIGFuZCBTU0x2MyBhcmUgY3VycmVudGx5IGRpc2FibGVkIGJ5IGRlZmF1bHQuCitTZWUgdGhlIEI8b3B0aW9ucz4gb3B0aW9uIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisKKz1pdGVtIEI8c3RhY2s+ID0gQllURVMgKGV4Y2VwdCBmb3IgRk9SSyBtb2RlbCkKKwordGhyZWFkIHN0YWNrIHNpemUKKworPWl0ZW0gQjxUSU1FT1VUYnVzeT4gPSBTRUNPTkRTCisKK3RpbWUgdG8gd2FpdCBmb3IgZXhwZWN0ZWQgZGF0YQorCis9aXRlbSBCPFRJTUVPVVRjbG9zZT4gPSBTRUNPTkRTCisKK3RpbWUgdG8gd2FpdCBmb3IgY2xvc2Vfbm90aWZ5IChzZXQgdG8gMCBmb3IgYnVnZ3kgTVNJRSkKKworPWl0ZW0gQjxUSU1FT1VUY29ubmVjdD4gPSBTRUNPTkRTCisKK3RpbWUgdG8gd2FpdCB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QKKworPWl0ZW0gQjxUSU1FT1VUaWRsZT4gPSBTRUNPTkRTCisKK3RpbWUgdG8ga2VlcCBhbiBpZGxlIGNvbm5lY3Rpb24KKworPWl0ZW0gQjx0cmFuc3BhcmVudD4gPSBub25lIHwgc291cmNlIHwgZGVzdGluYXRpb24gfCBib3RoIChVbml4IG9ubHkpCisKK2VuYWJsZSB0cmFuc3BhcmVudCBwcm94eSBzdXBwb3J0IG9uIHNlbGVjdGVkIHBsYXRmb3JtcworCitTdXBwb3J0ZWQgdmFsdWVzOgorCis9b3ZlciA0CisKKz1pdGVtIEk8bm9uZT4KKworRGlzYWJsZSB0cmFuc3BhcmVudCBwcm94eSBzdXBwb3J0LiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KKworPWl0ZW0gSTxzb3VyY2U+CisKK1JlLXdyaXRlIHRoZSBhZGRyZXNzIHRvIGFwcGVhciBhcyBpZiBhIHdyYXBwZWQgZGFlbW9uIGlzIGNvbm5lY3RpbmcKK2Zyb20gdGhlIFNTTCBjbGllbnQgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgQjxzdHVubmVsPi4KKworVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBpbjoKKworPW92ZXIgNAorCis9aXRlbSBSZW1vdGUgbW9kZSAoSTxjb25uZWN0PiBvcHRpb24pIG9uIEk8TGludXggRTxndD49Mi42LjI4PgorCitUaGlzIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgQjxzdHVubmVsPiB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0Cit0aGUgSTxzZXR1aWQ+IG9wdGlvbi4KKworVGhpcyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc2V0dXAgZm9yIGlwdGFibGVzIGFuZCByb3V0aW5nCisocG9zc2libHkgaW4gL2V0Yy9yYy5sb2NhbCBvciBlcXVpdmFsZW50IGZpbGUpOgorCisgICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1OIERJVkVSVAorICAgIGlwdGFibGVzIC10IG1hbmdsZSAtQSBQUkVST1VUSU5HIC1wIHRjcCAtbSBzb2NrZXQgLWogRElWRVJUCisgICAgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIERJVkVSVCAtaiBNQVJLIC0tc2V0LW1hcmsgMQorICAgIGlwdGFibGVzIC10IG1hbmdsZSAtQSBESVZFUlQgLWogQUNDRVBUCisgICAgaXAgcnVsZSBhZGQgZndtYXJrIDEgbG9va3VwIDEwMAorICAgIGlwIHJvdXRlIGFkZCBsb2NhbCAwLjAuMC4wLzAgZGV2IGxvIHRhYmxlIDEwMAorICAgIGVjaG8gMCA+L3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvbG8vcnBfZmlsdGVyCisKK0I8c3R1bm5lbD4gbXVzdCBhbHNvIHRvIGJlIGV4ZWN1dGVkIGFzIHJvb3QgYW5kIHdpdGhvdXQgdGhlIEk8c2V0dWlkPiBvcHRpb24uCisKKz1pdGVtIFJlbW90ZSBtb2RlIChJPGNvbm5lY3Q+IG9wdGlvbikgb24gSTxMaW51eCAyLjIueD4KKworVGhpcyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIHRoZSBrZXJuZWwgdG8gYmUgY29tcGlsZWQgd2l0aCB0aGUgSTx0cmFuc3BhcmVudCBwcm94eT4KK29wdGlvbi4KK0Nvbm5lY3RlZCBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIG9uIGEgc2VwYXJhdGUgaG9zdC4KK1JvdXRpbmcgdG93YXJkcyB0aGUgY2xpZW50cyBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgQjxzdHVubmVsPiBib3guCisKK0I8c3R1bm5lbD4gbXVzdCBhbHNvIHRvIGJlIGV4ZWN1dGVkIGFzIHJvb3QgYW5kIHdpdGhvdXQgdGhlIEk8c2V0dWlkPiBvcHRpb24uCisKKz1pdGVtIFJlbW90ZSBtb2RlIChJPGNvbm5lY3Q+IG9wdGlvbikgb24gSTxGcmVlQlNEIEU8Z3Q+PTguMD4KKworVGhpcyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGFkZGl0aW9uYWwgZmlyZXdhbGwgYW5kIHJvdXRpbmcgc2V0dXAuCitCPHN0dW5uZWw+IG11c3QgYWxzbyB0byBiZSBleGVjdXRlZCBhcyByb290IGFuZCB3aXRob3V0IHRoZSBJPHNldHVpZD4gb3B0aW9uLgorCis9aXRlbSBMb2NhbCBtb2RlIChJPGV4ZWM+IG9wdGlvbikKKworVGhpcyBjb25maWd1cmF0aW9uIHdvcmtzIGJ5IHByZS1sb2FkaW5nIHRoZSBJPGxpYnN0dW5uZWwuc28+IHNoYXJlZCBsaWJyYXJ5LgorX1JMRF9MSVNUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgb24gVHJ1NjQsIGFuZCBMRF9QUkVMT0FEIHZhcmlhYmxlIG9uCitvdGhlciBwbGF0Zm9ybXMuCisKKz1iYWNrCisKKz1pdGVtIEk8ZGVzdGluYXRpb24+CisKK1RoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIEk8Y29ubmVjdD4gb3B0aW9uLgorCitBIHNlcnZpY2Ugc2VjdGlvbiBmb3IgdHJhbnNwYXJlbnQgZGVzdGluYXRpb24gbWF5IGxvb2sgbGlrZSB0aGlzOgorCisgICAgW3RyYW5zcGFyZW50XQorICAgIGNsaWVudD15ZXMKKyAgICBhY2NlcHQ9PHN0dW5uZWxfcG9ydD4KKyAgICB0cmFuc3BhcmVudD1kZXN0aW5hdGlvbgorCitUaGlzIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgaXB0YWJsZXMgc2V0dXAgdG8gd29yaywKK3Bvc3NpYmx5IGluIC9ldGMvcmMubG9jYWwgb3IgZXF1aXZhbGVudCBmaWxlLgorCitGb3IgYSBjb25uZWN0IHRhcmdldCBpbnN0YWxsZWQgb24gdGhlIHNhbWUgaG9zdDoKKworICAgIC9zYmluL2lwdGFibGVzIC10IG5hdCAtSSBPVVRQVVQgLXAgdGNwIC0tZHBvcnQgPHJlZGlyZWN0ZWRfcG9ydD4gXAorICAgICAgICAtbSAhIC0tdWlkLW93bmVyIDxzdHVubmVsX3VzZXJfaWQ+IFwKKyAgICAgICAgLWogRE5BVCAtLXRvLWRlc3RpbmF0aW9uIDxsb2NhbF9pcD46PHN0dW5uZWxfcG9ydD4KKworRm9yIGEgY29ubmVjdCB0YXJnZXQgaW5zdGFsbGVkIG9uIGEgcmVtb3RlIGhvc3Q6CisKKyAgICAvc2Jpbi9pcHRhYmxlcyAtSSBJTlBVVCAtaSBldGgwIC1wIHRjcCAtLWRwb3J0IDxzdHVubmVsX3BvcnQ+IC1qIEFDQ0VQVAorICAgIC9zYmluL2lwdGFibGVzIC10IG5hdCAtSSBQUkVST1VUSU5HIC1wIHRjcCAtLWRwb3J0IDxyZWRpcmVjdGVkX3BvcnQ+IFwKKyAgICAgICAgLWkgZXRoMCAtaiBETkFUIC0tdG8tZGVzdGluYXRpb24gPGxvY2FsX2lwPjo8c3R1bm5lbF9wb3J0PgorCitUaGUgdHJhbnNwYXJlbnQgZGVzdGluYXRpb24gb3B0aW9uIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBMaW51eC4KKworPWl0ZW0gSTxib3RoPgorCitVc2UgYm90aCBJPHNvdXJjZT4gYW5kIEk8ZGVzdGluYXRpb24+IHRyYW5zcGFyZW50IHByb3h5LgorCis9YmFjaworCitUd28gbGVnYWN5IG9wdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorCis9b3ZlciA0CisKKz1pdGVtIEk8eWVzPgorCitUaGlzIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIEk8c291cmNlPi4KKworPWl0ZW0gSTxubz4KKworVGhpcyBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBJPG5vbmU+LgorCis9YmFjaworCisKKz1pdGVtIEI8dmVyaWZ5PiA9IExFVkVMCisKK3ZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZQorCis9b3ZlciA0CisKKz1pdGVtIGxldmVsIDAKKworUmVxdWVzdCBhbmQgaWdub3JlIHRoZSBwZWVyIGNlcnRpZmljYXRlLgorCis9aXRlbSBsZXZlbCAxCisKK1ZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBpZiBwcmVzZW50LgorCis9aXRlbSBsZXZlbCAyCisKK1ZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZS4KKworPWl0ZW0gbGV2ZWwgMworCitWZXJpZnkgdGhlIHBlZXIgd2l0aCBsb2NhbGx5IGluc3RhbGxlZCBjZXJ0aWZpY2F0ZS4KKworPWl0ZW0gbGV2ZWwgNAorCitJZ25vcmUgdGhlIENBIGNoYWluIGFuZCBvbmx5IHZlcmlmeSB0aGUgcGVlciBjZXJ0aWZpY2F0ZS4KKworPWl0ZW0gZGVmYXVsdAorCitObyB2ZXJpZnkuCisKKz1iYWNrCisKK0l0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoYXQgdGhpcyBvcHRpb24gd2FzIHNvbGVseSBkZXNpZ25lZCBmb3IgYWNjZXNzCitjb250cm9sIGFuZCBub3QgZm9yIGF1dGhvcml6YXRpb24uICBTcGVjaWZpY2FsbHkgZm9yIGxldmVsIDIgZXZlcnkgbm9uLXJldm9rZWQKK2NlcnRpZmljYXRlIGlzIGFjY2VwdGVkIHJlZ2FyZGxlc3Mgb2YgaXRzIENvbW1vbiBOYW1lLiAgRm9yIHRoaXMgcmVhc29uIGEKK2RlZGljYXRlZCBDQSBzaG91bGQgYmUgdXNlZCB3aXRoIGxldmVsIDIsIGFuZCBub3QgYSBnZW5lcmljIENBIGNvbW1vbmx5IHVzZWQKK2ZvciB3ZWJzZXJ2ZXJzLiAgTGV2ZWwgMyBpcyBwcmVmZXJyZWQgZm9yIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zLgorCis9YmFjaworCisKKz1oZWFkMSBSRVRVUk4gVkFMVUUKKworQjxzdHVubmVsPiByZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisKKworPWhlYWQxIFNJR05BTFMKKworVGhlIGZvbGxvd2luZyBzaWduYWxzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgQjxzdHVubmVsPiBpbiBVbml4IGVudmlyb25tZW50OgorCis9b3ZlciA0CisKKz1pdGVtIFNJR0hVUAorCitGb3JjZSBhIHJlbG9hZCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCitTb21lIGdsb2JhbCBvcHRpb25zIHdpbGwgbm90IGJlIHJlbG9hZGVkOgorCis9b3ZlciA0CisKKz1pdGVtICoKKworY2hyb290CisKKz1pdGVtICoKKworZm9yZWdyb3VuZAorCis9aXRlbSAqCisKK3BpZAorCis9aXRlbSAqCisKK3NldGdpZAorCis9aXRlbSAqCisKK3NldHVpZAorCis9YmFjaworCitUaGUgdXNlIG9mIHRoZSAnc2V0dWlkJyBvcHRpb24gd2lsbCBhbHNvIHByZXZlbnQgQjxzdHVubmVsPiBmcm9tIGJpbmRpbmcgdG8gcHJpdmlsZWdlZAorKDwxMDI0KSBwb3J0cyBkdXJpbmcgY29uZmlndXJhdGlvbiByZWxvYWRpbmcuCisKK1doZW4gdGhlICdjaHJvb3QnIG9wdGlvbiBpcyB1c2VkLCBCPHN0dW5uZWw+IHdpbGwgbG9vayBmb3IgYWxsIGl0cyBmaWxlcyAoaW5jbHVkaW5nCit0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBjZXJ0aWZpY2F0ZXMsIHRoZSBsb2cgZmlsZSBhbmQgdGhlIHBpZCBmaWxlKSB3aXRoaW4gdGhlIGNocm9vdAoramFpbC4KKworPWl0ZW0gU0lHVVNSMQorCitDbG9zZSBhbmQgcmVvcGVuIHRoZSBCPHN0dW5uZWw+IGxvZyBmaWxlLgorVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgbG9nIHJvdGF0aW9uLgorCis9aXRlbSBTSUdURVJNLCBTSUdRVUlULCBTSUdJTlQKKworU2h1dCBCPHN0dW5uZWw+IGRvd24uCisKKz1iYWNrCisKK1RoZSByZXN1bHQgb2Ygc2VuZGluZyBhbnkgb3RoZXIgc2lnbmFscyB0byB0aGUgc2VydmVyIGlzIHVuZGVmaW5lZC4KKworCis9aGVhZDEgRVhBTVBMRVMKKworSW4gb3JkZXIgdG8gcHJvdmlkZSBTU0wgZW5jYXBzdWxhdGlvbiB0byB5b3VyIGxvY2FsIEk8aW1hcGQ+IHNlcnZpY2UsIHVzZToKKworICAgIFtpbWFwZF0KKyAgICBhY2NlcHQgPSA5OTMKKyAgICBleGVjID0gL3Vzci9zYmluL2ltYXBkCisgICAgZXhlY0FyZ3MgPSBpbWFwZAorCitvciBpbiByZW1vdGUgbW9kZToKKworICAgIFtpbWFwZF0KKyAgICBhY2NlcHQgPSA5OTMKKyAgICBjb25uZWN0ID0gMTQzCisKK0luIG9yZGVyIHRvIGxldCB5b3VyIGxvY2FsIGUtbWFpbCBjbGllbnQgY29ubmVjdCB0byBhbiBTU0wtZW5hYmxlZCBJPGltYXBkPgorc2VydmljZSBvbiBhbm90aGVyIHNlcnZlciwgY29uZmlndXJlIHRoZSBlLW1haWwgY2xpZW50IHRvIGNvbm5lY3QgdG8gbG9jYWxob3N0CitvbiBwb3J0IDExOSBhbmQgdXNlOgorCisgICAgW2ltYXBdCisgICAgY2xpZW50ID0geWVzCisgICAgYWNjZXB0ID0gMTQzCisgICAgY29ubmVjdCA9IHNlcnZlcm5hbWU6OTkzCisKK0lmIHlvdSB3YW50IHRvIHByb3ZpZGUgdHVubmVsaW5nIHRvIHlvdXIgSTxwcHBkPiBkYWVtb24gb24gcG9ydCAyMDIwLAordXNlIHNvbWV0aGluZyBsaWtlOgorCisgICAgW3Zwbl0KKyAgICBhY2NlcHQgPSAyMDIwCisgICAgZXhlYyA9IC91c3Ivc2Jpbi9wcHBkCisgICAgZXhlY0FyZ3MgPSBwcHBkIGxvY2FsCisgICAgcHR5ID0geWVzCisKK0lmIHlvdSB3YW50IHRvIHVzZSBCPHN0dW5uZWw+IGluIEk8aW5ldGQ+IG1vZGUgdG8gbGF1bmNoIHlvdXIgaW1hcGQKK3Byb2Nlc3MsIHlvdSdkIHVzZSB0aGlzIEk8c3R1bm5lbC5jb25mPi4KK05vdGUgdGhlcmUgbXVzdCBiZSBubyBJPFtzZXJ2aWNlX25hbWVdPiBzZWN0aW9uLgorCisgICAgZXhlYyA9IC91c3Ivc2Jpbi9pbWFwZAorICAgIGV4ZWNBcmdzID0gaW1hcGQKKworVG8gc2V0dXAgU09DS1MgVlBOIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nIGNsaWVudCBzZXJ2aWNlOgorCisgICAgW3NvY2tzX2NsaWVudF0KKyAgICBjbGllbnQgPSB5ZXMKKyAgICBhY2NlcHQgPSAxMjcuMC4wLjE6MTA4MAorICAgIGNvbm5lY3QgPSB2cG5fc2VydmVyOjkwODAKKyAgICB2ZXJpZnkgPSA0CisgICAgQ0FmaWxlID0gc3R1bm5lbC5wZW0KKworVGhlIGNvcnJlc3BvbmRpbmcgY29uZmlndXJhdGlvbiBvbiB0aGUgdnBuX3NlcnZlciBob3N0OgorCisgICAgW3NvY2tzX3NlcnZlcl0KKyAgICBwcm90b2NvbCA9IHNvY2tzCisgICAgYWNjZXB0ID0gOTA4MAorICAgIGNlcnQgPSBzdHVubmVsLnBlbQorICAgIGtleSA9IHN0dW5uZWwua2V5CisKK05vdyB0ZXN0IHlvdXIgY29uZmlndXJhdGlvbiBvbiB0aGUgY2xpZW50IG1hY2hpbmUgd2l0aDoKKworICAgIGN1cmwgLS1zb2NrczRhIGxvY2FsaG9zdCBodHRwOi8vd3d3LmV4YW1wbGUuY29tLworCis9aGVhZDEgTk9URVMKKworPWhlYWQyIFJFU1RSSUNUSU9OUworCitCPHN0dW5uZWw+IGNhbm5vdCBiZSB1c2VkIGZvciB0aGUgRlRQIGRhZW1vbiBiZWNhdXNlIG9mIHRoZSBuYXR1cmUKK29mIHRoZSBGVFAgcHJvdG9jb2wgd2hpY2ggdXRpbGl6ZXMgbXVsdGlwbGUgcG9ydHMgZm9yIGRhdGEgdHJhbnNmZXJzLgorVGhlcmUgYXJlIGF2YWlsYWJsZSBTU0wtZW5hYmxlZCB2ZXJzaW9ucyBvZiBGVFAgYW5kIHRlbG5ldCBkYWVtb25zLCBob3dldmVyLgorCisKKz1oZWFkMiBJTkVURCBNT0RFCisKK1RoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgQjxzdHVubmVsPiBpcyB0byBsaXN0ZW4gb24gYSBuZXR3b3JrCitwb3J0IGFuZCBlc3RhYmxpc2ggY29tbXVuaWNhdGlvbiB3aXRoIGVpdGhlciBhIG5ldyBwb3J0Cit2aWEgdGhlIGNvbm5lY3Qgb3B0aW9uLCBvciBhIG5ldyBwcm9ncmFtIHZpYSB0aGUgSTxleGVjPiBvcHRpb24uCitIb3dldmVyIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoZW4geW91IHdpc2ggdG8gaGF2ZQorc29tZSBvdGhlciBwcm9ncmFtIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQKK2xhdW5jaCBCPHN0dW5uZWw+LCBmb3IgZXhhbXBsZSB3aXRoIEk8aW5ldGQ+LCBJPHhpbmV0ZD4sCitvciBJPHRjcHNlcnZlcj4uCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gSTxpbmV0ZC5jb25mPjoKKworICAgIGltYXBzIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgQGJpbmRpckAvc3R1bm5lbCBzdHVubmVsIEBzeXNjb25mZGlyQC9zdHVubmVsL2ltYXBzLmNvbmYKKworSW4gdGhlc2UgY2FzZXMsIHRoZSBJPGluZXRkPi1zdHlsZSBwcm9ncmFtIGlzIHJlc3BvbnNpYmxlCitmb3IgYmluZGluZyBhIG5ldHdvcmsgc29ja2V0IChJPGltYXBzPiBhYm92ZSkgYW5kIGhhbmRpbmcKK2l0IHRvIEI8c3R1bm5lbD4gd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmVjZWl2ZWQuCitUaHVzIHlvdSBkbyBub3Qgd2FudCBCPHN0dW5uZWw+IHRvIGhhdmUgYW55IEk8YWNjZXB0PiBvcHRpb24uCitBbGwgdGhlIEk8U2VydmljZSBMZXZlbCBPcHRpb25zPiBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQorZ2xvYmFsIG9wdGlvbnMgc2VjdGlvbiwgYW5kIG5vIEk8W3NlcnZpY2VfbmFtZV0+IHNlY3Rpb24KK3dpbGwgYmUgcHJlc2VudC4gIFNlZSB0aGUgSTxFWEFNUExFUz4gc2VjdGlvbiBmb3IgZXhhbXBsZQorY29uZmlndXJhdGlvbnMuCisKKz1oZWFkMiBDRVJUSUZJQ0FURVMKKworRWFjaCBTU0wtZW5hYmxlZCBkYWVtb24gbmVlZHMgdG8gcHJlc2VudCBhIHZhbGlkIFguNTA5IGNlcnRpZmljYXRlCit0byB0aGUgcGVlci4gSXQgYWxzbyBuZWVkcyBhIHByaXZhdGUga2V5IHRvIGRlY3J5cHQgdGhlIGluY29taW5nCitkYXRhLiBUaGUgZWFzaWVzdCB3YXkgdG8gb2J0YWluIGEgY2VydGlmaWNhdGUgYW5kIGEga2V5IGlzIHRvIAorZ2VuZXJhdGUgdGhlbSB3aXRoIHRoZSBmcmVlIEI8T3BlblNTTD4gcGFja2FnZS4gWW91IGNhbiBmaW5kIG1vcmUKK2luZm9ybWF0aW9uIG9uIGNlcnRpZmljYXRlcyBnZW5lcmF0aW9uIG9uIHBhZ2VzIGxpc3RlZCBiZWxvdy4KKworVGhlIG9yZGVyIG9mIGNvbnRlbnRzIG9mIHRoZSBJPC5wZW0+IGZpbGUgaXMgaW1wb3J0YW50LiAgSXQgc2hvdWxkIGNvbnRhaW4gdGhlCit1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmaXJzdCwgdGhlbiBhIHNpZ25lZCBjZXJ0aWZpY2F0ZSAobm90IGNlcnRpZmljYXRlCityZXF1ZXN0KS4gIFRoZXJlIHNob3VsZCBhbHNvIGJlIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHByaXZhdGUga2V5LgorQW55IHBsYWludGV4dCBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiBhcHBlbmRlZCBvbiB0aGUgdG9wIG9mIGdlbmVyYXRlZCBjZXJ0aWZpY2F0ZQorc2hvdWxkIGJlIGRpc2NhcmRlZC4gU28gdGhlIGZpbGUgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisgICAgLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFtlbmNvZGVkIGtleV0KKyAgICAtLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorICAgIFtlbXB0eSBsaW5lXQorICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorICAgIFtlbmNvZGVkIGNlcnRpZmljYXRlXQorICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAgICBbZW1wdHkgbGluZV0KKworPWhlYWQyIFJBTkRPTU5FU1MKKworQjxzdHVubmVsPiBuZWVkcyB0byBzZWVkIHRoZSBQUk5HIChwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpIGluCitvcmRlciBmb3IgU1NMIHRvIHVzZSBnb29kIHJhbmRvbW5lc3MuICBUaGUgZm9sbG93aW5nIHNvdXJjZXMgYXJlIGxvYWRlZAoraW4gb3JkZXIgdW50aWwgc3VmZmljaWVudCByYW5kb20gZGF0YSBoYXMgYmVlbiBnYXRoZXJlZDoKKworPW92ZXIgNAorCis9aXRlbSAqCisKK1RoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSBJPFJORGZpbGU+IGZsYWcuCisKKz1pdGVtICoKKworVGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBSQU5ERklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LgorCis9aXRlbSAqCisKK1RoZSBmaWxlIC5ybmQgaW4geW91ciBob21lIGRpcmVjdG9yeSwgaWYgUkFOREZJTEUgbm90IHNldC4KKworPWl0ZW0gKgorCitUaGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAnLS13aXRoLXJhbmRvbScgYXQgY29tcGlsZSB0aW1lLgorCis9aXRlbSAqCisKK1RoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuIGlmIHJ1bm5pbmcgb24gV2luZG93cy4KKworPWl0ZW0gKgorCitUaGUgZWdkIHNvY2tldCBzcGVjaWZpZWQgd2l0aCB0aGUgSTxFR0Q+IGZsYWcuCisKKz1pdGVtICoKKworVGhlIGVnZCBzb2NrZXQgc3BlY2lmaWVkIHdpdGggJy0td2l0aC1lZ2Qtc29jaycgYXQgY29tcGlsZSB0aW1lLgorCis9aXRlbSAqCisKK1RoZSAvZGV2L3VyYW5kb20gZGV2aWNlLgorCis9YmFjaworCitXaXRoIHJlY2VudCAoQjxPcGVuU1NMIDAuOS41YT4gb3IgbGF0ZXIpIHZlcnNpb24gb2YgU1NMIGl0IHdpbGwgc3RvcCBsb2FkaW5nCityYW5kb20gZGF0YSBhdXRvbWF0aWNhbGx5IHdoZW4gc3VmZmljaWVudCBlbnRyb3B5IGhhcyBiZWVuIGdhdGhlcmVkLiAgV2l0aAorcHJldmlvdXMgdmVyc2lvbnMgaXQgd2lsbCBjb250aW51ZSB0byBnYXRoZXIgZnJvbSBhbGwgdGhlIGFib3ZlIHNvdXJjZXMgc2luY2UKK25vIFNTTCBmdW5jdGlvbiBleGlzdHMgdG8gdGVsbCB3aGVuIGVub3VnaCBkYXRhIGlzIGF2YWlsYWJsZS4KKworTm90ZSB0aGF0IG9uIFdpbmRvd3MgbWFjaGluZXMgdGhhdCBkbyBub3QgaGF2ZSBjb25zb2xlIHVzZXIgaW50ZXJhY3Rpb24KKyhtb3VzZSBtb3ZlbWVudHMsIGNyZWF0aW5nIHdpbmRvd3MsIGV0Yy4pIHRoZSBzY3JlZW4gY29udGVudHMgYXJlIG5vdAordmFyaWFibGUgZW5vdWdoIHRvIGJlIHN1ZmZpY2llbnQsIGFuZCB5b3Ugc2hvdWxkIHByb3ZpZGUgYSByYW5kb20gZmlsZQorZm9yIHVzZSB3aXRoIHRoZSBJPFJORGZpbGU+IGZsYWcuCisKK05vdGUgdGhhdCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgSTxSTkRmaWxlPiBmbGFnIHNob3VsZCBjb250YWluCityYW5kb20gZGF0YSAtLSB0aGF0IG1lYW5zIGl0IHNob3VsZCBjb250YWluIGRpZmZlcmVudCBpbmZvcm1hdGlvbgorZWFjaCB0aW1lIEI8c3R1bm5lbD4gaXMgcnVuLiAgVGhpcyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKK3VubGVzcyB0aGUgSTxSTkRvdmVyd3JpdGU+IGZsYWcgaXMgdXNlZC4gIElmIHlvdSB3aXNoIHRvIHVwZGF0ZSB0aGlzIGZpbGUKK21hbnVhbGx5LCB0aGUgSTxvcGVuc3NsIHJhbmQ+IGNvbW1hbmQgaW4gcmVjZW50IHZlcnNpb25zIG9mIEI8T3BlblNTTD4sCit3b3VsZCBiZSB1c2VmdWwuCisKK0ltcG9ydGFudCBub3RlOiBJZiAvZGV2L3VyYW5kb20gaXMgYXZhaWxhYmxlLCBCPE9wZW5TU0w+IG9mdGVuIHNlZWRzIHRoZSBQUk5HCit3aXRoIGl0IHdoaWxlIGNoZWNraW5nIHRoZSByYW5kb20gc3RhdGUuICBPbiBzeXN0ZW1zIHdpdGggL2Rldi91cmFuZG9tCitCPE9wZW5TU0w+IGlzIGxpa2VseSB0byB1c2UgaXQgZXZlbiB0aG91Z2ggaXQgaXMgbGlzdGVkIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZgordGhlIGxpc3QgYWJvdmUuICBUaGlzIGlzIHRoZSBiZWhhdmlvdXIgb2YgQjxPcGVuU1NMPiBhbmQgbm90IEI8c3R1bm5lbD4uCisKKz1oZWFkMiBESCBQQVJBTUVURVJTCisKK0I8c3R1bm5lbD4gNC40MCBhbmQgbGF0ZXIgY29udGFpbnMgaGFyZGNvZGVkIDIwNDgtYml0IERIIHBhcmFtZXRlcnMuICBTdGFydGluZword2l0aCBCPHN0dW5uZWw+IDUuMTgsIHRoZXNlIGhhcmRjb2RlZCBESCBwYXJhbWV0ZXJzIGFyZSByZXBsYWNlZCBldmVyeSAyNCBob3Vycword2l0aCBhdXRvZ2VuZXJhdGVkIHRlbXBvcmFyeSBESCBwYXJhbWV0ZXJzLiAgREggcGFyYW1ldGVyIGdlbmVyYXRpb24gbWF5IHRha2UKK3NldmVyYWwgbWludXRlcy4KKworQWx0ZXJuYXRpdmVseSwgaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBzdGF0aWMgREggcGFyYW1ldGVycyBpbiB0aGUKK2NlcnRpZmljYXRlIGZpbGUsIHdoaWNoIGRpc2FibGVzIGdlbmVyYXRpbmcgdGVtcG9yYXJ5IERIIHBhcmFtZXRlcnM6CisKKyAgICBvcGVuc3NsIGRocGFyYW0gMjA0OCA+PiBzdHVubmVsLnBlbQorCisKKz1oZWFkMSBGSUxFUworCis9b3ZlciA0CisKKz1pdGVtIEY8QHN5c2NvbmZkaXJAL3N0dW5uZWwvc3R1bm5lbC5jb25mPgorCitCPHN0dW5uZWw+IGNvbmZpZ3VyYXRpb24gZmlsZQorCis9YmFjaworCisKKz1oZWFkMSBCVUdTCisKK1RoZSBJPGV4ZWNBcmdzPiBvcHRpb24gYW5kIHRoZSBXaW4zMiBjb21tYW5kIGxpbmUgZG8gbm90IHN1cHBvcnQgcXVvdGluZy4KKworCis9aGVhZDEgU0VFIEFMU08KKworPW92ZXIgNAorCis9aXRlbSBMPHRjcGQoOCk+CisKK2FjY2VzcyBjb250cm9sIGZhY2lsaXR5IGZvciBpbnRlcm5ldCBzZXJ2aWNlcworCis9aXRlbSBMPGluZXRkKDgpPgorCitpbnRlcm5ldCAnc3VwZXItc2VydmVyJworCis9aXRlbSBGPGh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvPgorCitCPHN0dW5uZWw+IGhvbWVwYWdlCisKKz1pdGVtIEY8aHR0cDovL3d3dy5vcGVuc3NsLm9yZy8+CisKK0I8T3BlblNTTD4gcHJvamVjdCB3ZWJzaXRlCisKKz1iYWNrCisKKworPWhlYWQxIEFVVEhPUgorCis9b3ZlciA0CisKKz1pdGVtIE1pY2hhxYIgVHJvam5hcmEKKworPEY8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0Pj4KKworPWJhY2sKKworPWZvciBjb21tZW50Cit2aW06c3BlbGxsYW5nPWVuOnNwZWxsCmRpZmYgLS1naXQgYS9tNC9heF9hcHBlbmRfY29tcGlsZV9mbGFncy5tNCBiL200L2F4X2FwcGVuZF9jb21waWxlX2ZsYWdzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2I4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9hcHBlbmRfY29tcGlsZV9mbGFncy5tNApAQCAtMCwwICsxLDY1IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYXBwZW5kX2NvbXBpbGVfZmxhZ3MuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9BUFBFTkRfQ09NUElMRV9GTEFHUyhbRkxBRzEgRkxBRzIgLi4uXSwgW0ZMQUdTLVZBUklBQkxFXSwgW0VYVFJBLUZMQUdTXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBGb3IgZXZlcnkgRkxBRzEsIEZMQUcyIGl0IGlzIGNoZWNrZWQgd2hldGhlciB0aGUgY29tcGlsZXIgd29ya3Mgd2l0aCB0aGUKKyMgICBmbGFnLiAgSWYgaXQgZG9lcywgdGhlIGZsYWcgaXMgYWRkZWQgRkxBR1MtVkFSSUFCTEUKKyMKKyMgICBJZiBGTEFHUy1WQVJJQUJMRSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBsYW5ndWFnZSdzIGZsYWdzIChlLmcuCisjICAgQ0ZMQUdTKSBpcyB1c2VkLiAgRHVyaW5nIHRoZSBjaGVjayB0aGUgZmxhZyBpcyBhbHdheXMgYWRkZWQgdG8gdGhlCisjICAgY3VycmVudCBsYW5ndWFnZSdzIGZsYWdzLgorIworIyAgIElmIEVYVFJBLUZMQUdTIGlzIGRlZmluZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MgZGVmYXVsdAorIyAgIGZsYWdzIChlLmcuIENGTEFHUykgd2hlbiB0aGUgY2hlY2sgaXMgZG9uZS4gIFRoZSBjaGVjayBpcyB0aHVzIG1hZGUgd2l0aAorIyAgIHRoZSBmbGFnczogIkNGTEFHUyBFWFRSQS1GTEFHUyBGTEFHIi4gIFRoaXMgY2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8KKyMgICBmb3JjZSB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYW4gZXJyb3Igd2hlbiBhIGJhZCBmbGFnIGlzIGdpdmVuLgorIworIyAgIE5PVEU6IFRoaXMgbWFjcm8gZGVwZW5kcyBvbiB0aGUgQVhfQVBQRU5EX0ZMQUcgYW5kCisjICAgQVhfQ0hFQ0tfQ09NUElMRV9GTEFHLiBQbGVhc2Uga2VlcCB0aGlzIG1hY3JvIGluIHN5bmMgd2l0aAorIyAgIEFYX0FQUEVORF9MSU5LX0ZMQUdTLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDExIE1hYXJ0ZW4gQm9zbWFucyA8bWtib3NtYW5zQGdtYWlsLmNvbT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgNAorCitBQ19ERUZVTihbQVhfQVBQRU5EX0NPTVBJTEVfRkxBR1NdLAorW0FYX1JFUVVJUkVfREVGSU5FRChbQVhfQ0hFQ0tfQ09NUElMRV9GTEFHXSkKK0FYX1JFUVVJUkVfREVGSU5FRChbQVhfQVBQRU5EX0ZMQUddKQorZm9yIGZsYWcgaW4gJDE7IGRvCisgIEFYX0NIRUNLX0NPTVBJTEVfRkxBRyhbJGZsYWddLCBbQVhfQVBQRU5EX0ZMQUcoWyRmbGFnXSwgWyQyXSldLCBbXSwgWyQzXSkKK2RvbmUKK10pZG5sIEFYX0FQUEVORF9DT01QSUxFX0ZMQUdTCmRpZmYgLS1naXQgYS9tNC9heF9hcHBlbmRfZmxhZy5tNCBiL200L2F4X2FwcGVuZF9mbGFnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzhiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9hcHBlbmRfZmxhZy5tNApAQCAtMCwwICsxLDY5IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2FwcGVuZF9mbGFnLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQVBQRU5EX0ZMQUcoRkxBRywgW0ZMQUdTLVZBUklBQkxFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBGTEFHIGlzIGFwcGVuZGVkIHRvIHRoZSBGTEFHUy1WQVJJQUJMRSBzaGVsbCB2YXJpYWJsZSwgd2l0aCBhIHNwYWNlCisjICAgYWRkZWQgaW4gYmV0d2Vlbi4KKyMKKyMgICBJZiBGTEFHUy1WQVJJQUJMRSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBsYW5ndWFnZSdzIGZsYWdzIChlLmcuCisjICAgQ0ZMQUdTKSBpcyB1c2VkLiAgRkxBR1MtVkFSSUFCTEUgaXMgbm90IGNoYW5nZWQgaWYgaXQgYWxyZWFkeSBjb250YWlucworIyAgIEZMQUcuICBJZiBGTEFHUy1WQVJJQUJMRSBpcyB1bnNldCBpbiB0aGUgc2hlbGwsIGl0IGlzIHNldCB0byBleGFjdGx5CisjICAgRkxBRy4KKyMKKyMgICBOT1RFOiBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBBWF9DRkxBR1NfR0NDX09QVElPTi4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBHdWlkbyBVLiBEcmFoZWltIDxndWlkb2RAZ214LmRlPgorIyAgIENvcHlyaWdodCAoYykgMjAxMSBNYWFydGVuIEJvc21hbnMgPG1rYm9zbWFuc0BnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX0FQUEVORF9GTEFHXSwKK1tBQ19QUkVSRVEoMi41OSlkbmwgZm9yIF9BQ19MQU5HX1BSRUZJWAorQVNfVkFSX1BVU0hERUYoW0ZMQUdTXSwgW200X2RlZmF1bHQoJDIsX0FDX0xBTkdfUFJFRklYW0ZMQUdTXSldKWRubAorQVNfVkFSX1NFVF9JRihGTEFHUywKKyAgW2Nhc2UgIiBBU19WQVJfR0VUKEZMQUdTKSAiIGluCisgICAgKiIgJDEgIiopCisgICAgICBBQ19SVU5fTE9HKFs6IEZMQUdTIGFscmVhZHkgY29udGFpbnMgJDFdKQorICAgICAgOzsKKyAgICAqKQorICAgICAgQUNfUlVOX0xPRyhbOiBGTEFHUz0iJEZMQUdTICQxIl0pCisgICAgICBBU19WQVJfU0VUKEZMQUdTLCBbIkFTX1ZBUl9HRVQoRkxBR1MpICQxIl0pCisgICAgICA7OworICAgZXNhY10sCisgIFtBU19WQVJfU0VUKEZMQUdTLFsiJDEiXSldKQorQVNfVkFSX1BPUERFRihbRkxBR1NdKWRubAorXSlkbmwgQVhfQVBQRU5EX0ZMQUcKZGlmZiAtLWdpdCBhL200L2F4X2FwcGVuZF9saW5rX2ZsYWdzLm00IGIvbTQvYXhfYXBwZW5kX2xpbmtfZmxhZ3MubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczZGRhZgotLS0gL2Rldi9udWxsCisrKyBiL200L2F4X2FwcGVuZF9saW5rX2ZsYWdzLm00CkBAIC0wLDAgKzEsNjMgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYXBwZW5kX2xpbmtfZmxhZ3MuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9BUFBFTkRfTElOS19GTEFHUyhbRkxBRzEgRkxBRzIgLi4uXSwgW0ZMQUdTLVZBUklBQkxFXSwgW0VYVFJBLUZMQUdTXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBGb3IgZXZlcnkgRkxBRzEsIEZMQUcyIGl0IGlzIGNoZWNrZWQgd2hldGhlciB0aGUgbGlua2VyIHdvcmtzIHdpdGggdGhlCisjICAgZmxhZy4gIElmIGl0IGRvZXMsIHRoZSBmbGFnIGlzIGFkZGVkIEZMQUdTLVZBUklBQkxFCisjCisjICAgSWYgRkxBR1MtVkFSSUFCTEUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGxpbmtlcidzIGZsYWdzIChMREZMQUdTKSBpcworIyAgIHVzZWQuIER1cmluZyB0aGUgY2hlY2sgdGhlIGZsYWcgaXMgYWx3YXlzIGFkZGVkIHRvIHRoZSBsaW5rZXIncyBmbGFncy4KKyMKKyMgICBJZiBFWFRSQS1GTEFHUyBpcyBkZWZpbmVkLCBpdCBpcyBhZGRlZCB0byB0aGUgbGlua2VyJ3MgZGVmYXVsdCBmbGFncworIyAgIHdoZW4gdGhlIGNoZWNrIGlzIGRvbmUuICBUaGUgY2hlY2sgaXMgdGh1cyBtYWRlIHdpdGggdGhlIGZsYWdzOiAiTERGTEFHUworIyAgIEVYVFJBLUZMQUdTIEZMQUciLiAgVGhpcyBjYW4gZm9yIGV4YW1wbGUgYmUgdXNlZCB0byBmb3JjZSB0aGUgbGlua2VyIHRvCisjICAgaXNzdWUgYW4gZXJyb3Igd2hlbiBhIGJhZCBmbGFnIGlzIGdpdmVuLgorIworIyAgIE5PVEU6IFRoaXMgbWFjcm8gZGVwZW5kcyBvbiB0aGUgQVhfQVBQRU5EX0ZMQUcgYW5kIEFYX0NIRUNLX0xJTktfRkxBRy4KKyMgICBQbGVhc2Uga2VlcCB0aGlzIG1hY3JvIGluIHN5bmMgd2l0aCBBWF9BUFBFTkRfQ09NUElMRV9GTEFHUy4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxMSBNYWFydGVuIEJvc21hbnMgPG1rYm9zbWFuc0BnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDQKKworQUNfREVGVU4oW0FYX0FQUEVORF9MSU5LX0ZMQUdTXSwKK1tBWF9SRVFVSVJFX0RFRklORUQoW0FYX0NIRUNLX0xJTktfRkxBR10pCitBWF9SRVFVSVJFX0RFRklORUQoW0FYX0FQUEVORF9GTEFHXSkKK2ZvciBmbGFnIGluICQxOyBkbworICBBWF9DSEVDS19MSU5LX0ZMQUcoWyRmbGFnXSwgW0FYX0FQUEVORF9GTEFHKFskZmxhZ10sIFttNF9kZWZhdWx0KFskMl0sIFtMREZMQUdTXSldKV0sIFtdLCBbJDNdKQorZG9uZQorXSlkbmwgQVhfQVBQRU5EX0xJTktfRkxBR1MKZGlmZiAtLWdpdCBhL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBiL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWRmMGMwCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXhfY2hlY2tfY29tcGlsZV9mbGFnLm00CkBAIC0wLDAgKzEsNzQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfY29tcGlsZV9mbGFnLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ0hFQ0tfQ09NUElMRV9GTEFHKEZMQUcsIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0sIFtFWFRSQS1GTEFHU10sIFtJTlBVVF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gRkxBRyB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MgY29tcGlsZXIKKyMgICBvciBnaXZlcyBhbiBlcnJvci4gIChXYXJuaW5ncywgaG93ZXZlciwgYXJlIGlnbm9yZWQpCisjCisjICAgQUNUSU9OLVNVQ0NFU1MvQUNUSU9OLUZBSUxVUkUgYXJlIHNoZWxsIGNvbW1hbmRzIHRvIGV4ZWN1dGUgb24KKyMgICBzdWNjZXNzL2ZhaWx1cmUuCisjCisjICAgSWYgRVhUUkEtRkxBR1MgaXMgZGVmaW5lZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UncyBkZWZhdWx0CisjICAgZmxhZ3MgKGUuZy4gQ0ZMQUdTKSB3aGVuIHRoZSBjaGVjayBpcyBkb25lLiAgVGhlIGNoZWNrIGlzIHRodXMgbWFkZSB3aXRoCisjICAgdGhlIGZsYWdzOiAiQ0ZMQUdTIEVYVFJBLUZMQUdTIEZMQUciLiAgVGhpcyBjYW4gZm9yIGV4YW1wbGUgYmUgdXNlZCB0bworIyAgIGZvcmNlIHRoZSBjb21waWxlciB0byBpc3N1ZSBhbiBlcnJvciB3aGVuIGEgYmFkIGZsYWcgaXMgZ2l2ZW4uCisjCisjICAgSU5QVVQgZ2l2ZXMgYW4gYWx0ZXJuYXRpdmUgaW5wdXQgc291cmNlIHRvIEFDX0NPTVBJTEVfSUZFTFNFLgorIworIyAgIE5PVEU6IEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEFYX0NGTEFHU19HQ0NfT1BUSU9OLiBQbGVhc2Uga2VlcCB0aGlzCisjICAgbWFjcm8gaW4gc3luYyB3aXRoIEFYX0NIRUNLX3tQUkVQUk9DLExJTkt9X0ZMQUcuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggR3VpZG8gVS4gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTEgTWFhcnRlbiBCb3NtYW5zIDxta2Jvc21hbnNAZ21haWwuY29tPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCAzCisKK0FDX0RFRlVOKFtBWF9DSEVDS19DT01QSUxFX0ZMQUddLAorW0FDX1BSRVJFUSgyLjU5KWRubCBmb3IgX0FDX0xBTkdfUFJFRklYCitBU19WQVJfUFVTSERFRihbQ0FDSEVWQVJdLFtheF9jdl9jaGVja19bXV9BQ19MQU5HX0FCQlJFVltdZmxhZ3NfJDRfJDFdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgX0FDX0xBTkcgY29tcGlsZXIgYWNjZXB0cyAkMV0sIENBQ0hFVkFSLCBbCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUworICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSIkW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTICQ0ICQxIgorICBBQ19DT01QSUxFX0lGRUxTRShbbTRfZGVmYXVsdChbJDVdLFtBQ19MQU5HX1BST0dSQU0oKV0pXSwKKyAgICBbQVNfVkFSX1NFVChDQUNIRVZBUixbeWVzXSldLAorICAgIFtBU19WQVJfU0VUKENBQ0hFVkFSLFtub10pXSkKKyAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYXhfY2hlY2tfc2F2ZV9mbGFnc10pCitBU19JRihbdGVzdCB4IkFTX1ZBUl9HRVQoQ0FDSEVWQVIpIiA9IHh5ZXNdLAorICBbbTRfZGVmYXVsdChbJDJdLCA6KV0sCisgIFttNF9kZWZhdWx0KFskM10sIDopXSkKK0FTX1ZBUl9QT1BERUYoW0NBQ0hFVkFSXSlkbmwKK10pZG5sIEFYX0NIRUNLX0NPTVBJTEVfRkxBR1MKZGlmZiAtLWdpdCBhL200L2F4X2NoZWNrX2xpbmtfZmxhZy5tNCBiL200L2F4X2NoZWNrX2xpbmtfZmxhZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjg5OWRkCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXhfY2hlY2tfbGlua19mbGFnLm00CkBAIC0wLDAgKzEsNzMgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NoZWNrX2xpbmtfZmxhZy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NIRUNLX0xJTktfRkxBRyhGTEFHLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdLCBbRVhUUkEtRkxBR1NdLCBbSU5QVVRdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIEZMQUcgd29ya3Mgd2l0aCB0aGUgbGlua2VyIG9yIGdpdmVzIGFuIGVycm9yLgorIyAgIChXYXJuaW5ncywgaG93ZXZlciwgYXJlIGlnbm9yZWQpCisjCisjICAgQUNUSU9OLVNVQ0NFU1MvQUNUSU9OLUZBSUxVUkUgYXJlIHNoZWxsIGNvbW1hbmRzIHRvIGV4ZWN1dGUgb24KKyMgICBzdWNjZXNzL2ZhaWx1cmUuCisjCisjICAgSWYgRVhUUkEtRkxBR1MgaXMgZGVmaW5lZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGxpbmtlcidzIGRlZmF1bHQgZmxhZ3MKKyMgICB3aGVuIHRoZSBjaGVjayBpcyBkb25lLiAgVGhlIGNoZWNrIGlzIHRodXMgbWFkZSB3aXRoIHRoZSBmbGFnczogIkxERkxBR1MKKyMgICBFWFRSQS1GTEFHUyBGTEFHIi4gIFRoaXMgY2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZm9yY2UgdGhlIGxpbmtlciB0bworIyAgIGlzc3VlIGFuIGVycm9yIHdoZW4gYSBiYWQgZmxhZyBpcyBnaXZlbi4KKyMKKyMgICBJTlBVVCBnaXZlcyBhbiBhbHRlcm5hdGl2ZSBpbnB1dCBzb3VyY2UgdG8gQUNfTElOS19JRkVMU0UuCisjCisjICAgTk9URTogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gQVhfQ0ZMQUdTX0dDQ19PUFRJT04uIFBsZWFzZSBrZWVwIHRoaXMKKyMgICBtYWNybyBpbiBzeW5jIHdpdGggQVhfQ0hFQ0tfe1BSRVBST0MsQ09NUElMRX1fRkxBRy4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBHdWlkbyBVLiBEcmFoZWltIDxndWlkb2RAZ214LmRlPgorIyAgIENvcHlyaWdodCAoYykgMjAxMSBNYWFydGVuIEJvc21hbnMgPG1rYm9zbWFuc0BnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDMKKworQUNfREVGVU4oW0FYX0NIRUNLX0xJTktfRkxBR10sCitbQVNfVkFSX1BVU0hERUYoW0NBQ0hFVkFSXSxbYXhfY3ZfY2hlY2tfbGRmbGFnc18kNF8kMV0pZG5sCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgbGlua2VyIGFjY2VwdHMgJDFdLCBDQUNIRVZBUiwgWworICBheF9jaGVja19zYXZlX2ZsYWdzPSRMREZMQUdTCisgIExERkxBR1M9IiRMREZMQUdTICQ0ICQxIgorICBBQ19MSU5LX0lGRUxTRShbbTRfZGVmYXVsdChbJDVdLFtBQ19MQU5HX1BST0dSQU0oKV0pXSwKKyAgICBbQVNfVkFSX1NFVChDQUNIRVZBUixbeWVzXSldLAorICAgIFtBU19WQVJfU0VUKENBQ0hFVkFSLFtub10pXSkKKyAgTERGTEFHUz0kYXhfY2hlY2tfc2F2ZV9mbGFnc10pCitBU19JRihbdGVzdCB4IkFTX1ZBUl9HRVQoQ0FDSEVWQVIpIiA9IHh5ZXNdLAorICBbbTRfZGVmYXVsdChbJDJdLCA6KV0sCisgIFttNF9kZWZhdWx0KFskM10sIDopXSkKK0FTX1ZBUl9QT1BERUYoW0NBQ0hFVkFSXSlkbmwKK10pZG5sIEFYX0NIRUNLX0xJTktfRkxBR1MKZGlmZiAtLWdpdCBhL200L2F4X3B0aHJlYWQubTQgYi9tNC9heF9wdGhyZWFkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODNhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9wdGhyZWFkLm00CkBAIC0wLDAgKzEsMzMyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHRocmVhZC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BUSFJFQUQoW0FDVElPTi1JRi1GT1VORFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIGZpZ3VyZXMgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMuIEl0CisjICAgc2V0cyB0aGUgUFRIUkVBRF9MSUJTIG91dHB1dCB2YXJpYWJsZSB0byB0aGUgdGhyZWFkcyBsaWJyYXJ5IGFuZCBsaW5rZXIKKyMgICBmbGFncywgYW5kIHRoZSBQVEhSRUFEX0NGTEFHUyBvdXRwdXQgdmFyaWFibGUgdG8gYW55IHNwZWNpYWwgQyBjb21waWxlcgorIyAgIGZsYWdzIHRoYXQgYXJlIG5lZWRlZC4gKFRoZSB1c2VyIGNhbiBhbHNvIGZvcmNlIGNlcnRhaW4gY29tcGlsZXIKKyMgICBmbGFncy9saWJzIHRvIGJlIHRlc3RlZCBieSBzZXR0aW5nIHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcy4pCisjCisjICAgQWxzbyBzZXRzIFBUSFJFQURfQ0MgdG8gYW55IHNwZWNpYWwgQyBjb21waWxlciB0aGF0IGlzIG5lZWRlZCBmb3IKKyMgICBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcyAoZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIENDIG90aGVyd2lzZSkuIChUaGlzCisjICAgaXMgbmVjZXNzYXJ5IG9uIEFJWCB0byB1c2UgdGhlIHNwZWNpYWwgY2NfciBjb21waWxlciBhbGlhcy4pCisjCisjICAgTk9URTogWW91IGFyZSBhc3N1bWVkIHRvIG5vdCBvbmx5IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggdGhlc2UgZmxhZ3MsCisjICAgYnV0IGFsc28gbGluayBpdCB3aXRoIHRoZW0gYXMgd2VsbC4gZS5nLiB5b3Ugc2hvdWxkIGxpbmsgd2l0aAorIyAgICRQVEhSRUFEX0NDICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRMREZMQUdTIC4uLiAkUFRIUkVBRF9MSUJTICRMSUJTCisjCisjICAgSWYgeW91IGFyZSBvbmx5IGJ1aWxkaW5nIHRocmVhZHMgcHJvZ3JhbXMsIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlc2UKKyMgICB2YXJpYWJsZXMgaW4geW91ciBkZWZhdWx0IExJQlMsIENGTEFHUywgYW5kIENDOgorIworIyAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyMgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisjICAgICBDQz0iJFBUSFJFQURfQ0MiCisjCisjICAgSW4gYWRkaXRpb24sIGlmIHRoZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0aHJlYWQtYXR0cmlidXRlIGNvbnN0YW50CisjICAgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSwgZGVmaW5lcyBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0byB0aGF0IG5hbWUKKyMgICAoZS5nLiBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEIG9uIEFJWCkuCisjCisjICAgQWxzbyBIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUIGlzIGRlZmluZWQgaWYgcHRocmVhZCBpcyBmb3VuZCBhbmQgdGhlCisjICAgUFRIUkVBRF9QUklPX0lOSEVSSVQgc3ltYm9sIGlzIGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aAorIyAgIFBUSFJFQURfQ0ZMQUdTLgorIworIyAgIEFDVElPTi1JRi1GT1VORCBpcyBhIGxpc3Qgb2Ygc2hlbGwgY29tbWFuZHMgdG8gcnVuIGlmIGEgdGhyZWFkcyBsaWJyYXJ5CisjICAgaXMgZm91bmQsIGFuZCBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB0byBydW4gaXQgaWYgaXQKKyMgICBpcyBub3QgZm91bmQuIElmIEFDVElPTi1JRi1GT1VORCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBhY3Rpb24KKyMgICB3aWxsIGRlZmluZSBIQVZFX1BUSFJFQUQuCisjCisjICAgUGxlYXNlIGxldCB0aGUgYXV0aG9ycyBrbm93IGlmIHRoaXMgbWFjcm8gZmFpbHMgb24gYW55IHBsYXRmb3JtLCBvciBpZgorIyAgIHlvdSBoYXZlIGFueSBvdGhlciBzdWdnZXN0aW9ucyBvciBjb21tZW50cy4gVGhpcyBtYWNybyB3YXMgYmFzZWQgb24gd29yaworIyAgIGJ5IFNHSiBvbiBhdXRvY29uZiBzY3JpcHRzIGZvciBGRlRXIChodHRwOi8vd3d3LmZmdHcub3JnLykgKHdpdGggaGVscAorIyAgIGZyb20gTS4gRnJpZ28pLCBhcyB3ZWxsIGFzIGFjX3B0aHJlYWQgYW5kIGhiX3B0aHJlYWQgbWFjcm9zIHBvc3RlZCBieQorIyAgIEFsZWphbmRybyBGb3Jlcm8gQ3VlcnZvIHRvIHRoZSBhdXRvY29uZiBtYWNybyByZXBvc2l0b3J5LiBXZSBhcmUgYWxzbworIyAgIGdyYXRlZnVsIGZvciB0aGUgaGVscGZ1bCBmZWVkYmFjayBvZiBudW1lcm91cyB1c2Vycy4KKyMKKyMgICBVcGRhdGVkIGZvciBBdXRvY29uZiAyLjY4IGJ5IERhbmllbCBSaWNoYXJkIEcuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxMSBEYW5pZWwgUmljaGFyZCBHLiA8c2t1bmtAaVNLVU5LLk9SRz4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgMjEKKworQVVfQUxJQVMoW0FDWF9QVEhSRUFEXSwgW0FYX1BUSFJFQURdKQorQUNfREVGVU4oW0FYX1BUSFJFQURdLCBbCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCitBQ19MQU5HX1BVU0goW0NdKQorYXhfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1NdKQorICAgICAgICBBQ19UUllfTElOS19GVU5DKFtwdGhyZWFkX2pvaW5dLCBbYXhfcHRocmVhZF9vaz15ZXNdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskYXhfcHRocmVhZF9va10pCisgICAgICAgIGlmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCitheF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICR7aG9zdF9vc30gaW4KKyAgICAgICAgc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBheF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgcHRocmVhZCAtbXQgLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7CisKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgYXhfcHRocmVhZF9mbGFncz0iLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKKyMgQ2xhbmcgZG9lc24ndCBjb25zaWRlciB1bnJlY29nbml6ZWQgb3B0aW9ucyBhbiBlcnJvciB1bmxlc3Mgd2Ugc3BlY2lmeQorIyAtV2Vycm9yLiBXZSB0aHJvdyBpbiBzb21lIGV4dHJhIENsYW5nLXNwZWNpZmljIG9wdGlvbnMgdG8gZW5zdXJlIHRoYXQKKyMgdGhpcyBkb2Vzbid0IGhhcHBlbiBmb3IgR0NDLCB3aGljaCBhbHNvIGFjY2VwdHMgLVdlcnJvci4KKworQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlciBuZWVkcyAtV2Vycm9yIHRvIHJlamVjdCB1bmtub3duIGZsYWdzXSkKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorYXhfcHRocmVhZF9leHRyYV9mbGFncz0iLVdlcnJvciIKK0NGTEFHUz0iJENGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyAtV3Vua25vd24td2FybmluZy1vcHRpb24gLVdzaXplb2YtYXJyYXktYXJndW1lbnQiCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtpbnQgZm9vKHZvaWQpO10sW2ZvbygpXSldLAorICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgICAgICAgICAgIFtheF9wdGhyZWFkX2V4dHJhX2ZsYWdzPQorICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSldKQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKK2lmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRheF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzXSkKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICBwdGhyZWFkLWNvbmZpZykKKyAgICAgICAgICAgICAgICBBQ19DSEVDS19QUk9HKFtheF9wdGhyZWFkX2NvbmZpZ10sIFtwdGhyZWFkLWNvbmZpZ10sIFt5ZXNdLCBbbm9dKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgeCIkYXhfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSJgcHRocmVhZC1jb25maWcgLS1jZmxhZ3NgIgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxwdGhyZWFkLmg+CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCByb3V0aW5lKHZvaWQgKmEpIHsgYSA9IDA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpzdGFydF9yb3V0aW5lKHZvaWQgKmEpIHsgcmV0dXJuIGE7IH1dLAorICAgICAgICAgICAgICAgICAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRoLCAwLCBzdGFydF9yb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NsZWFudXBfcHVzaChyb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY2xlYW51cF9wb3AoMCkgLyogOyAqL10pXSwKKyAgICAgICAgICAgICAgICBbYXhfcHRocmVhZF9vaz15ZXNdLAorICAgICAgICAgICAgICAgIFtdKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRheF9wdGhyZWFkX29rXSkKKyAgICAgICAgaWYgdGVzdCAieCRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZV0pCisgICAgICAgIGF0dHJfbmFtZT11bmtub3duCisgICAgICAgIGZvciBhdHRyIGluIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQ7IGRvCisgICAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IGF0dHIgPSAkYXR0cjsgcmV0dXJuIGF0dHIgLyogOyAqL10pXSwKKyAgICAgICAgICAgICAgICBbYXR0cl9uYW1lPSRhdHRyOyBicmVha10sCisgICAgICAgICAgICAgICAgW10pCisgICAgICAgIGRvbmUKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJGF0dHJfbmFtZV0pCisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW1BUSFJFQURfQ1JFQVRFX0pPSU5BQkxFXSwgWyRhdHRyX25hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbiB5b3VyIHN5c3RlbS5dKQorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHNdKQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgJHtob3N0X29zfSBpbgorICAgICAgICAgICAgYWl4KiB8IGZyZWVic2QqIHwgZGFyd2luKikgZmxhZz0iLURfVEhSRUFEX1NBRkUiOzsKKyAgICAgICAgICAgIG9zZiogfCBocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgICAgICBzb2xhcmlzKikKKyAgICAgICAgICAgIGlmIHRlc3QgIiRHQ0MiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBmbGFnPSItRF9SRUVOVFJBTlQiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBUT0RPOiBXaGF0IGFib3V0IENsYW5nIG9uIFNvbGFyaXM/CisgICAgICAgICAgICAgICAgZmxhZz0iLW10IC1EX1JFRU5UUkFOVCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRmbGFnXSkKKyAgICAgICAgaWYgdGVzdCAieCRmbGFnIiAhPSB4bm87IHRoZW4KKyAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBQVEhSRUFEX1BSSU9fSU5IRVJJVF0sCisgICAgICAgICAgICBbYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVRdLCBbCisgICAgICAgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxwdGhyZWFkLmg+XV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2ludCBpID0gUFRIUkVBRF9QUklPX0lOSEVSSVQ7XV0pXSwKKyAgICAgICAgICAgICAgICAgICAgW2F4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUPXllc10sCisgICAgICAgICAgICAgICAgICAgIFtheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVD1ub10pCisgICAgICAgICAgICBdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVCIgPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX0RFRklORShbSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVF0sIFsxXSwgW0hhdmUgUFRIUkVBRF9QUklPX0lOSEVSSVQuXSldKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgICMgTW9yZSBBSVggbG9zc2FnZTogY29tcGlsZSB3aXRoICpfciB2YXJpYW50CisgICAgICAgIGlmIHRlc3QgIngkR0NDIiAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgYWl4KikKKyAgICAgICAgICAgICAgICBBU19DQVNFKFsieC8kQ0MiXSwKKyAgICAgICAgICAgICAgICAgIFt4Ki9jODl8eCovYzg5XzEyOHx4Ki9jOTl8eCovYzk5XzEyOHx4Ki9jY3x4Ki9jYzEyOHx4Ki94bGN8eCoveGxjX3Y2fHgqL3hsYzEyOHx4Ki94bGMxMjhfdjZdLAorICAgICAgICAgICAgICAgICAgWyNoYW5kbGUgYWJzb2x1dGUgcGF0aCBkaWZmZXJlbnRseSBmcm9tIFBBVEggYmFzZWQgcHJvZ3JhbSBsb29rdXAKKyAgICAgICAgICAgICAgICAgICBBU19DQVNFKFsieCRDQyJdLAorICAgICAgICAgICAgICAgICAgICAgW3gvKl0sCisgICAgICAgICAgICAgICAgICAgICBbQVNfSUYoW0FTX0VYRUNVVEFCTEVfUChbJHtDQ31fcl0pXSxbUFRIUkVBRF9DQz0iJHtDQ31fciJdKV0sCisgICAgICAgICAgICAgICAgICAgICBbQUNfQ0hFQ0tfUFJPR1MoW1BUSFJFQURfQ0NdLFske0NDfV9yXSxbJENDXSldKV0pCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKK2ZpCisKK3Rlc3QgLW4gIiRQVEhSRUFEX0NDIiB8fCBQVEhSRUFEX0NDPSIkQ0MiCisKK0FDX1NVQlNUKFtQVEhSRUFEX0xJQlNdKQorQUNfU1VCU1QoW1BUSFJFQURfQ0ZMQUdTXSkKK0FDX1NVQlNUKFtQVEhSRUFEX0NDXSkKKworIyBGaW5hbGx5LCBleGVjdXRlIEFDVElPTi1JRi1GT1VORC9BQ1RJT04tSUYtTk9ULUZPVU5EOgoraWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLFtBQ19ERUZJTkUoW0hBVkVfUFRIUkVBRF0sWzFdLFtEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy5dKV0sWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBheF9wdGhyZWFkX29rPW5vCisgICAgICAgICQyCitmaQorQUNfTEFOR19QT1AKK10pZG5sIEFYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL200L2F4X3JlcXVpcmVfZGVmaW5lZC5tNCBiL200L2F4X3JlcXVpcmVfZGVmaW5lZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUxMTExCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXhfcmVxdWlyZV9kZWZpbmVkLm00CkBAIC0wLDAgKzEsMzcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3JlcXVpcmVfZGVmaW5lZC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1JFUVVJUkVfREVGSU5FRChNQUNSTykKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBBWF9SRVFVSVJFX0RFRklORUQgaXMgYSBzaW1wbGUgaGVscGVyIGZvciBtYWtpbmcgc3VyZSBvdGhlciBtYWNyb3MgaGF2ZQorIyAgIGJlZW4gZGVmaW5lZCBhbmQgdGh1cyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuICBUaGlzIGF2b2lkcyByYW5kb20gaXNzdWVzCisjICAgd2hlcmUgYSBtYWNybyBpc24ndCBleHBhbmRlZC4gIEluc3RlYWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZW1pdHMgYQorIyAgIG5vbi1mYXRhbDoKKyMKKyMgICAgIC4vY29uZmlndXJlOiBsaW5lIDE2NzM6IEFYX0NGTEFHU19XQVJOX0FMTDogY29tbWFuZCBub3QgZm91bmQKKyMKKyMgICBJdCdzIGxpa2UgQUNfUkVRVUlSRSBleGNlcHQgaXQgZG9lc24ndCBleHBhbmQgdGhlIHJlcXVpcmVkIG1hY3JvLgorIworIyAgIEhlcmUncyBhbiBleGFtcGxlOgorIworIyAgICAgQVhfUkVRVUlSRV9ERUZJTkVEKFtBWF9DSEVDS19MSU5LX0ZMQUddKQorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE0IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMQorCitBQ19ERUZVTihbQVhfUkVRVUlSRV9ERUZJTkVEXSwgW2RubAorICBtNF9pZm5kZWYoWyQxXSwgW200X2ZhdGFsKFttYWNybyBdJDFbIGlzIG5vdCBkZWZpbmVkOyBpcyBhIG00IGZpbGUgbWlzc2luZz9dKV0pCitdKWRubCBBWF9SRVFVSVJFX0RFRklORUQKZGlmZiAtLWdpdCBhL200L2xpYnRvb2wubTQgYi9tNC9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzA0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9saWJ0b29sLm00CkBAIC0wLDAgKzEsNzk5NyBAQAorIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworbTRfZGVmaW5lKFtfTFRfQ09QWUlOR10sIFtkbmwKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCisjCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsIG9yCisjIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCitdKQorCisjIHNlcmlhbCA1NyBMVF9JTklUCisKKworIyBMVF9QUkVSRVEoVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGFuZCBleGl0IGlmIHRoaXMgbGlidG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhdCBWRVJTSU9OLgorbTRfZGVmdW4oW0xUX1BSRVJFUV0sCitbbTRfaWYobTRfdmVyc2lvbl9jb21wYXJlKG00X2RlZm4oW0xUX1BBQ0tBR0VfVkVSU0lPTl0pLCBbJDFdKSwgLTEsCisgICAgICAgW200X2RlZmF1bHQoWyQzXSwKKwkJICAgW200X2ZhdGFsKFtMaWJ0b29sIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKKwkJICAgICAgICAgICAgIDYzKV0pXSwKKyAgICAgICBbJDJdKV0pCisKKworIyBfTFRfQ0hFQ0tfQlVJTERESVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGlmIHRoZSBhYnNvbHV0ZSBidWlsZCBkaXJlY3RvcnkgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMKK200X2RlZnVuKFtfTFRfQ0hFQ0tfQlVJTERESVJdLAorW2Nhc2UgYHB3ZGAgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgQUNfTVNHX1dBUk4oW0xpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBgcHdkYF0pIDs7Citlc2FjCitdKQorCisKKyMgTFRfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0lOSVRdLAorW0FDX1BSRVJFUShbMi41OF0pZG5sIFdlIHVzZSBBQ19JTkNMVURFU19ERUZBVUxUCitBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfTEFOR10pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfQlVJTERESVJdKWRubAorCitkbmwgQXV0b2NvbmYgZG9lc24ndCBjYXRjaCB1bmV4cGFuZGVkIExUXyBtYWNyb3MgYnkgZGVmYXVsdDoKK200X3BhdHRlcm5fZm9yYmlkKFteXz9MVF9bQS1aX10rJF0pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteKF9MVF9FT0Z8TFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PV3xMVF9NVUxUSV9NT0RVTEUpJF0pZG5sCitkbmwgYWNsb2NhbCBkb2Vzbid0IHB1bGwgbHRvcHRpb25zLm00LCBsdHN1Z2FyLm00LCBvciBsdHZlcnNpb24ubTQKK2RubCB1bmxlc3Mgd2UgcmVxdWlyZSBhbiBBQ19ERUZVTmVkIG1hY3JvOgorQUNfUkVRVUlSRShbTFRPUFRJT05TX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRTVUdBUl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUVkVSU0lPTl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUT0JTT0xFVEVfVkVSU0lPTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19MVE1BSU5dKWRubAorCitfTFRfU0hFTExfSU5JVChbU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH1dKQorCitkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworX0xUX1NFVFVQCisKKyMgT25seSBleHBhbmQgb25jZToKK200X2RlZmluZShbTFRfSU5JVF0pCitdKSMgTFRfSU5JVAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBQ19QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitBVV9BTElBUyhbQU1fUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgW10pCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorbTRfZGVmdW4oW19MVF9DQ19CQVNFTkFNRV0sCitbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCitdKQorCisKKyMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEl0IGlzIG9rYXkgdG8gdXNlIHRoZXNlIGZpbGUgY29tbWFuZHMgYW5kIGFzc3VtZSB0aGV5IGhhdmUgYmVlbiBzZXQKKyMgc2Vuc2libHkgYWZ0ZXIgYG00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKScuCittNF9kZWZ1bihbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10sCitbOiAke0NQPSJjcCAtZiJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorXSkjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKworCisjIF9MVF9TRVRVUAorIyAtLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK19MVF9ERUNMKFtdLCBbUEFUSF9TRVBBUkFUT1JdLCBbMV0sIFtUaGUgUEFUSCBzZXBhcmF0b3IgZm9yIHRoZSBidWlsZCBzeXN0ZW1dKWRubAorZG5sCitfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAorZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKK19MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKK2RubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1dJVEhfU1lTUk9PVF0pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgZmV3IHNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwIHVzIGRvIHJvYnVzdCBxdW90aW5nLgorbTRfZGVmdW4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwKK1sjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtbImAkXFxdXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbWyJgXFxdXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworXSkKKworIyBfTFRfUFJPR19MVE1BSU4KKyMgLS0tLS0tLS0tLS0tLS0tCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgY2FsbGVkIGJvdGggZnJvbSBgY29uZmlndXJlJywgYW5kIGBjb25maWcuc3RhdHVzJworIyBub3cgdGhhdCB3ZSB1c2UgQUNfQ09ORklHX0NPTU1BTkRTIHRvIGdlbmVyYXRlIGxpYnRvb2wuICBOb3RhYmx5LAorIyBgY29uZmlnLnN0YXR1cycgaGFzIG5vIHZhbHVlIGZvciBhY19hdXhfZGlyIHVubGVzcyB3ZSBhcmUgdXNpbmcgQXV0b21ha2UsCisjIHNvIHdlIHBhc3MgYSBjb3B5IGFsb25nIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBzZW5zaWJsZSB2YWx1ZSBhbnl3YXkuCittNF9kZWZ1bihbX0xUX1BST0dfTFRNQUlOXSwKK1ttNF9pZmRlZihbQUNfUkVRVUlSRV9BVVhfRklMRV0sIFtBQ19SRVFVSVJFX0FVWF9GSUxFKFtsdG1haW4uc2hdKV0pZG5sCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInXSkKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorXSkjIF9MVF9QUk9HX0xUTUFJTgorCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEFjY3VtdWxhdGUgY29kZSBmb3IgY3JlYXRpbmcgbGlidG9vbC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBTbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBhIGZ1bGwgbGlidG9vbCBzY3JpcHQgaW5jbHVkaW5nIGFkZGl0aW9uYWwKKyMgdGFncywgd2UgYWNjdW11bGF0ZSB0aGUgY2h1bmtzIG9mIGNvZGUgdG8gc2VuZCB0byBBQ19DT05GSUdfQ09NTUFORFMKKyMgaW4gbWFjcm9zIGFuZCB0aGVuIG1ha2UgYSBzaW5nbGUgY2FsbCBhdCB0aGUgZW5kIHVzaW5nIHRoZSBgbGlidG9vbCcKKyMgbGFiZWwuCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbSU5JVC1DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgSU5JVC1DT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xfSU5JVF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSkKKworCisjIF9MVF9DT05GSUdfTElCVE9PTChbQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10pCisKKworIyBfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoW0NPTU1BTkRTXSwgW0lOSVRfQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT05GSUdfU0FWRV9DT01NQU5EU10sCitbX0xUX0NPTkZJR19MSUJUT09MKFskMV0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbJDJdKQorXSkKKworCisjIF9MVF9GT1JNQVRfQ09NTUVOVChbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBsZWFkaW5nIGNvbW1lbnQgbWFya3MgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSwgYW5kIGEgdHJhaWxpbmcKKyMgZnVsbC1zdG9wIHRvIHRoZSB3aG9sZSBjb21tZW50IGlmIG9uZSBpcyBub3QgcHJlc2VudCBhbHJlYWR5LgorbTRfZGVmaW5lKFtfTFRfRk9STUFUX0NPTU1FTlRdLAorW200X2lmdmFsKFskMV0sIFsKK200X2JwYXRzdWJzdChbbTRfYnBhdHN1YnN0KFskMV0sIFteICpdLCBbIyBdKV0sCisgICAgICAgICAgICAgIFtbJ2AkXF1dLCBbXFxcJl0pXW00X2JtYXRjaChbJDFdLCBbWyE/Ll0kXSwgW10sIFsuXSkKKyldKQorCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGSVhNRTogRWxpbWluYXRlIFZBUk5BTUUgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisKKyMgX0xUX0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSwgW0lTLVRBR0dFRD9dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENPTkZJR05BTUUgaXMgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIHZhbHVlIGluIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyMgVkFSTkFNRSBpcyB0aGUgKGJhc2UpIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyMgVkFMVUUgbWF5IGJlIDAsIDEgb3IgMiBmb3IgYSBjb21wdXRlZCBxdW90ZSBlc2NhcGVkIHZhbHVlIGJhc2VkIG9uCisjIFZBUk5BTUUuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LgorbTRfZGVmaW5lKFtfTFRfREVDTF0sCitbbHRfaWZfYXBwZW5kX3VuaXEoW2x0X2RlY2xfdmFybmFtZXNdLCBbJDJdLCBbLCBdLAorICAgIFtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtsaWJ0b29sX25hbWVdLAorCVttNF9pZnZhbChbJDFdLCBbJDFdLCBbJDJdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbdmFsdWVdLCBbJDNdKQorICAgIG00X2lmdmFsKFskNF0sCisJW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2Rlc2NyaXB0aW9uXSwgWyQ0XSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwKKwlbdGFnZ2VkP10sIFttNF9pZnZhbChbJDVdLCBbeWVzXSwgW25vXSldKV0pCitdKQorCisKKyMgX0xUX1RBR0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR0RFQ0xdLCBbX0xUX0RFQ0woWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSwgW3llc10pXSkKKworCisjIGx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF90YWdfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFt5ZXNdLCAkQCldKQorCisKKyMgX2x0X2RlY2xfZmlsdGVyKFNVQktFWSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfbHRfZGVjbF9maWx0ZXJdLAorW200X2Nhc2UoWyQjXSwKKyAgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCisgIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKKyAgWzJdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFszXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbJDNdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgJEApXSlbXWRubAorXSkKKworCisjIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMV0sICRAKV0pCisKKworIyBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzJdLCAkQCldKQorCisKKyMgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfYXNzZXJ0KFskIyA8PSAyXSlkbmwKK18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgIG00X2lmdmFsKFskMl0sIFtbJDJdXSwgW200X2RxdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyldKSwKKyAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSwgWyBdKSldKQorbTRfZGVmaW5lKFtfbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2lmdmFsKFskM10sIFtsdF9jb21iaW5lKFskMV0sIFskMl0sIFtfXSwgJDMpXSldKQorCisKKyMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCitbXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgIG00X2lmKFskMl0sIFtdLAorCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAorCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCitdKQorbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCisJCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAorXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCisjIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKKyMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKK1skMT0nYCRFQ0hPICIkXVskMSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIiQ8dmFyPiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittNF9kZWZ1bihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF9hbGxfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdTCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0IGNvbW1lbnQgYW5kIGxpc3Qgb2YgdGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNjcmlwdAorbTRfZGVmdW4oW19MVF9MSUJUT09MX1RBR1NdLAorW19MVF9GT1JNQVRfQ09NTUVOVChbVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0XSlkbmwKK2F2YWlsYWJsZV90YWdzPSJfTFRfVEFHUyJkbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9ERUNMQVJFKFZBUk5BTUUsIFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0IHRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBmb3IgVkFSTkFNRSAob3B0aW9uYWxseSB3aXRoIFRBRykgYW5kCisjIGV4cGFuZCB0byBhIGNvbW1lbnRlZCBzaGVsbCB2YXJpYWJsZSBzZXR0aW5nOgorIworIyAgICAjIFNvbWUgY29tbWVudCBhYm91dCB3aGF0IFZBUiBpcyBmb3IuCisjICAgIHZpc2libGVfbmFtZT0kbHRfaW50ZXJuYWxfbmFtZQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9ERUNMQVJFXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwKKwkJCQkJICAgW2Rlc2NyaXB0aW9uXSkpKVtdZG5sCittNF9wdXNoZGVmKFtfbGlidG9vbF9uYW1lXSwKKyAgICBtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbbGlidG9vbF9uYW1lXSkpKVtdZG5sCittNF9jYXNlKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pKSwKKyAgICBbMF0sIFtfbGlidG9vbF9uYW1lPVskXSQxXSwKKyAgICBbMV0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbMl0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbX2xpYnRvb2xfbmFtZT1sdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKV0pW11kbmwKK200X2lmdmFsKFskMl0sIFtfJDJdKVtdbTRfcG9wZGVmKFtfbGlidG9vbF9uYW1lXSlbXWRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0NPTkZJR19WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgY29tbWVudGVkIGRlY2xhcmF0aW9ucyBvZiBub24tdGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcworIyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGluIHRoZSBMSUJUT09MIENPTkZJRyBzZWN0aW9uIG9mIHRoZSBgbGlidG9vbCcKKyMgc2NyaXB0LiAgVGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyAoZXZlbiBmb3IgdGhlIExJQlRPT0wgQ09ORklHCisjIHNlY3Rpb24pIGFyZSBwcm9kdWNlZCBieSBfTFRfTElCVE9PTF9UQUdfVkFSUy4KK200X2RlZnVuKFtfTFRfTElCVE9PTF9DT05GSUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sCisgICAgbTRfcXVvdGUoX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW25vXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHX1ZBUlMoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9MSUJUT09MX1RBR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIsIFskMV0pXSldKV0pCisKKworIyBfTFRfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdWQVJdLCBbbTRfaWZ2YWwoWyQyXSwgWyQxXyQyXSwgWyQxXSldKQorCisKKyMgX0xUX0NPTkZJR19DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlbmQgYWNjdW11bGF0ZWQgb3V0cHV0IHRvICRDT05GSUdfU1RBVFVTLiAgVGhhbmtzIHRvIHRoZSBsaXN0cyBvZgorIyB2YXJpYWJsZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGVzY2FwaW5nIHdlIHNhdmVkIGZyb20gY2FsbHMKKyMgdG8gX0xUX0RFQ0wsIHdlIGNhbiBwdXQgcXVvdGUgZXNjYXBlZCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisjIGludG8gYGNvbmZpZy5zdGF0dXMnLCBhbmQgdGhlbiB0aGUgc2hlbGwgY29kZSB0byBxdW90ZSBlc2NhcGUgdGhlbSBpbgorIyBmb3IgbG9vcHMgaW4gYGNvbmZpZy5zdGF0dXMnLiAgRmluYWxseSwgYW55IGFkZGl0aW9uYWwgY29kZSBhY2N1bXVsYXRlZAorIyBmcm9tIGNhbGxzIHRvIF9MVF9DT05GSUdfTElCVE9PTF9JTklUIGlzIGV4cGFuZGVkLgorbTRfZGVmdW4oW19MVF9DT05GSUdfQ09NTUFORFNdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9PVVRQVVRdLAorCWRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaGFzIGJlZW4gcGxhY2VkIGluICRDT05GSUdfTFQsCisJZG5sIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgYWxsIG92ZXIgYWdhaW4gaW50byBjb25maWcuc3RhdHVzLAorCWRubCB0aGVuIHdlIHdpbGwgaGF2ZSBjb25maWcuc3RhdHVzIHJ1biAkQ09ORklHX0xUIGxhdGVyLCBzbyBpdAorCWRubCBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSBpcyBzdG9yZWQgdGhlcmU6CisgICAgICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICAgICAgWyRTSEVMTCAkQ09ORklHX0xUIHx8IEFTX0VYSVQoMSldLCBbQ09ORklHX0xUPSckQ09ORklHX0xUJ10pXSwKKyAgICBkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGlzIGRlc3RpbmVkIGZvciBjb25maWcuc3RhdHVzLAorICAgIGRubCBleHBhbmQgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIGFuZCBpbml0IGNvZGUgbm93OgorICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSldKQorXSkjX0xUX0NPTkZJR19DT01NQU5EUworCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdLAorWworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCitkb3VibGVfcXVvdGVfc3Vic3Q9JyRkb3VibGVfcXVvdGVfc3Vic3QnCitkZWxheV92YXJpYWJsZV9zdWJzdD0nJGRlbGF5X3ZhcmlhYmxlX3N1YnN0JworX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCitMVENDPSckTFRDQycKK0xUQ0ZMQUdTPSckTFRDRkxBR1MnCitjb21waWxlcj0nJGNvbXBpbGVyX0RFRkFVTFQnCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCRbXTEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKK10pCisKKyMgX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoRklMRSwgW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhdGUgYSBjaGlsZCBzY3JpcHQgRklMRSB3aXRoIGFsbCBpbml0aWFsaXphdGlvbiBuZWNlc3NhcnkgdG8KKyMgcmV1c2UgdGhlIGVudmlyb25tZW50IGxlYXJuZWQgYnkgdGhlIHBhcmVudCBzY3JpcHQsIGFuZCBtYWtlIHRoZQorIyBmaWxlIGV4ZWN1dGFibGUuICBJZiBDT01NRU5UIGlzIHN1cHBsaWVkLCBpdCBpcyBpbnNlcnRlZCBhZnRlciB0aGUKKyMgYCMhJyBzZXF1ZW5jZSBidXQgYmVmb3JlIGluaXRpYWxpemF0aW9uIHRleHQgYmVnaW5zLiAgQWZ0ZXIgdGhpcworIyBtYWNybywgYWRkaXRpb25hbCB0ZXh0IGNhbiBiZSBhcHBlbmRlZCB0byBGSUxFIHRvIGZvcm0gdGhlIGJvZHkgb2YKKyMgdGhlIGNoaWxkIHNjcmlwdC4gIFRoZSBtYWNybyBlbmRzIHdpdGggbm9uLXplcm8gc3RhdHVzIGlmIHRoZQorIyBmaWxlIGNvdWxkIG5vdCBiZSBmdWxseSB3cml0dGVuIChzdWNoIGFzIGlmIHRoZSBkaXNrIGlzIGZ1bGwpLgorbTRfaWZkZWYoW0FTX0lOSVRfR0VORVJBVEVEXSwKK1ttNF9kZWZ1bihbX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVRdLFtBU19JTklUX0dFTkVSQVRFRCgkQCldKV0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSwKK1ttNF9yZXF1aXJlKFtBU19QUkVQQVJFXSldZG5sCitbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV1kbmwKK1tsdF93cml0ZV9mYWlsPTAKK2NhdCA+JDEgPDxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyQyCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiQxIDw8XF9BU0VPRiB8fCBsdF93cml0ZV9mYWlsPTEKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorZXhlYyBBU19NRVNTQUdFX0ZEPiYxCitfQVNFT0YKK3Rlc3QgJGx0X3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICQxW11kbmwKK200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pXSkjIF9MVF9HRU5FUkFURURfRklMRV9JTklUCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoWyIkQ09ORklHX0xUIl0sCitbIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5dKQorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitsdF9jbF9zaWxlbnQ9ZmFsc2UKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgorbHRfY2xfc3VjY2Vzcz06Cit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICBsdF9jb25maWdfbHRfYXJncz0iJGx0X2NvbmZpZ19sdF9hcmdzIC0tcXVpZXQiCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAorJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQorXSkjIExUX09VVFBVVAorCisKKyMgX0xUX0NPTkZJRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUcgaXMgdGhlIGJ1aWx0LWluIHRhZywgY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQgd2l0aCBhCisjIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZSBhZGQgY29kZQorIyB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkgVEFHIGZyb20gdGhlCisjIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KK200X2RlZnVuKFtfTFRfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbCisgIG00X2RlZmluZShbX0xUX1RBR10sIG00X2lmKFskMV0sIFtdLCBbQ10sIFskMV0pKWRubAorICBtNF9pZihfTFRfVEFHLCBbQ10sIFsKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworX0xUX0NPUFlJTkcKK19MVF9MSUJUT09MX1RBR1MKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKK19MVF9MSUJUT09MX0NPTkZJR19WQVJTCitfTFRfTElCVE9PTF9UQUdfVkFSUworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9QUk9HX0xUTUFJTgorCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbR29dLAkJCVtfTFRfTEFORyhHTyldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCittNF9pZm5kZWYoW0FDX1BST0dfR09dLCBbCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfR08uICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCittNF9kZWZ1bihbQUNfUFJPR19HT10sCitbQUNfTEFOR19QVVNIKEdvKWRubAorQUNfQVJHX1ZBUihbR09DXSwgICAgIFtHbyBjb21waWxlciBjb21tYW5kXSlkbmwKK0FDX0FSR19WQVIoW0dPRkxBR1NdLCBbR28gY29tcGlsZXIgZmxhZ3NdKWRubAorX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCitBQ19DSEVDS19UT09MKEdPQywgZ2NjZ28pCitpZiB0ZXN0IC16ICIkR09DIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgQUNfQ0hFQ0tfUFJPRyhHT0MsIFske2FjX3Rvb2xfcHJlZml4fWdjY2dvXSwgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dKQorICBmaQorZmkKK2lmIHRlc3QgLXogIiRHT0MiOyB0aGVuCisgIEFDX0NIRUNLX1BST0coR09DLCBnY2NnbywgZ2NjZ28sIGZhbHNlKQorZmkKK10pI200X2RlZnVuCitdKSNtNF9pZm5kZWYKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dPXSwKKyAgW0xUX0xBTkcoR08pXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19HT10sIGRlZm4oW0FDX1BST0dfR09dKVtMVF9MQU5HKEdPKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAorICBbTFRfTEFORyhSQyldLAorICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQorXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisKKyMgT2Jzb2xldGUgbWFjcm9zOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0xUX0xBTkcoV2luZG93cyBSZXNvdXJjZSldKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbXSkKKworCisjIF9MVF9UQUdfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCitfTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCitfTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCitfTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKK19MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX1RBR19DT01QSUxFUgorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCitdKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKKyAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKKyAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaV0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnXSxbbHRfY3ZfbGRfZm9yY2VfbG9hZF0sCisgICAgICBbbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgZm9yY2VfbG9hZCBjb25mdGVzdC5lcnI7IHRoZW4KKwljYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorICAgIF0pCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bWzkxXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLltbMDEyXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQorCisKKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKyAgICBtNF9jYXNlKFskMV0sIFtGNzddLCBbX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXNdLAorICAgICAgICAgICAgICAgICAgW0ZDXSwgIFtfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllc10pCisgIGVsc2UKKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgZmkKKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbTRfaWYoWyQxXSwgW0NYWF0sCitbICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKK10sW10pCisgIGVsc2UKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorXSkKKworIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KKyMgU3RvcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgZGlmZmVyZW50IGNvbXBpbGVycyBmb3IgZWFjaCBUQUdOQU1FLgorIyBBbGxvdyB0byBvdmVycmlkZSB0aGVtIGZvciBhbGwgdGFncyB0aHJvdWdoIGx0X2N2X2FpeF9saWJwYXRoLgorbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAoraWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgQUNfQ0FDSEVfVkFMKFtfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKV0sCisgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSxbCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nWworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9XScKKyAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaV0sW10pCisgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKSI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKyAgXSkKKyAgYWl4X2xpYnBhdGg9JF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pCitmaQorXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisKKworIyBfTFRfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAorW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVRdLCBbJDEKK10pXSkjIF9MVF9TSEVMTF9JTklUCisKKworCisjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCisjIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAorIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KKyMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCittNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIHByaW50IHN0cmluZ3NdKQorIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCitpZiB0ZXN0ICJYYCggcHJpbnQgLXIgLS0gLW4gKSAyPi9kZXYvbnVsbGAiID0gWC1uICYmIFwKKyAgIHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50IC1yIC0tJworZWxpZiB0ZXN0ICJYYHByaW50ZiAlcyAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnRmICVzXG4nCitlbHNlCisgICMgVXNlIHRoaXMgZnVuY3Rpb24gYXMgYSBmYWxsYmFjayB0aGF0IGFsd2F5cyB3b3Jrcy4KKyAgZnVuY19mYWxsYmFja19lY2hvICgpCisgIHsKKyAgICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJFtdMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIgCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSBBQ19NU0dfUkVTVUxUKFtwcmludGZdKSA7OworICBwcmludCopIEFDX01TR19SRVNVTFQoW3ByaW50IC1yXSkgOzsKKyAgKikgQUNfTVNHX1JFU1VMVChbY2F0XSkgOzsKK2VzYWMKKworbTRfaWZkZWYoW19BU19ERVRFQ1RfU1VHR0VTVEVEXSwKK1tfQVNfREVURUNUX1NVR0dFU1RFRChbCisgIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSR7QkFTSF9WRVJTSU9OK3NldH0iIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPYCIgPSAiWCRFQ0hPIiBcCisgICAgICB8fCB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPYCIgPSAiWCRFQ0hPIiApXSldKQorCitfTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCitfTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sIFtBbiBlY2hvIHByb2dyYW0gdGhhdCBwcm90ZWN0cyBiYWNrc2xhc2hlc10pCitdKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9XSVRIX1NZU1JPT1QKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9XSVRIX1NZU1JPT1RdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIHN5c3Jvb3RdKQorQUNfQVJHX1dJVEgoW3N5c3Jvb3RdLAorWyAgLS13aXRoLXN5c3Jvb3RbPURJUl0gU2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzIHdpdGhpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgIChvciB0aGUgY29tcGlsZXIncyBzeXNyb290IGlmIG5vdCBzcGVjaWZpZWQpLl0sCitbXSwgW3dpdGhfc3lzcm9vdD1ub10pCisKK2RubCBsdF9zeXNyb290IHdpbGwgYWx3YXlzIGJlIHBhc3NlZCB1bnF1b3RlZC4gIFdlIHF1b3RlIGl0IGhlcmUKK2RubCBpbiBjYXNlIHRoZSB1c2VyIHBhc3NlZCBhIGRpcmVjdG9yeSBuYW1lLgorbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIEFDX01TR19SRVNVTFQoWyR7d2l0aF9zeXNyb290fV0pCisgICBBQ19NU0dfRVJST1IoW1RoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC5dKQorICAgOzsKK2VzYWMKKworIEFDX01TR19SRVNVTFQoWyR7bHRfc3lzcm9vdDotbm99XSkKK19MVF9ERUNMKFtdLCBbbHRfc3lzcm9vdF0sIFswXSwgW1RoZSByb290IHdoZXJlIHRvIHNlYXJjaCBmb3IgXWRubAorW2RlcGVuZGVudCBsaWJyYXJpZXMsIGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuXSldKQorCisjIF9MVF9FTkFCTEVfTE9DSworIyAtLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisgICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorCSAgICAgICp4ODYtNjQqKQorCQlMRD0iJHtMRC1sZH0gLW0gZWxmMzJfeDg2XzY0IgorCQk7OworCSAgICAgICopCisJCUxEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkJOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgcG93ZXJwYzY0bGUtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMybHBwY2xpbnV4IgorCSAgICA7OworCSAgcG93ZXJwYzY0LSopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwb3dlcnBjbGUtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0bHBwYyIKKwkgICAgOzsKKwkgIHBvd2VycGMtKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopCisgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgaT84Ni0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICMgR05VIGxkIDIuMjEgaW50cm9kdWNlZCBfc29sMiBlbXVsYXRpb25zLiAgVXNlIHRoZW0gaWYgYXZhaWxhYmxlLgorICAgICAgICBpZiAke0xELWxkfSAtViB8IGdyZXAgX3NvbDIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgTEQ9IiR7TEQtbGR9X3NvbDIiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9QUk9HX0FSCisjIC0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BST0dfQVJdLAorW0FDX0NIRUNLX1RPT0xTKEFSLCBbYXJdLCBmYWxzZSkKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0sIFtGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydF0sIFtsdF9jdl9hcl9hdF9maWxlXSwKKyAgW2x0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICBbZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCisgICAgICBBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwlBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorICAgICBdKQorICBdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorX0xUX0RFQ0woW10sIFthcmNoaXZlcl9saXN0X3NwZWNdLCBbMV0sCisgIFtIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXJdKQorXSkjIF9MVF9QUk9HX0FSCisKKworIyBfTFRfQ01EX09MRF9BUkNISVZFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKK1tfTFRfUFJPR19BUgorCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKKworQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CitfTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCitfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uXSwgWzBdLAorICAgIFtXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb25dKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgX0xUX0xJTktFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKKworCisjIExUX0NNRF9NQVhfTEVOCisjLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGEgbG9uZyB0aW1lIG9uIE9TLzIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTIKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbCSBdXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgJiYgXAorCXRlc3QgdW5kZWZpbmVkICE9ICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgZWxzZQorICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgorICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgorICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgICAjIHdlIGNhbid0IHRlbGwuCisgICAgICB3aGlsZSB7IHRlc3QgIlgiYGVudiBlY2hvICIkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICAgID0gIlgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICAgIGRvCisgICAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAorICAgICAgdGVzdHN0cmluZz0KKyAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KKyAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCisgICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQoraWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCitlbHNlCisgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCitfTFRfREVDTChbXSwgW21heF9jbWRfbGVuXSwgWzBdLAorICAgIFtXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/XSkKK10pIyBMVF9DTURfTUFYX0xFTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW0xUX0NNRF9NQVhfTEVOXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbXSkKKworCisjIF9MVF9IRUFERVJfRExGQ04KKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9IRUFERVJfRExGQ05dLAorW0FDX0NIRUNLX0hFQURFUlMoW2RsZmNuLmhdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSlkbmwKK10pIyBfTFRfSEVBREVSX0RMRkNOCisKKworIyBfTFRfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UUllfRExPUEVOX1NFTEZdLAorW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBbJDRdCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK1sjbGluZSAkTElORU5PICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXaGVuIC1mdmlzYmlsaXR5PWhpZGRlbiBpcyB1c2VkLCBhc3N1bWUgdGhlIGNvZGUgaGFzIGJlZW4gYW5ub3RhdGVkCisgICBjb3JyZXNwb25kaW5nbHkgZm9yIHRoZSBzeW1ib2xzIG5lZWRlZC4gICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKSkKK2ludCBmbm9yZCAoKSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKTsKKyNlbmRpZgorCitpbnQgZm5vcmQgKCkgeyByZXR1cm4gNDI7IH0KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7CisJfQorICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK31dCitfTFRfRU9GCisgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSAkMyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAkMworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKK10pIyBfTFRfVFJZX0RMT1BFTl9TRUxGCisKKworIyBMVF9TWVNfRExPUEVOX1NFTEYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sWworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICBdKQorICAgIDs7CisKKyAgKikKKyAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCisJICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAorICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKwkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAorCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCisJICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSkKKwkgICAgICBdKQorCSAgICBdKQorCSAgXSkKKwldKQorICAgICAgXSkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmLCBbZG5sCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8sIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzKQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQorICAgICAgXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCitfTFRfREVDTChbZGxvcGVuX3N1cHBvcnRdLCBbZW5hYmxlX2Rsb3Blbl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKK19MVF9ERUNMKFtkbG9wZW5fc2VsZl9zdGF0aWNdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpY10sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitdKSMgTFRfU1lTX0RMT1BFTl9TRUxGCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtMVF9TWVNfRExPUEVOX1NFTEZdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfQ19PKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1jIGFuZCAtbyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyLgorIyBUaGlzIG1hY3JvIGRvZXMgbm90IGhhcmQgY29kZSB0aGUgY29tcGlsZXIgbGlrZSBBQ19QUk9HX0NDX0NfTy4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQ19PXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0XSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKV0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKK10pCitfTFRfVEFHREVDTChbY29tcGlsZXJfY19vXSwgW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgWzFdLAorCVtEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/XSkKK10pIyBfTFRfQ09NUElMRVJfQ19PCisKKworIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKK200X2RlZnVuKFtfTFRfQ09NUElMRVJfRklMRV9MT0NLU10sCitbbTRfcmVxdWlyZShbX0xUX0VOQUJMRV9MT0NLXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTVBJTEVSX0NfTyhbJDFdKQorCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorX0xUX0RFQ0woW10sIFtuZWVkX2xvY2tzXSwgWzFdLCBbTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/XSkKK10pIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUworCisKKyMgX0xUX0NIRUNLX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NIRUNLX09CSkRJUl0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKK1tybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKK29iamRpcj0kbHRfY3Zfb2JqZGlyCitfTFRfREVDTChbXSwgW29iamRpcl0sIFswXSwKKyAgICAgICAgIFtUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXNdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbTFRfT0JKRElSXSlkbmwKK0FDX0RFRklORV9VTlFVT1RFRChMVF9PQkpESVIsICIkbHRfY3Zfb2JqZGlyLyIsCisgIFtEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLl0pCitdKSMgX0xUX0NIRUNLX09CSkRJUgorCisKKyMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSF0sCitbQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKK19MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9CitpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8CisgICB0ZXN0IC1uICIkX0xUX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fAorICAgdGVzdCAiWCRfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCisgICAgIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKK2ZpCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCisKK2lmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluayB8fAorICAgdGVzdCAiJF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpIiA9IHllczsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYWN0aW9uXSwgWzBdLAorICAgIFtIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZV0pCitdKSMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRICisKKworIyBfTFRfQ01EX1NUUklQTElCCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX1NUUklQTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgZmkKKyAgICA7OworICAqKQorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW10sIFtvbGRfc3RyaXBsaWJdLCBbMV0sIFtDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzdHJpcGxpYl0sIFsxXSkKK10pIyBfTFRfQ01EX1NUUklQTElCCisKKworIyBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKK200X2lmKFskMV0sCisJW10sIFsKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW1tBLVphLXpdXTpcKSxcMSxnIiA7OworICAgICopIGx0X3NlZF9zdHJpcF9lcT0icyw9LywvLGciIDs7CisgIGVzYWMKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGF3ayAkbHRfYXdrX2FyZyB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgJGx0X3NlZF9zdHJpcF9lcWAKKyAgY2FzZSAkbHRfc2VhcmNoX3BhdGhfc3BlYyBpbgorICAqXDsqKQorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAncy87LyAvZydgCisgICAgOzsKKyAgKikKKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICA7OworICBlc2FjCisgICMgT2ssIG5vdyB3ZSBoYXZlIHRoZSBwYXRoLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCB3ZSBjYW4gc3RlcCB0aHJvdWdoIGl0CisgICMgYW5kIGFkZCBtdWx0aWxpYiBkaXIgaWYgbmVjZXNzYXJ5LgorICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0KKyAgbHRfbXVsdGlfb3NfZGlyPWAkQ0MgJENQUEZMQUdTICRDRkxBR1MgJExERkxBR1MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSAyPi9kZXYvbnVsbGAKKyAgZm9yIGx0X3N5c19wYXRoIGluICRsdF9zZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGlmIHRlc3QgLWQgIiRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIjsgdGhlbgorICAgICAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciIKKyAgICBlbHNlCisgICAgICB0ZXN0IC1kICIkbHRfc3lzX3BhdGgiICYmIFwKKwlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKKyAgICBmaQorICBkb25lCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMiIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW1tsdF9mb29dXSsrOyB9CisgIGlmIChsdF9mcmVxW1tsdF9mb29dXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocworICAjIGZvciB0aGVzZSBob3N0cy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAorICAgICAgJFNFRCAncywvXChbW0EtWmEtel1dOlwpLFwxLGcnYCA7OworICBlc2FjCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRsdF9OTDJTUGAKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmldKQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbWzQtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworbTRfaWYoWyQxXSwgW10sWworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSJdKQorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uZGxsLmxpYicKKworICAgIGNhc2UgJGJ1aWxkX29zIGluCisgICAgbWluZ3cqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPQorICAgICAgbHRfc2F2ZV9pZnM9JElGUworICAgICAgSUZTPSc7JworICAgICAgZm9yIGx0X3BhdGggaW4gJExJQgorICAgICAgZG8KKyAgICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgICAjIExldCBET1MgdmFyaWFibGUgZXhwYW5zaW9uIHByaW50IHRoZSBzaG9ydCA4LjMgc3R5bGUgZmlsZSBuYW1lLgorICAgICAgICBsdF9wYXRoPWBjZCAiJGx0X3BhdGgiIDI+L2Rldi9udWxsICYmIGNtZCAvL0MgImZvciAlaSBpbiAoIi4iKSBkbyBAZWNobyAlfnNpImAKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjICRsdF9wYXRoIgorICAgICAgZG9uZQorICAgICAgSUZTPSRsdF9zYXZlX2lmcworICAgICAgIyBDb252ZXJ0IHRvIE1TWVMgc3R5bGUuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IHNlZCAtZSAnc3xcXFxcfC98ZycgLWUgJ3N8IFxcKFtbYS16QS1aXV1cXCk6fCAvXFwxfGcnIC1lICdzfF4gfHwnYAorICAgICAgOzsKKyAgICBjeWd3aW4qKQorICAgICAgIyBDb252ZXJ0IHRvIHVuaXggZm9ybSwgdGhlbiB0byBkb3MgZm9ybSwgdGhlbiBiYWNrIHRvIHVuaXggZm9ybQorICAgICAgIyBidXQgdGhpcyB0aW1lIGRvcyBzdHlsZSAobm8gc3BhY2VzISkgc28gdGhhdCB0aGUgdW5peCBmb3JtIGxvb2tzCisgICAgICAjIGxpa2UgL2N5Z2RyaXZlL2MvUFJPR1JBfjE6L2N5Z2RyLi4uCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJExJQiJgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tZG9zICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiAyPi9kZXYvbnVsbGAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICA7OworICAgICopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRMSUIiCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisgIGVzYWMKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworbTRfaWYoWyQxXSwgW10sWworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiXSkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMjNdXS4qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMi4qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCisgIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUgfCBnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBBQ19DQUNIRV9WQUwoW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sCisgICAgW2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSlcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgorICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKyAgICAgIFtBU19JRihbICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbF0sCisJIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzXSldKQorICAgIExERkxBR1M9JHNhdmVfTERGTEFHUworICAgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKyAgICBdKQorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZGVsZiotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCitfTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAorICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQorX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCisgICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQorX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCitfTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKK19MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCitfTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKKyAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCitfTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKK19MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAorICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCitfTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAorICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKK19MVF9ERUNMKFtdLCBbaW5zdGFsbF9vdmVycmlkZV9tb2RlXSwgWzFdLAorICAgIFtQZXJtaXNzaW9uIG1vZGUgb3ZlcnJpZGUgZm9yIGluc3RhbGxhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKK19MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCisgICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKKyAgICBub3Qgc2hvd25dXSkKK19MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKKyAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKKworCisjIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCitbY2FzZSAkTUFHSUNfQ01EIGluCitbW1xcLypdIHwgID86W1xcL10qXSkKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjXSkKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK19MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAorCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCitdKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKK200X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCitbX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkjIF9MVF9QQVRIX01BR0lDCisKKworIyBMVF9QQVRIX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0xUX1BBVEhfTERdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorX0xUX1BBVEhfTERfR05VCitBQ19TVUJTVChbTERdKQorCitfTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCitdKSMgTFRfUEFUSF9MRAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQorQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTERfR05VCisjLSAtLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIF9MVF9QQVRIX0xEX0dOVQorCisKKyMgX0xUX0NNRF9SRUxPQUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK200X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAorICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKKyAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPWZhbHNlCisgICAgZmkKKyAgICA7OworICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2ZsYWddLCBbMV0sIFtIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzXSlkbmwKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2NtZHNdLCBbMl0pZG5sCitdKSMgX0xUX0NNRF9SRUxPQUQKKworCisjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gY2hlY2sgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAorW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFtbNC05XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitjZWdjYyopCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGWyAtXVswLTldWzAtOV0pKC1iaXQpPyggW0xNXVNCKT8gc2hhcmVkIG9iamVjdCggZmlsZSk/WywgLV0qIFBBLVJJU0MgWzAtOV1cLlswLTldJ10KKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dXC5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251IHwgZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworKm50byogfCAqcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8XC5zb3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3Jkb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3RwZiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCitdKQorCitmaWxlX21hZ2ljX2dsb2I9Cit3YW50X25vY2FzZWdsb2I9bm8KK2lmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgbWluZ3cqIHwgcHczMiopCisgICAgaWYgKCBzaG9wdCB8IGdyZXAgbm9jYXNlZ2xvYiApID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgd2FudF9ub2Nhc2VnbG9iPXllcworICAgIGVsc2UKKyAgICAgIGZpbGVfbWFnaWNfZ2xvYj1gZWNobyBhQWJCY0NkRGVFZkZnR2hIaUlqSmtLbExtTW5Ob09wUHFRclJzU3RUdVV2VndXeFh5WXpaIHwgJFNFRCAtZSAicy9cKC4uXCkvc1wvW1tcMV1dXC9bW1wxXV1cL2c7L2ciYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworZmkKKworZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCitfTFRfREVDTChbXSwgW2RlcGxpYnNfY2hlY2tfbWV0aG9kXSwgWzFdLAorICAgIFtNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0c10pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK19MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19nbG9iXSwgWzFdLAorICAgIFtIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCitfTFRfREVDTChbXSwgW3dhbnRfbm9jYXNlZ2xvYl0sIFsxXSwKKyAgICBbRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK10pIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisKKworIyBMVF9QQVRIX05NCisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gYSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKFtMVF9QQVRIX05NXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSldLCBsdF9jdl9wYXRoX05NLAorW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KK2ZpXSkKK2lmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCisgIE5NPSIkbHRfY3ZfcGF0aF9OTSIKK2Vsc2UKKyAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6CisgICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGVsc2UKKyAgICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbZHVtcGJpbiAibGluayAtZHVtcCJdLCA6KQorICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgKkNPRkYqKQorICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCisgICAgICA7OworICAgICopCisgICAgICBEVU1QQklOPToKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBBQ19TVUJTVChbRFVNUEJJTl0pCisgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KKyAgICBOTT0iJERVTVBCSU4iCisgIGZpCitmaQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQorQUNfU1VCU1QoW05NXSkKK19MVF9ERUNMKFtdLCBbTk1dLCBbMV0sIFtBIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3Rlcl0pZG5sCisKK0FDX0NBQ0hFX0NIRUNLKFt0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlXSwgW2x0X2N2X25tX2ludGVyZmFjZV0sCisgIFtsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCAiJGFjX2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogb3V0cHV0XCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIGNhdCBjb25mdGVzdC5vdXQgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqXSkKK10pIyBMVF9QQVRIX05NCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCitBVV9BTElBUyhbQUNfUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCisKKyMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKKyMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgbGluayBsaWJyYXJ5LgorIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX0RMTFRPT0xdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXNdLAorbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQsCitbbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J3Vua25vd24nCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgIyB0d28gZGlmZmVyZW50IHNoZWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGx0bWFpbi5zaAorICAjIGRlY2lkZSB3aGljaCB0byB1c2UgYmFzZWQgb24gY2FwYWJpbGl0aWVzIG9mICRETExUT09MCisgIGNhc2UgYCRETExUT09MIC0taGVscCAyPiYxYCBpbgorICAqLS1pZGVudGlmeS1zdHJpY3QqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYgorICAgIDs7CisgICopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrCisgICAgOzsKKyAgZXNhYworICA7OworKikKKyAgIyBmYWxsYmFjazogYXNzdW1lIGxpbmtsaWIgSVMgc2hhcmVkbGliCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSIkRUNITyIKKyAgOzsKK2VzYWMKK10pCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKK3Rlc3QgLXogIiRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgJiYgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JEVDSE8KKworX0xUX0RFQ0woW10sIFtzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byBhc3NvY2lhdGUgc2hhcmVkIGFuZCBsaW5rIGxpYnJhcmllc10pCitdKSMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKworCisjIF9MVF9QQVRIX01BTklGRVNUX1RPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsb2NhdGUgdGhlIG1hbmlmZXN0IHRvb2wKK200X2RlZnVuKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSwKK1tBQ19DSEVDS19UT09MKE1BTklGRVNUX1RPT0wsIG10LCA6KQordGVzdCAteiAiJE1BTklGRVNUX1RPT0wiICYmIE1BTklGRVNUX1RPT0w9bXQKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2xdLCBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sXSwKKyAgW2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAkTUFOSUZFU1RfVE9PTCAnLT8nIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0CisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnTWFuaWZlc3QgVG9vbCcgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPXllcworICBmaQorICBybSAtZiBjb25mdGVzdCpdKQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorX0xUX0RFQ0woW10sIFtNQU5JRkVTVF9UT09MXSwgWzFdLCBbTWFuaWZlc3QgdG9vbF0pZG5sCitdKSMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorCisKKyMgTFRfTElCX00KKyMgLS0tLS0tLS0KKyMgY2hlY2sgZm9yIG1hdGggbGlicmFyeQorQUNfREVGVU4oW0xUX0xJQl9NXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitMSUJNPQorY2FzZSAkaG9zdCBpbgorKi0qLWJlb3MqIHwgKi0qLWNlZ2NjKiB8ICotKi1jeWd3aW4qIHwgKi0qLWhhaWt1KiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKKyAgOzsKKyopCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCisgIDs7Citlc2FjCitBQ19TVUJTVChbTElCTV0pCitdKSMgTFRfTElCX00KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19DSEVDS19MSUJNXSwgW0xUX0xJQl9NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX05PX1JUVEldLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIG52Y2MqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicgOzsKKyAgZXNhYworCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKKyAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQorZmkKK19MVF9UQUdERUNMKFtub19idWlsdGluX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnNdKQorXSkjIF9MVF9DT01QSUxFUl9OT19SVFRJCisKKworIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbW0JDREVHUVJTVF1dJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tbQkRSVF1dJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW1tBQkRUXV0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW1tERk5TVFVdXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpW1sgXV0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXClbWyBdXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwobGliW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgWyciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvXkNPRkYgU1lNQk9MIFRBQkxFL3tmb3IoaSBpbiBoaWRlKSBkZWxldGUgaGlkZVtpXX07IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZnhdIgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbCSBdXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbCSBdXVtbCSBdXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK19MVF9FT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK0xUQCZ0QF9ETFNZTV9DT05TVCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICAgICAgICphZGRyZXNzOworfQorbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQoreworICB7ICJAUFJPR1JBTUAiLCAodm9pZCAqKSAwIH0sCitfTFRfRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitfTFRfRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9nbG9ic3ltX3NhdmVfTElCUz0kTElCUworCSAgbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSIKKwkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSRsdF9nbG9ic3ltX3NhdmVfTElCUworCSAgQ0ZMQUdTPSRsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCitlbHNlCisgIEFDX01TR19SRVNVTFQob2spCitmaQorCisjIFJlc3BvbnNlIGZpbGUgc3VwcG9ydC4KK2lmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZWxpZiAkTk0gLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAnW1tAXV1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKworX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwgWzFdLAorICAgIFtUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWRdKQorX0xUX0RFQ0woW10sIFtubV9maWxlX2xpc3Rfc3BlY10sIFsxXSwKKyAgICBbU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciAkTk1dKQorXSkgIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisKKworIyBfTFRfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX1BJQ10sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKyAgICAqZGpncHAqKQorICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgICA7OworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFtbNC05XV0qKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorCSMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKwkjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorCW00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwkgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUgfCBnbnUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1YbGlua2VyICcKKyAgICAgIGlmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iLVhjb21waWxlciAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIgorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUgfCBnbnUqKQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLS1zaGFyZWQnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctLXN0YXRpYycKKwk7OworICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwtV2wsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDZXJlc1wgRm9ydHJhbiogfCAqU3VuKkZvcnRyYW4qXCBbWzEtN11dLiogfCAqU3VuKkZvcnRyYW4qXCA4LltbMC0zXV0qKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJworCSAgOzsKKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICA7OworICAgICAgICAqSW50ZWwqXCBbW0NGXV0qQ29tcGlsZXIqKQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgOzsKKwkqUG9ydGxhbmRcIEdyb3VwKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworCitBQ19DQUNIRV9DSEVDSyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpXSwKKyAgICBbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK19MVF9UQUdERUNMKFtwaWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFsxXSwKKwlbQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzXSkKKworX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCisJW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitfTFRfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAorICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRsdF90bXBfc3RhdGljX2ZsYWcsCisgIFtdLAorICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCitfTFRfVEFHREVDTChbbGlua19zdGF0aWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZ10pCitdKSMgX0xUX0NPTVBJTEVSX1BJQworCisKKyMgX0xUX0xJTktFUl9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAorW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCittNF9pZihbJDFdLCBbQ1hYXSwgWworICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbWzQtOV1dKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsIGRlZmluZWQKKyAgICAjIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKQorICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87cy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJ10KKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgIDs7CisgIGVzYWMKK10sIFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCisgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KKyAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KK2RubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBsaW51eCogfCBrKmJzZCotZ251IHwgZ251KikKKyAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuW1syLTldXSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgW1szLTldXSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbWzMtOV1dKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuMTksIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLztzL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnXQorCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OworCXhsW1tjQ11dKiB8IGJneGxbW2NDXV0qIHwgbXBpeGxbW2NDXV0qKSAjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJICB0bXBfc2hhcmVkZmxhZz0nLXFta3Nocm9iaicKKwkgIHRtcF9hZGRmbGFnPSA7OworCW52Y2MqKQkjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisJICA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKiB8IGJnZiogfCBiZ3hsZiogfCBtcGl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCV9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyLiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCW00X2lmKCQxLCBbXSwgWworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIF9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkQ0MgdW5kZXJzdGFuZHMgLWJdLAorCSAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfX2IsICQxKSwgWy1iXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10sCisJICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJ10pXSwKKwkgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddKQorCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbF0sCisJICBbc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgQUNfTElOS19JRkVMU0UoCisJICAgICBbQUNfTEFOR19TT1VSQ0UoCisJICAgICAgICBbQUNfTEFOR19DQVNFKFtDXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbQysrXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbRm9ydHJhbiA3N10sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0sCisJCQkgICAgICBbRm9ydHJhbl0sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0pXSldLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXNdLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ub10pCisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiXSkKKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCogfCBuZXRic2RlbGYqLWdudSkKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIkNvbXBpbGVycyA1LjAiKikKKwkgIHdsYXJjPScnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCSopCisJICB3bGFyYz0nJHt3bH0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwllbHNlCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgeCRob3N0X3ZlbmRvciA9IHhzbmk7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CbGFyZ2VkeW5zeW0nCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorXSkKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworX0xUX1RBR1ZBUih3aXRoX2dudV9sZCwgJDEpPSR3aXRoX2dudV9sZAorCitfTFRfREVDTChbXSwgW2xpYmV4dF0sIFswXSwgW09sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKV0pZG5sCitfTFRfREVDTChbXSwgW3NocmV4dF9jbWRzXSwgWzFdLCBbU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIildKWRubAorX0xUX0RFQ0woW10sIFtleHRyYWN0X2V4cHN5bXNfY21kc10sIFsyXSwKKyAgICBbVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0sCisJW2x0X2N2X11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSksCisJWyRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworCWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisJICBwaWNfZmxhZz0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisJICBjb21waWxlcl9mbGFncz0tdgorCSAgbGlua2VyX2ZsYWdzPS12CisJICB2ZXJzdHJpbmc9CisJICBvdXRwdXRfb2JqZGlyPS4KKwkgIGxpYm5hbWU9Y29uZnRlc3QKKwkgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorCSAgaWYgQUNfVFJZX0VWQUwoX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKKwkgIHRoZW4KKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgIGVsc2UKKwkgICAgbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICBmaQorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisJZmkKKwkkUk0gY29uZnRlc3QqCisJXSkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0kbHRfY3ZfW11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitfTFRfVEFHREVDTChbYnVpbGRfbGlidG9vbF9uZWVkX2xjXSwgW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFthbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXNdLAorICAgIFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zXSkKK19MVF9UQUdERUNMKFtdLCBbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlc10pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX25lZWRzX29iamVjdF0sIFsxXSwKKyAgICBbV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHldKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfY21kc10sIFsyXSwgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisgICAgYSBzaGFyZWQgYXJjaGl2ZS5dKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW3dpdGhfZ251X2xkXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIGFyZSBidWlsZGluZyB3aXRoIEdOVSBsZCBvciBub3RdKQorX0xUX1RBR0RFQ0woW10sIFthbGxvd191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHRdKQorX0xUX1RBR0RFQ0woW10sIFtub191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisgICAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyAgICAiYWJzb2x1dGUiLCBpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyAke3NobGlicGF0aF92YXJ9IGlmIHRoZQorICAgIGxpYnJhcnkgaXMgcmVsb2NhdGVkXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbWludXNfTF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYXV0b21hdGljXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorICAgIGFnYWluc3QgaXRdKQorX0xUX1RBR0RFQ0woW10sIFtpbmhlcml0X3JwYXRoXSwgWzBdLAorICAgIFtTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworICAgIHRvIHJ1bnRpbWUgcGF0aCBsaXN0XSkKK19MVF9UQUdERUNMKFtdLCBbbGlua19hbGxfZGVwbGlic10sIFswXSwKKyAgICBbV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFtdLCBbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWRdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfc3ltYm9sc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbZXhjbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaW5jbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorICBMVF9TWVNfRExPUEVOX1NFTEYKKyAgX0xUX0NNRF9TVFJJUExJQgorCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbWzQtOV1dKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfTUFOSUZFU1RfVE9PTF0pZG5sCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBBQ19QUk9HX0NYWENQUAorZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK0FDX0xBTkdfUFVTSChDKyspCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNwcAorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgQ1hYIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0kQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBsdF9zYXZlX0xEPSRMRAorICBsdF9zYXZlX0dDQz0kR0NDCisgIEdDQz0kR1hYCisgIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisgIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAorICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKKyAgZmkKKyAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKKyAgQ0M9JHtDWFgtImMrKyJ9CisgIENGTEFHUz0kQ1hYRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgICAgICBMVF9QQVRIX0xECisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgICAgIHdsYXJjPScke3dsfScKKworICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKKwkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgICAgd2xhcmM9CisKKyAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIGZpCisKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKyAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICAgICAgZWxzZQorCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIGVsc2UKKwkgICAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgICAgZmkKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKKwkgICAgIyBsaWJyYXJpZXMuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgYmVvcyopCisJaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgY2hvcnVzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAqKQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKwljYXNlICRHWFgsJGNjX2Jhc2VuYW1lIGluCisJLGNsKiB8IG5vLGNsKikKKwkgICMgTmF0aXZlIE1TVkMKKwkgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKwkgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJICBsaWJleHQ9bGliCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwkgIHNocmV4dF9jbWRzPSIuZGxsIgorCSAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAkU0VEIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZWxzZQorCSAgICAgICRTRUQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBmaX4KKwkgICAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgICBsaW5rbmFtZXM9JworCSAgIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSAgIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCSAgIyBEb24ndCB1c2UgcmFubGliCisJICBfTFRfVEFHVkFSKG9sZF9wb3N0aW5zdGFsbF9jbWRzLCAkMSk9J2NobW9kIDY0NCAkb2xkbGliJworCSAgX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgICAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAgICouZXhlfCouRVhFKSA7OworCSAgICAgICopCisJCWx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkJbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkJOzsKKwkgICAgZXNhY34KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRsdF9vdXRwdXRmaWxlIn4KKwkgICAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgICBmaScKKwkgIDs7CisJKikKKwkgICMgZysrCisJICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisJICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKwk7OworCisgICAgICBkZ3V4KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBlYysrKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QyLiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgaGFpa3UqKQorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGhwdXg5KikKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJICAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJICAgICAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgYUNDKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkRUdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDEwKnxocHV4MTEqKQorICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKyAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBhQ0MqKQorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICBpYTY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICAqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgZXNhYworCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaW50ZXJpeFtbMy05XV0qKQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUgfCBnbnUqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIEtDQyopCisJICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKwkgIGljcGMqIHwgZWNwYyogKQorCSAgICAjIEludGVsIEMrKworCSAgICB3aXRoX2dudV9sZD15ZXMKKwkgICAgIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkgICAgIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkgICAgIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwkgICAgY2FzZSBgJENDIC1WIDI+JjFgIGluCisJICAgICAgKiJWZXJzaW9uIDcuIiopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICAgICopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICAgICAgICB0bXBfaWR5bj0KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJCSAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCQllc2FjCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIDs7CisgICAgICAgICAgcGdDQyogfCBwZ2NwcCopCisgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCSAgICBjYXNlIGAkQ0MgLVZgIGluCisJICAgICpwZ0NDXCBbWzEtNV1dLiogfCAqcGdjcHBcIFtbMS01XV0uKikKKwkgICAgICBfTFRfVEFHVkFSKHByZWxpbmtfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgorCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAiJworCSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGB+CisJCSRSQU5MSUIgJG9sZGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgYW5kIGFib3ZlIHVzZSB3ZWFrIHN5bWJvbHMKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwkgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCogfCBtcGl4bCogfCBiZ3hsKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKworCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KKwkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbHlueG9zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG04OGsqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG12cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgY3h4KikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwkgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIG5ldGJzZCopCisgICAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKwkgIHdsYXJjPQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCWZpCisJIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKwk7OworCisgICAgICAqbnRvKiB8ICpxbngqKQorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCTs7CisKKyAgICAgIG9wZW5ic2QyKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBvcGVuYnNkKikKKwlpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworCSAgZmkKKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKwllbHNlCisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworCisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gIiRsaWIiIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgICAqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKyAgICAgICAgICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGN4eCopCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJCTs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgICAgICAgICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgICAgICAgICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAgICAgICAgICRSTSAkbGliLmV4cCcKKwkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwkJOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiIHwgJEdSRVAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAgIG9zZjMqKQorCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICAgICopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgIGVzYWMKKworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKworCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHBzb3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBzdW5vczQqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHNvbGFyaXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCisJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICAgICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkgICAgICAqKQorCQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgorCSAgICAgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkJX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgICAgICBpZiAkQ0MgLS12ZXJzaW9uIHwgJEdSRVAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZWxzZQorCSAgICAgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAgICAgIyBwbGF0Zm9ybS4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKwkgICAgICBmaQorCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwkgICAgICBjYXNlICRob3N0X29zIGluCisJCXNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJCSopCisJCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisJX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJG9sZG9ianN+CisJICAgICAgJyIkX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkiCisJICAgIF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1UcHJlbGlua19vYmplY3RzICRyZWxvYWRfb2Jqc34KKwkgICAgICAnIiRfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSkiCisJICAgIDs7CisJICAqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIEFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKKyAgICB0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkR1hYIgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBDQz0kbHRfc2F2ZV9DQworICBDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCisgIExEQ1hYPSRMRAorICBMRD0kbHRfc2F2ZV9MRAorICBHQ0M9JGx0X3NhdmVfR0NDCisgIHdpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCisgIGx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKKyAgbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECisgIGx0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorZmkgIyB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0NYWF9DT05GSUcKKworCisjIF9MVF9GVU5DX1NUUklQTkFNRV9DTkYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmdW5jX3N0cmlwbmFtZV9jbmYgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIworIyBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgKG5vbi1YU0kpIHZlcnNpb24gb2YgZnVuY19zdHJpcG5hbWUsCisjIGV4Y2VwdCB0aGlzIG9uZSBjYW4gYmUgdXNlZCBieSBtNCBjb2RlIHRoYXQgbWF5IGJlIGV4ZWN1dGVkIGJ5IGNvbmZpZ3VyZSwKKyMgcmF0aGVyIHRoYW4gdGhlIGxpYnRvb2wgc2NyaXB0LgorbTRfZGVmdW4oW19MVF9GVU5DX1NUUklQTkFNRV9DTkZdLFtkbmwKK0FDX1JFUVVJUkUoW19MVF9ERUNMX1NFRF0pCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pCitmdW5jX3N0cmlwbmFtZV9jbmYgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lX2NuZgorXSkjIF9MVF9GVU5DX1NUUklQTkFNRV9DTkYKKworIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCisjIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK200X2RlZnVuKFtfTFRfU1lTX0hJRERFTl9MSUJERVBTXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9GVU5DX1NUUklQTkFNRV9DTkZdKWRubAorIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKK19MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHByZWRlcHMsICQxKT0KK19MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0KK19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9CisKK2RubCB3ZSBjYW4ndCB1c2UgdGhlIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSBoZXJlLAorZG5sIGJlY2F1c2UgaXQgY29udGFpbnMgY29kZSBpbnRlbmRlZCBmb3IgYW4gZXhlY3V0YWJsZSwKK2RubCBub3QgYSBsaWJyYXJ5LiAgSXQncyBwb3NzaWJsZSB3ZSBzaG91bGQgbGV0IGVhY2gKK2RubCB0YWcgZGVmaW5lIGEgbmV3IGx0Xz8/Pz9fbGlua190ZXN0X2NvZGUgdmFyaWFibGUsCitkbmwgYnV0IGl0J3Mgb25seSB1c2VkIGhlcmUuLi4KK200X2lmKFskMV0sIFtdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2ludCBhOwordm9pZCBmb28gKHZvaWQpIHsgYSA9IDA7IH0KK19MVF9FT0YKK10sIFskMV0sIFtDWFhdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK19MVF9FT0YKK10sIFskMV0sIFtGNzddLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyKjQgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0ZDXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbR0NKXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitwdWJsaWMgY2xhc3MgZm9vIHsKKyAgcHJpdmF0ZSBpbnQgYTsKKyAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7CisgICAgYSA9IDA7CisgIH0KK307CitfTFRfRU9GCitdLCBbJDFdLCBbR09dLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3BhY2thZ2UgZm9vCitmdW5jIGZvbygpIHsKK30KK19MVF9FT0YKK10pCisKK19sdF9saWJkZXBzX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2Nhc2UgIiRDQyAkQ0ZMQUdTICIgaW4gIygKKypcIC1mbHRvKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tbHRvIiA7OworKlwgLWZ3aG9wcipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXdob3ByIiA7OworKlwgLWZ1c2UtbGlua2VyLXBsdWdpbipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXVzZS1saW5rZXItcGx1Z2luIiA7OworZXNhYworCitkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Citkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgIGZvciBwIGluIGBldmFsICIkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiYDsgZG8KKyAgICBjYXNlICR7cHJldn0ke3B9IGluCisKKyAgICAtTCogfCAtUiogfCAtbCopCisgICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KKyAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCisgICAgICAgaWYgdGVzdCAkcCA9ICItTCIgfHwKKyAgICAgICAgICB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgICMgRXhwYW5kIHRoZSBzeXNyb290IHRvIGVhc2UgZXh0cmFjdGluZyB0aGUgZGlyZWN0b3JpZXMgbGF0ZXIuCisgICAgICAgaWYgdGVzdCAteiAiJHByZXYiOyB0aGVuCisgICAgICAgICBjYXNlICRwIGluCisgICAgICAgICAtTCopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLUwnICcnICIkcCI7IHByZXY9LUw7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLVIqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1SJyAnJyAiJHAiOyBwcmV2PS1SOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIC1sKikgZnVuY19zdHJpcG5hbWVfY25mICctbCcgJycgIiRwIjsgcHJldj0tbDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICBlc2FjCisgICAgICAgZmkKKyAgICAgICBjYXNlICRwIGluCisgICAgICAgPSopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnPScgJycgIiRwIjsgcD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICBlc2FjCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgY2FzZSAke3ByZXZ9IGluCisJIC1MIHwgLVIpCisJICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCisJICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCisJICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCisJICAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKKwkgICBlbHNlCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgorCSAgIGZpCisJICAgOzsKKwkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKKwkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCisJIGVzYWMKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgorCSBmaQorICAgICAgIGZpCisgICAgICAgcHJldj0KKyAgICAgICA7OworCisgICAgKi5sdG8uJG9iamV4dCkgOzsgIyBJZ25vcmUgR0NDIExUTyBvYmplY3RzCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKK0NGTEFHUz0kX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1MKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK200X2lmKFskMV0sIFtDWFhdLAorW2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbWzMtOV1dKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0KKyAgOzsKKworbGludXgqKQorICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKyAgKlN1blwgQyopCisgICAgIyBTdW4gQysrIDUuOQorCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqIHwgc3VuQ0MqKQorICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworXSkKKworY2FzZSAiICRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgorKiIgLWxjICIqKSBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKK2VzYWMKKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPQoraWYgdGVzdCAtbiAiJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSI7IHRoZW4KKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPWBlY2hvICIgJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSIgfCAke1NFRH0gLWUgJ3MhIC1MISAhZycgLWUgJ3MhXiAhISdgCitmaQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX2RpcnNdLCBbMV0sCisgICAgW1RoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3ByZWRlcF9vYmplY3RzXSwgWzFdLAorICAgIFtEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8KKyAgICBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBfb2JqZWN0c10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFsxXSwKKyAgICBbVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyAgICBhIHNoYXJlZCBsaWJyYXJ5XSkKK10pIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTCisKKworIyBfTFRfTEFOR19GNzdfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiA3NyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfRjc3X0NPTkZJR10sCitbQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCitpZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GNzc9eWVzCitmaQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCithY19leHQ9ZgorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgRjc3IGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCisgICAgICBwcm9ncmFtIHQKKyAgICAgIGVuZAorIgorCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0iJENDIgorICBsdF9zYXZlX0dDQz0kR0NDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgQ0M9JHtGNzctImY3NyJ9CisgIENGTEFHUz0kRkZMQUdTCisgIGNvbXBpbGVyPSRDQworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKyAgR0NDPSRHNzcKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHNzciCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBHQ0M9JGx0X3NhdmVfR0NDCisgIENDPSIkbHRfc2F2ZV9DQyIKKyAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCitmaSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0Y3N19DT05GSUcKKworCisjIF9MVF9MQU5HX0ZDX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfRkNfQ09ORklHXSwKK1tBQ19MQU5HX1BVU0goRm9ydHJhbikKKworaWYgdGVzdCAteiAiJEZDIiB8fCB0ZXN0ICJYJEZDIiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0ZDPXllcworZmkKKworX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmYyB0ZXN0IHNvdXJjZXMuCithY19leHQ9JHthY19mY19zcmNleHQtZn0KKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGZjIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgRkMgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIENDPSR7RkMtImY5NSJ9CisgIENGTEFHUz0kRkNGTEFHUworICBjb21waWxlcj0kQ0MKKyAgR0NDPSRhY19jdl9mY19jb21waWxlcl9nbnUKKworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJGFjX2N2X2ZjX2NvbXBpbGVyX2dudSIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0kbHRfc2F2ZV9DQworICBDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitmaSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRkNfQ09ORklHCisKKworIyBfTFRfTEFOR19HQ0pfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgSmF2YSBDb21waWxlciBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfR0NKX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19HQ0pdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBKYXZhIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1qYXZhCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBKYXZhIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iY2xhc3MgZm9vIHt9IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dDSi0iZ2NqIn0KK0NGTEFHUz0kR0NKRkxBR1MKK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKKworR0NDPSRsdF9zYXZlX0dDQworQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19HQ0pfQ09ORklHCisKKworIyBfTFRfTEFOR19HT19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIEdOVSBHbyBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfR09fQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX0dPXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgR28gdGVzdCBzb3VyY2VzLgorYWNfZXh0PWdvCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBHbyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9InBhY2thZ2UgbWFpbjsgZnVuYyBtYWluKCkgeyB9IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwYWNrYWdlIG1haW47IGZ1bmMgbWFpbigpIHsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworbHRfc2F2ZV9HQ0M9JEdDQworR0NDPXllcworQ0M9JHtHT0MtImdjY2dvIn0KK0NGTEFHUz0kR09GTEFHUworY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBHbyBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKKworQUNfTEFOR19SRVNUT1JFCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitdKSMgX0xUX0xBTkdfR09fQ09ORklHCisKKworIyBfTFRfTEFOR19SQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX1JDXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PXJjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH0nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworbHRfc2F2ZV9HQ0M9JEdDQworR0NDPQorQ0M9JHtSQy0id2luZHJlcyJ9CitDRkxBR1M9Citjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKK19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKworaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICA6CisgIF9MVF9DT05GSUcoJDEpCitmaQorCitHQ0M9JGx0X3NhdmVfR0NDCitBQ19MQU5HX1JFU1RPUkUKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitdKSMgX0xUX0xBTkdfUkNfQ09ORklHCisKKworIyBMVF9QUk9HX0dDSgorIyAtLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR0NKXSwKK1ttNF9pZmRlZihbQUNfUFJPR19HQ0pdLCBbQUNfUFJPR19HQ0pdLAorICBbbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLCBbQV1bTV9QUk9HX0dDSl0sCisgICAgW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osKQorICAgICAgdGVzdCAieCR7R0NKRkxBR1Mrc2V0fSIgPSB4c2V0IHx8IEdDSkZMQUdTPSItZyAtTzIiCisgICAgICBBQ19TVUJTVChHQ0pGTEFHUyldKV0pW11kbmwKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19HQ0pdLCBbTFRfUFJPR19HQ0pdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sIFtdKQorCisKKyMgTFRfUFJPR19HTworIyAtLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19HT10sCitbQUNfQ0hFQ0tfVE9PTChHT0MsIGdjY2dvLCkKK10pCisKKworIyBMVF9QUk9HX1JDCisjIC0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX1JDXSwKK1tBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCkKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19SQ10sIFtMVF9QUk9HX1JDXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sIFtdKQorCisKKyMgX0xUX0RFQ0xfRUdSRVAKKyMgLS0tLS0tLS0tLS0tLS0KKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IGdyZXAKKyMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCittNF9kZWZ1bihbX0xUX0RFQ0xfRUdSRVBdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19GR1JFUF0pZG5sCit0ZXN0IC16ICIkR1JFUCIgJiYgR1JFUD1ncmVwCitfTFRfREVDTChbXSwgW0dSRVBdLCBbMV0sIFtBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lc10pCitfTFRfREVDTChbXSwgW0VHUkVQXSwgWzFdLCBbQW4gRVJFIG1hdGNoZXJdKQorX0xUX0RFQ0woW10sIFtGR1JFUF0sIFsxXSwgW0EgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlcl0pCitkbmwgTm9uLWJsZWVkaW5nLWVkZ2UgYXV0b2NvbmYgZG9lc24ndCBzdWJzdCBHUkVQLCBzbyBkbyBpdCBoZXJlIHRvbworQUNfU1VCU1QoW0dSRVBdKQorXSkKKworCisjIF9MVF9ERUNMX09CSkRVTVAKKyMgLS0tLS0tLS0tLS0tLS0KKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IG9iamR1bXAKKyMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCittNF9kZWZ1bihbX0xUX0RFQ0xfT0JKRFVNUF0sCitbQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK19MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFsxXSwgW0FuIG9iamVjdCBzeW1ib2wgZHVtcGVyXSkKK0FDX1NVQlNUKFtPQkpEVU1QXSkKK10pCisKKyMgX0xUX0RFQ0xfRExMVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSBETExUT09MIHZhcmlhYmxlIGlzIHNldC4KK200X2RlZnVuKFtfTFRfREVDTF9ETExUT09MXSwKK1tBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKQorQUNfU1VCU1QoW0RMTFRPT0xdKQorXSkKKworIyBfTFRfREVDTF9TRUQKKyMgLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCisjIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCittNF9kZWZ1bihbX0xUX0RFQ0xfU0VEXSwKK1tBQ19QUk9HX1NFRAordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorX0xUX0RFQ0woW10sIFtTRURdLCBbMV0sIFtBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK19MVF9ERUNMKFtdLCBbWHNlZF0sIFsiXCRTRUQgLWUgMXMvXlgvLyJdLAorICAgIFtTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbl0pCitdKSMgX0xUX0RFQ0xfU0VECisKK200X2lmbmRlZihbQUNfUFJPR19TRURdLCBbCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfU0VELiAgV2hlbiBpdCBpcyBhdmFpbGFibGUgaW4gICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK200X2RlZnVuKFtBQ19QUk9HX1NFRF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAorWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCitsdF9hY19tYXg9MAorbHRfYWNfY291bnQ9MAorIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKKyMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCitmb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KKyAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgY29udGludWUKKyAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCisgIGx0X2FjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCisgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBicmVhaworICBmaQorICB3aGlsZSB0cnVlOyBkbworICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCisgICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCisgICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKKyAgICBlY2hvID4+Y29uZnRlc3QubmwKKyAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhaworICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKKyAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCisgICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50CisgICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgZmkKKyAgZG9uZQorZG9uZQorXSkKK1NFRD0kbHRfY3ZfcGF0aF9TRUQKK0FDX1NVQlNUKFtTRURdKQorQUNfTVNHX1JFU1VMVChbJFNFRF0pCitdKSNBQ19QUk9HX1NFRAorXSkjbTRfaWZuZGVmCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19TRURdLCBbQUNfUFJPR19TRURdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sIFtdKQorCisKKyMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaW5kIG91dCB3aGV0aGVyIHRoZSBzaGVsbCBpcyBCb3VybmUgb3IgWFNJIGNvbXBhdGlibGUsCisjIG9yIGhhcyBzb21lIG90aGVyIHVzZWZ1bCBmZWF0dXJlcy4KK200X2RlZnVuKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0c10pCisjIFRyeSBzb21lIFhTSSBmZWF0dXJlcworeHNpX3NoZWxsPW5vCisoIF9sdF9kdW1teT0iYS9iL2MiCisgIHRlc3QgIiR7X2x0X2R1bW15IyMqL30sJHtfbHRfZHVtbXklLyp9LCR7X2x0X2R1bW15Iz8/fSIke19sdF9kdW1teSUiJF9sdF9kdW1teSJ9LCBcCisgICAgICA9IGMsYS9iLGIvYywgXAorICAgICYmIGV2YWwgJ3Rlc3QgJCgoIDEgKyAxICkpIC1lcSAyIFwKKyAgICAmJiB0ZXN0ICIkeyNfbHRfZHVtbXl9IiAtZXEgNScgKSA+L2Rldi9udWxsIDI+JjEgXAorICAmJiB4c2lfc2hlbGw9eWVzCitBQ19NU0dfUkVTVUxUKFskeHNpX3NoZWxsXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFt4c2lfc2hlbGw9JyR4c2lfc2hlbGwnXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAiKz0iXSkKK2x0X3NoZWxsX2FwcGVuZD1ubworKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJFsxXSs9XCRbMl0iICYmIHRlc3QgIiRmb28iID0gYmFyYmF6ICkgXAorICAgID4vZGV2L251bGwgMj4mMSBcCisgICYmIGx0X3NoZWxsX2FwcGVuZD15ZXMKK0FDX01TR19SRVNVTFQoWyRsdF9zaGVsbF9hcHBlbmRdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2x0X3NoZWxsX2FwcGVuZD0nJGx0X3NoZWxsX2FwcGVuZCddKQorCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgbHRfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgbHRfdW5zZXQ9ZmFsc2UKK2ZpCitfTFRfREVDTChbXSwgW2x0X3Vuc2V0XSwgWzBdLCBbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Il0pZG5sCisKKyMgdGVzdCBFQkNESUMgb3IgQVNDSUkKK2Nhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KKyBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQorICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKKyAgbHRfU1AyTkw9J3RyIFwwNDAgXDAxMicKKyAgbHRfTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJworICA7OworICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQorICBsdF9TUDJOTD0ndHIgXDEwMCBcbicKKyAgbHRfTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCisgIDs7Citlc2FjCitfTFRfREVDTChbU1AyTkxdLCBbbHRfU1AyTkxdLCBbMV0sIFt0dXJuIHNwYWNlcyBpbnRvIG5ld2xpbmVzXSlkbmwKK19MVF9ERUNMKFtOTDJTUF0sIFtsdF9OTDJTUF0sIFsxXSwgW3R1cm4gbmV3bGluZXMgaW50byBzcGFjZXNdKWRubAorXSkjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUworCisKKyMgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRSAoRlVOQ05BTUUsIFJFUExBQ0VNRU5ULUJPRFkpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbiBgJGNmZ2ZpbGUnLCBsb29rIGZvciBmdW5jdGlvbiBGVU5DTkFNRSBkZWxpbWl0ZWQgYnkgYF5GVU5DTkFNRSAoKSQnIGFuZAorIyAnXn0gRlVOQ05BTUUgJywgYW5kIHJlcGxhY2UgaXRzIGJvZHkgd2l0aCBSRVBMQUNFTUVOVC1CT0RZLgorbTRfZGVmdW4oW19MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0VdLAorW2RubCB7CitzZWQgLWUgJy9eJDEgKCkkLywvXn0gIyAkMSAvY1wKKyQxICgpXAore1wKK200X2JwYXRzdWJzdHMoWyQyXSwgWyRdLCBbXFxdLCBbXlwoWwkgXVwpXSwgW1xcXDFdKQorfSAjIEV4dGVuZGVkLXNoZWxsICQxIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitdKQorCisKKyMgX0xUX1BST0dfUkVQTEFDRV9TSEVMTEZOUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlcGxhY2UgZXhpc3RpbmcgcG9ydGFibGUgaW1wbGVtZW50YXRpb25zIG9mIHNldmVyYWwgc2hlbGwgZnVuY3Rpb25zIHdpdGgKKyMgZXF1aXZhbGVudCBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgdGhvc2UgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZS4uCittNF9kZWZ1bihbX0xUX1BST0dfUkVQTEFDRV9TSEVMTEZOU10sCitbaWYgdGVzdCB4IiR4c2lfc2hlbGwiID0geHllczsgdGhlbgorICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Rpcm5hbWVdLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICAgIGVzYWNdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfYmFzZW5hbWVdLCBbZG5sCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZV0sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgICAgZXNhYworICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3RyaXBuYW1lXSwgW2RubAorICAgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmUKKyAgICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7M30KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifQorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3NwbGl0X2xvbmdfb3B0XSwgW2RubAorICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZT0kezElJT0qfQorICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPSR7MSMqPX1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3BsaXRfc2hvcnRfb3B0XSwgW2RubAorICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz0kezEjPz99CisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT0kezElIiRmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcifV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19sbzJvXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi5sbykgZnVuY19sbzJvX3Jlc3VsdD0kezElLmxvfS4ke29iamV4dH0gOzsKKyAgICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OworICAgIGVzYWNdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfeGZvcm1dLCBbICAgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG9dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfYXJpdGhdLCBbICAgIGZ1bmNfYXJpdGhfcmVzdWx0PSQoKCAkWypdICkpXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2xlbl0sIFsgICAgZnVuY19sZW5fcmVzdWx0PSR7IzF9XSkKK2ZpCisKK2lmIHRlc3QgeCIkbHRfc2hlbGxfYXBwZW5kIiA9IHh5ZXM7IHRoZW4KKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcHBlbmRdLCBbICAgIGV2YWwgIiR7MX0rPVxcJHsyfSJdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfYXBwZW5kX3F1b3RlZF0sIFtkbmwKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IgorZG5sIG00IGV4cGFuc2lvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCB0aGVuIHRoZSBzaGVsbCBldmFsIHR1cm5zIHRoYXQgaW50byBcCisgICAgZXZhbCAiJHsxfSs9XFxcXCBcXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCJdKQorCisgICMgU2F2ZSBhIGBmdW5jX2FwcGVuZCcgZnVuY3Rpb24gY2FsbCB3aGVyZSBwb3NzaWJsZSBieSBkaXJlY3QgdXNlIG9mICcrPScKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW1thLXpBLVpfXV1cezEsXH1cKSAiJVwxKz0iJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitlbHNlCisgICMgU2F2ZSBhIGBmdW5jX2FwcGVuZCcgZnVuY3Rpb24gY2FsbCBldmVuIHdoZW4gJys9JyBpcyBub3QgYXZhaWxhYmxlCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFtbYS16QS1aX11dXHsxLFx9XCkgIiVcMT0iJFwxJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitmaQorCitpZiB0ZXN0IHgiJF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWwiID0geCI6IjsgdGhlbgorICBBQ19NU0dfV0FSTihbVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZV0pCitmaQorXSkKKworIyBfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXRlcm1pbmUgd2hpY2ggZmlsZSBuYW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIGJ5CisjIGZ1bmNfdG9faG9zdF9maWxlIChhbmQsIGltcGxpY2l0bHksIGJ5IGZ1bmNfdG9faG9zdF9wYXRoKS4gIFRoZXNlIGFyZSBuZWVkZWQKKyMgZm9yIGNlcnRhaW4gY3Jvc3MtY29tcGlsZSBjb25maWd1cmF0aW9ucyBhbmQgbmF0aXZlIG1pbmd3LgorbTRfZGVmdW4oW19MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQsCitbY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKi0qLWN5Z3dpbiogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqICkgIyB1bmhhbmRsZWQgaG9zdHMgKGFuZCAibm9ybWFsIiBuYXRpdmUgYnVpbGRzKQorICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgIDs7Citlc2FjCitdKQordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWRdKQorX0xUX0RFQ0woW3RvX2hvc3RfZmlsZV9jbWRdLCBbbHRfY3ZfdG9faG9zdF9maWxlX2NtZF0sCisgICAgICAgICBbMF0sIFtjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdF0pZG5sCisKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gdG9vbGNoYWluIGZvcm1hdF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfdG9fdG9vbF9maWxlX2NtZCwKK1sjYXNzdW1lIG9yZGluYXJ5IGNyb3NzIHRvb2xzLCBvciBuYXRpdmUgYnVpbGQuCitsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKK2Nhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworZXNhYworXSkKK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKK0FDX01TR19SRVNVTFQoWyRsdF9jdl90b190b29sX2ZpbGVfY21kXSkKK19MVF9ERUNMKFt0b190b29sX2ZpbGVfY21kXSwgW2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWRdLAorICAgICAgICAgWzBdLCBbY29udmVydCAkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdF0pZG5sCitdKSMgX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlMKZGlmZiAtLWdpdCBhL200L2x0b3B0aW9ucy5tNCBiL200L2x0b3B0aW9ucy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlhY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvbHRvcHRpb25zLm00CkBAIC0wLDAgKzEsMzg0IEBACisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKyMgICBXcml0dGVuIGJ5IEdhcnkgVi4gVmF1Z2hhbiwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDcgbHRvcHRpb25zLm00CisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRPUFRJT05TX1ZFUlNJT05dLCBbbTRfaWYoWzFdKV0pCisKKworIyBfTFRfTUFOR0xFX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfT1BUSU9OXSwKK1tbX0xUX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxX18kMiwgW1teYS16QS1aMC05X11dLCBbX10pXSkKKworCisjIF9MVF9TRVRfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9wdGlvbiBPUFRJT04tTkFNRSBmb3IgbWFjcm8gTUFDUk8tTkFNRSwgYW5kIGlmIHRoZXJlIGlzIGEKKyMgbWF0Y2hpbmcgaGFuZGxlciBkZWZpbmVkLCBkaXNwYXRjaCB0byBpdC4gIE90aGVyIE9QVElPTi1OQU1FcyBhcmUKKyMgc2F2ZWQgYXMgYSBmbGFnLgorbTRfZGVmaW5lKFtfTFRfU0VUX09QVElPTl0sCitbbTRfZGVmaW5lKF9MVF9NQU5HTEVfT1BUSU9OKFskMV0sIFskMl0pKWRubAorbTRfaWZkZWYoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwKKyAgICAgICAgX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwKKyAgICBbbTRfd2FybmluZyhbVW5rbm93biAkMSBvcHRpb24gYCQyJ10pXSlbXWRubAorXSkKKworCisjIF9MVF9JRl9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUsIElGLVNFVCwgW0lGLU5PVC1TRVRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCittNF9kZWZpbmUoW19MVF9JRl9PUFRJT05dLAorW200X2lmZGVmKF9MVF9NQU5HTEVfT1BUSU9OKFskMV0sIFskMl0pLCBbJDNdLCBbJDRdKV0pCisKKworIyBfTFRfVU5MRVNTX09QVElPTlMoTUFDUk8tTkFNRSwgT1BUSU9OLUxJU1QsIElGLU5PVC1TRVQpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhlY3V0ZSBJRi1OT1QtU0VUIHVubGVzcyBhbGwgb3B0aW9ucyBpbiBPUFRJT04tTElTVCBmb3IgTUFDUk8tTkFNRQorIyBhcmUgc2V0LgorbTRfZGVmaW5lKFtfTFRfVU5MRVNTX09QVElPTlNdLAorW200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorCSAgICBbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgX0xUX09wdGlvbiksCisJCSAgICAgIFttNF9kZWZpbmUoWyQwX2ZvdW5kXSldKV0pW11kbmwKK200X2lmZGVmKFskMF9mb3VuZF0sIFttNF91bmRlZmluZShbJDBfZm91bmRdKV0sIFskMworXSlbXWRubAorXSkKKworCisjIF9MVF9TRVRfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUFRJT04tTElTVCBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIExpYnRvb2wgb3B0aW9ucyBhc3NvY2lhdGVkCisjIHdpdGggTUFDUk8tTkFNRS4gIElmIGFueSBPUFRJT04gaGFzIGEgbWF0Y2hpbmcgaGFuZGxlciBkZWNsYXJlZCB3aXRoCisjIExUX09QVElPTl9ERUZJTkUsIGRpc3BhdGNoIHRvIHRoYXQgbWFjcm87IG90aGVyd2lzZSBjb21wbGFpbiBhYm91dAorIyB0aGUgdW5rbm93biBvcHRpb24gYW5kIGV4aXQuCittNF9kZWZ1bihbX0xUX1NFVF9PUFRJT05TXSwKK1sjIFNldCBvcHRpb25zCittNF9mb3JlYWNoKFtfTFRfT3B0aW9uXSwgbTRfc3BsaXQobTRfbm9ybWFsaXplKFskMl0pKSwKKyAgICBbX0xUX1NFVF9PUFRJT04oWyQxXSwgX0xUX09wdGlvbildKQorCittNF9pZihbJDFdLFtMVF9JTklUXSxbCisgIGRubAorICBkbmwgU2ltcGx5IHNldCBzb21lIGRlZmF1bHQgdmFsdWVzIChpLmUgb2ZmKSBpZiBib29sZWFuIG9wdGlvbnMgd2VyZSBub3QKKyAgZG5sIHNwZWNpZmllZDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW2Rsb3Blbl0sIFtlbmFibGVfZGxvcGVuPW5vCisgIF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFt3aW4zMi1kbGxdLCBbZW5hYmxlX3dpbjMyX2RsbD1ubworICBdKQorICBkbmwKKyAgZG5sIElmIG5vIHJlZmVyZW5jZSB3YXMgbWFkZSB0byB2YXJpb3VzIHBhaXJzIG9mIG9wcG9zaW5nIG9wdGlvbnMsIHRoZW4KKyAgZG5sIHdlIHJ1biB0aGUgZGVmYXVsdCBtb2RlIGhhbmRsZXIgZm9yIHRoZSBwYWlyLiAgRm9yIGV4YW1wbGUsIGlmIG5laXRoZXIKKyAgZG5sIGBzaGFyZWQnIG5vciBgZGlzYWJsZS1zaGFyZWQnIHdhcyBwYXNzZWQsIHdlIGVuYWJsZSBidWlsZGluZyBvZiBzaGFyZWQKKyAgZG5sIGFyY2hpdmVzIGJ5IGRlZmF1bHQ6CisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzaGFyZWQgZGlzYWJsZS1zaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRURdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbc3RhdGljIGRpc2FibGUtc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3BpYy1vbmx5IG5vLXBpY10sIFtfTFRfV0lUSF9QSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZmFzdC1pbnN0YWxsIGRpc2FibGUtZmFzdC1pbnN0YWxsXSwKKyAgCQkgICBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExdKQorICBdKQorXSkjIF9MVF9TRVRfT1BUSU9OUworCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFjcm9zIHRvIGhhbmRsZSBMVF9JTklUIG9wdGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBfTFRfTUFOR0xFX0RFRlVOKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTUFOR0xFX0RFRlVOXSwKK1tbX0xUX09QVElPTl9ERUZVTl9dbTRfYnBhdHN1YnN0KG00X3RvdXBwZXIoWyQxX18kMl0pLCBbW15BLVowLTlfXV0sIFtfXSldKQorCisKKyMgTFRfT1BUSU9OX0RFRklORShNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgQ09ERSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbTFRfT1BUSU9OX0RFRklORV0sCitbbTRfZGVmaW5lKF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksIFskM10pW11kbmwKK10pIyBMVF9PUFRJT05fREVGSU5FCisKKworIyBkbG9wZW4KKyMgLS0tLS0tCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rsb3Blbl0sIFtlbmFibGVfZGxvcGVuPXllcworXSkKKworQVVfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkbG9wZW5dKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYGRsb3Blbicgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sIFtdKQorCisKKyMgd2luMzItZGxsCisjIC0tLS0tLS0tLQorIyBEZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgZGxsJ3MuCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sCitbZW5hYmxlX3dpbjMyX2RsbD15ZXMKKworY2FzZSAkaG9zdCBpbgorKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWNlZ2NjKikKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworZXNhYworCit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCitfTFRfREVDTChbXSwgW0FTXSwgICAgICBbMV0sIFtBc3NlbWJsZXIgcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFsxXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbT2JqZWN0IGR1bXBlciBwcm9ncmFtXSlkbmwKK10pIyB3aW4zMi1kbGwKKworQVVfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFt3aW4zMi1kbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHdpbjMyLWRsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sIFtdKQorCisKKyMgX0xUX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcsIGFuZCBzdXBwb3J0cyB0aGUgYHNoYXJlZCcgYW5kCisjIGBkaXNhYmxlLXNoYXJlZCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9saWJ0b29sX2xpYnNdLCBbZW5hYmxlX3NoYXJlZF0sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TSEFSRUQKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3NoYXJlZF0pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW0FDX0VOQUJMRV9TSEFSRUQoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgc3RhdGljJyBhbmQKKyMgYGRpc2FibGUtc3RhdGljJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3N0YXRpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfb2xkX2xpYnNdLCBbZW5hYmxlX3N0YXRpY10sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TVEFUSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3N0YXRpY10pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtBQ19ESVNBQkxFX1NUQVRJQygkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgZmFzdC1pbnN0YWxsJworIyBhbmQgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKKyAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCisKK19MVF9ERUNMKFtmYXN0X2luc3RhbGxdLCBbZW5hYmxlX2Zhc3RfaW5zdGFsbF0sIFswXSwKKwkgW1doZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbl0pZG5sCitdKSMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FVX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW2Zhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitBVV9ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwgW10pCisKKworIyBfTFRfV0lUSF9QSUMoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBwaWMtb25seScgYW5kIGBuby1waWMnCisjIExUX0lOSVQgb3B0aW9ucy4KKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KK200X2RlZmluZShbX0xUX1dJVEhfUElDXSwKK1tBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNAPDpAPVBLR1NAOj5AXSwKKwlbdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlIGJvdGhAOj5AXSldLAorICAgIFtsdF9wPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJHdpdGh2YWwgaW4KKyAgICB5ZXN8bm8pIHBpY19tb2RlPSR3aXRodmFsIDs7CisgICAgKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIGx0X3BrZyBpbiAkd2l0aHZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJGx0X3BrZyIgPSAiWCRsdF9wIjsgdGhlbgorCSAgcGljX21vZGU9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbcGljX21vZGU9ZGVmYXVsdF0pCisKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9bTRfZGVmYXVsdChbJDFdLCBbZGVmYXVsdF0pCisKK19MVF9ERUNMKFtdLCBbcGljX21vZGVdLCBbMF0sIFtXaGF0IHR5cGUgb2Ygb2JqZWN0cyB0byBidWlsZF0pZG5sCitdKSMgX0xUX1dJVEhfUElDCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbcGljLW9ubHldLCBbX0xUX1dJVEhfUElDKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW25vLXBpY10sIFtfTFRfV0lUSF9QSUMoW25vXSldKQorCisjIE9sZCBuYW1lOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbcGljLW9ubHldKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHBpYy1vbmx5JyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sIFtdKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTFRETF9JTklUIE9wdGlvbnMgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisKK200X2RlZmluZShbX0xURExfTU9ERV0sIFtdKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW25vbnJlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW25vbnJlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtyZWN1cnNpdmVdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtyZWN1cnNpdmVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbc3VicHJvamVjdF0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3N1YnByb2plY3RdKV0pCisKK200X2RlZmluZShbX0xURExfVFlQRV0sIFtdKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2luc3RhbGxhYmxlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbaW5zdGFsbGFibGVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbY29udmVuaWVuY2VdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtjb252ZW5pZW5jZV0pXSkKZGlmZiAtLWdpdCBhL200L2x0c3VnYXIubTQgYi9tNC9sdHN1Z2FyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDBhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9sdHN1Z2FyLm00CkBAIC0wLDAgKzEsMTIzIEBACisjIGx0c3VnYXIubTQgLS0gbGlidG9vbCBtNCBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAtKi1BdXRvY29uZi0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdHN1Z2FyLm00CisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRTVUdBUl9WRVJTSU9OXSwgW200X2lmKFswLjFdKV0pCisKKworIyBsdF9qb2luKFNFUCwgQVJHMSwgW0FSRzIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIEFSRzFTRVBBUkcyLi4uU0VQQVJHbiwgb21pdHRpbmcgW10gYXJndW1lbnRzIGFuZCB0aGVpcgorIyBhc3NvY2lhdGVkIHNlcGFyYXRvci4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2pvaW4gZnJvbSBBdXRvY29uZiAyLjYyLCBzaW5jZSBhbGwgZWFybGllcgorIyB2ZXJzaW9ucyBpbiBtNHN1Z2FyIGhhZCBidWdzLgorbTRfZGVmaW5lKFtsdF9qb2luXSwKK1ttNF9pZihbJCNdLCBbMV0sIFtdLAorICAgICAgIFskI10sIFsyXSwgW1skMl1dLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCittNF9kZWZpbmUoW19sdF9qb2luXSwKK1ttNF9pZihbJCMkMl0sIFsyXSwgW10sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCisKKworIyBsdF9jYXIoTElTVCkKKyMgbHRfY2RyKExJU1QpCisjIC0tLS0tLS0tLS0tLQorIyBNYW5pcHVsYXRlIG00IGxpc3RzLgorIyBUaGVzZSBtYWNyb3MgYXJlIG5lY2Vzc2FyeSBhcyBsb25nIGFzIHdpbGwgc3RpbGwgbmVlZCB0byBzdXBwb3J0CisjIEF1dG9jb25mLTIuNTkgd2hpY2ggcXVvdGVzIGRpZmZlcmVudGx5LgorbTRfZGVmaW5lKFtsdF9jYXJdLCBbWyQxXV0pCittNF9kZWZpbmUoW2x0X2Nkcl0sCitbbTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKKyAgICAgICBbJCNdLCAxLCBbXSwKKyAgICAgICBbbTRfZHF1b3RlKG00X3NoaWZ0KCRAKSldKV0pCittNF9kZWZpbmUoW2x0X3VucXVvdGVdLCAkMSkKKworCisjIGx0X2FwcGVuZChNQUNSTy1OQU1FLCBTVFJJTkcsIFtTRVBBUkFUT1JdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVkZWZpbmUgTUFDUk8tTkFNRSB0byBob2xkIGl0cyBmb3JtZXIgY29udGVudCBwbHVzIGBTRVBBUkFUT1InYFNUUklORycuCisjIE5vdGUgdGhhdCBuZWl0aGVyIFNFUEFSQVRPUiBub3IgU1RSSU5HIGFyZSBleHBhbmRlZDsgdGhleSBhcmUgYXBwZW5kZWQKKyMgdG8gTUFDUk8tTkFNRSBhcyBpcyAobGVhdmluZyB0aGUgZXhwYW5zaW9uIGZvciB3aGVuIE1BQ1JPLU5BTUUgaXMgaW52b2tlZCkuCisjIE5vIFNFUEFSQVRPUiBpcyBvdXRwdXQgaWYgTUFDUk8tTkFNRSB3YXMgcHJldmlvdXNseSB1bmRlZmluZWQgKGRpZmZlcmVudAorIyB0aGFuIGRlZmluZWQgYW5kIGVtcHR5KS4KKyMKKyMgVGhpcyBtYWNybyBpcyBuZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gQXV0b2NvbmYgMi42Miwgc2luY2UgZWFybGllcgorIyB2ZXJzaW9ucyBvZiBtNHN1Z2FyIG1pc3Rha2VubHkgZXhwYW5kZWQgU0VQQVJBVE9SIGJ1dCBub3QgU1RSSU5HLgorbTRfZGVmaW5lKFtsdF9hcHBlbmRdLAorW200X2RlZmluZShbJDFdLAorCSAgIG00X2lmZGVmKFskMV0sIFttNF9kZWZuKFskMV0pWyQzXV0pWyQyXSldKQorCisKKworIyBsdF9jb21iaW5lKFNFUCwgUFJFRklYLUxJU1QsIElORklYLCBTVUZGSVgxLCBbU1VGRklYMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBhIFNFUCBkZWxpbWl0ZWQgbGlzdCBvZiBhbGwgcGFpcmVkIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZgorIyBQUkVGSVgtTElTVCB3aXRoIFNVRkZJWDEgdGhyb3VnaCBTVUZGSVhuLiAgRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0CisjIGhhcyB0aGUgZm9ybSBQUkVGSVhtSU5GSVhTVUZGSVhuLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfY29tYmluZSBhZGRlZCBpbiBBdXRvY29uZiAyLjYyLgorbTRfZGVmaW5lKFtsdF9jb21iaW5lXSwKK1ttNF9pZihtNF9ldmFsKFskIyA+IDNdKSwgWzFdLAorICAgICAgIFttNF9wdXNoZGVmKFtfTHRfc2VwXSwgW200X2RlZmluZShbX0x0X3NlcF0sIG00X2RlZm4oW2x0X2Nhcl0pKV0pXV1kbmwKK1tbbTRfZm9yZWFjaChbX0x0X3ByZWZpeF0sIFskMl0sCisJICAgICBbbTRfZm9yZWFjaChbX0x0X3N1ZmZpeF0sCisJCV1tNF9kcXVvdGUobTRfZHF1b3RlKG00X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpKSlbLAorCVtfTHRfc2VwKFskMV0pW11tNF9kZWZuKFtfTHRfcHJlZml4XSlbJDNdbTRfZGVmbihbX0x0X3N1ZmZpeF0pXSldKV0pXSkKKworCisjIGx0X2lmX2FwcGVuZF91bmlxKE1BQ1JPLU5BTUUsIFZBUk5BTUUsIFtTRVBBUkFUT1JdLCBbVU5JUV0sIFtOT1QtVU5JUV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmZiBNQUNSTy1OQU1FIGRvZXMgbm90IHlldCBjb250YWluIFZBUk5BTUUsIHRoZW4gYXBwZW5kIGl0IChkZWxpbWl0ZWQKKyMgYnkgU0VQQVJBVE9SIGlmIHN1cHBsaWVkKSBhbmQgZXhwYW5kIFVOSVEsIGVsc2UgTk9ULVVOSVEuCittNF9kZWZpbmUoW2x0X2lmX2FwcGVuZF91bmlxXSwKK1ttNF9pZmRlZihbJDFdLAorCSAgW200X2lmKG00X2luZGV4KFskM11tNF9kZWZuKFskMV0pWyQzXSwgWyQzJDIkM10pLCBbLTFdLAorCQkgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSwKKwkJIFskNV0pXSwKKwkgIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0pXSkKKworCisjIGx0X2RpY3RfYWRkKERJQ1QsIEtFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkXSwKK1ttNF9kZWZpbmUoWyQxKCQyKV0sIFskM10pXSkKKworCisjIGx0X2RpY3RfYWRkX3N1YmtleShESUNULCBLRVksIFNVQktFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkX3N1YmtleV0sCitbbTRfZGVmaW5lKFskMSgkMjokMyldLCBbJDRdKV0pCisKKworIyBsdF9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9mZXRjaF0sCitbbTRfaWZ2YWwoWyQzXSwKKwltNF9pZmRlZihbJDEoJDI6JDMpXSwgW200X2RlZm4oWyQxKCQyOiQzKV0pXSksCisgICAgbTRfaWZkZWYoWyQxKCQyKV0sIFttNF9kZWZuKFskMSgkMildKV0pKV0pCisKKworIyBsdF9pZl9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0sIFZBTFVFLCBJRi1UUlVFLCBbSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9pZl9kaWN0X2ZldGNoXSwKK1ttNF9pZihsdF9kaWN0X2ZldGNoKFskMV0sIFskMl0sIFskM10pLCBbJDRdLAorCVskNV0sCisgICAgWyQ2XSldKQorCisKKyMgbHRfZGljdF9maWx0ZXIoRElDVCwgW1NVQktFWV0sIFZBTFVFLCBbU0VQQVJBVE9SXSwgS0VZLCBbLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9maWx0ZXJdLAorW200X2lmKFskNV0sIFtdLCBbXSwKKyAgW2x0X2pvaW4obTRfcXVvdGUobTRfZGVmYXVsdChbJDRdLCBbWywgXV0pKSwKKyAgICAgICAgICAgbHRfdW5xdW90ZShtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfZm9yZWFjaChfTHRfa2V5LCBsdF9jYXIoW200X3NoaWZ0big0LCAkQCldKSwKKwkJICAgICAgW2x0X2lmX2RpY3RfZmV0Y2goWyQxXSwgX0x0X2tleSwgWyQyXSwgWyQzXSwgW19MdF9rZXkgXSldKSkpKSldKVtdZG5sCitdKQpkaWZmIC0tZ2l0IGEvbTQvbHR2ZXJzaW9uLm00IGIvbTQvbHR2ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9sdHZlcnNpb24ubTQKQEAgLTAsMCArMSwyMyBAQAorIyBsdHZlcnNpb24ubTQgLS0gdmVyc2lvbiBudW1iZXJzCQkJLSotIEF1dG9jb25mIC0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQsIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgc2VyaWFsIDMzMzcgbHR2ZXJzaW9uLm00CisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCisKK200X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuNC4yXSkKK200X2RlZmluZShbTFRfUEFDS0FHRV9SRVZJU0lPTl0sIFsxLjMzMzddKQorCitBQ19ERUZVTihbTFRWRVJTSU9OX1ZFUlNJT05dLAorW21hY3JvX3ZlcnNpb249JzIuNC4yJworbWFjcm9fcmV2aXNpb249JzEuMzMzNycKK19MVF9ERUNMKCwgbWFjcm9fdmVyc2lvbiwgMCwgW1doaWNoIHJlbGVhc2Ugb2YgbGlidG9vbC5tNCB3YXMgdXNlZD9dKQorX0xUX0RFQ0woLCBtYWNyb19yZXZpc2lvbiwgMCkKK10pCmRpZmYgLS1naXQgYS9tNC9sdH5vYnNvbGV0ZS5tNCBiL200L2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9sdH5vYnNvbGV0ZS5tNApAQCAtMCwwICsxLDk4IEBACisjIGx0fm9ic29sZXRlLm00IC0tIGFjbG9jYWwgc2F0aXNmeWluZyBvYnNvbGV0ZSBkZWZpbml0aW9ucy4gICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0LgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUgbHR+b2Jzb2xldGUubTQKKworIyBUaGVzZSBleGlzdCBlbnRpcmVseSB0byBmb29sIGFjbG9jYWwgd2hlbiBib290c3RyYXBwaW5nIGxpYnRvb2wuCisjCisjIEluIHRoZSBwYXN0IGxpYnRvb2wubTQgaGFzIHByb3ZpZGVkIG1hY3JvcyB2aWEgQUNfREVGVU4gKG9yIEFVX0RFRlVOKQorIyB3aGljaCBoYXZlIGxhdGVyIGJlZW4gY2hhbmdlZCB0byBtNF9kZWZpbmUgYXMgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUKKyMgZXhwb3J0ZWQgQVBJLCBvciBtb3ZlZCB0byBBdXRvY29uZiBvciBBdXRvbWFrZSB3aGVyZSB0aGV5IGJlbG9uZy4KKyMKKyMgVGhlIHRyb3VibGUgaXMsIGFjbG9jYWwgaXMgYSBiaXQgdGhpY2suICBJdCdsbCBzZWUgdGhlIG9sZCBBQ19ERUZVTgorIyBpbiAvdXNyL3NoYXJlL2FjbG9jYWwvbGlidG9vbC5tNCBhbmQgcmVtZW1iZXIgaXQsIHRoZW4gd2hlbiBpdCBzZWVzIHVzCisjIHVzaW5nIGEgbWFjcm8gd2l0aCB0aGUgc2FtZSBuYW1lIGluIG91ciBsb2NhbCBtNC9saWJ0b29sLm00IGl0J2xsCisjIHB1bGwgdGhlIG9sZCBsaWJ0b29sLm00IGluIChpdCBkb2Vzbid0IHNlZSBvdXIgc2hpbnkgbmV3IG00X2RlZmluZQorIyBhbmQgZG9lc24ndCBrbm93IGFib3V0IEF1dG9jb25mIG1hY3JvcyBhdCBhbGwuKQorIworIyBTbyB3ZSBwcm92aWRlIHRoaXMgZmlsZSwgd2hpY2ggaGFzIGEgc2lsbHkgZmlsZW5hbWUgc28gaXQncyBhbHdheXMKKyMgaW5jbHVkZWQgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBwcm92aWRlcyBhY2xvY2FsIHdpdGggdGhlCisjIEFDX0RFRlVOcyBpdCB3YW50cywgYnV0IHdoZW4gbTQgcHJvY2Vzc2VzIGl0LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nCisjIGJlY2F1c2UgdGhvc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QsIG9yIHdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIuCisjIFdlIHVzZSBBQ19ERUZVTiBvdmVyIEFVX0RFRlVOIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWNsb2NhbC0xLjYuIAorIworIyBBbnl0aW1lIHdlIHdpdGhkcmF3IGFuIEFDX0RFRlVOIG9yIEFVX0RFRlVOLCByZW1lbWJlciB0byBhZGQgaXQgaGVyZS4KKyMgWWVzLCB0aGF0IG1lYW5zIGV2ZXJ5IG5hbWUgb25jZSB0YWtlbiB3aWxsIG5lZWQgdG8gcmVtYWluIGhlcmUgdW50aWwKKyMgd2UgZ2l2ZSB1cCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuNywgYXQgd2hpY2ggcG9pbnQKKyMgd2UgbmVlZCB0byBrZWVwIG9ubHkgdGhvc2UgbmFtZXMgd2hpY2ggd2Ugc3RpbGwgcmVmZXIgdG8uCisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRPQlNPTEVURV9WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU0hFTExfSU5JVF0sCQlbQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19MVE1BSU5dLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19MVE1BSU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdWQVJdLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX1BSRU9QRU5dLAkJW0FDX0RFRlVOKFtBQ19MVERMX1BSRU9QRU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfQ09NUElMRVJdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MT0NLXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xPQ0tdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCVtBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTFRETF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdKV0pCittNF9pZm5kZWYoW0FDX1BBVEhfTUFHSUNdLAkJW0FDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX0dOVV0sCQlbQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSldKQorbTRfaWZuZGVmKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCVtBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX1NFRF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSldKQorbTRfaWZuZGVmKFtfTFRfQ0NfQkFTRU5BTUVdLAkJW0FDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdKV0pCittNF9pZm5kZWYoW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfQUNfUFJPR19MSUJUT09MXSwJCVtBQ19ERUZVTihbX0FDX1BST0dfTElCVE9PTF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TRVRVUF0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19DSEVDS19ETEZDTl0sCQlbQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHQ09ORklHXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX1JDX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9DT05GSUddLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0ZJTEVfTFRETExfQ10sCVtBQ19ERUZVTihbX0xUX0FDX0ZJTEVfTFRETExfQ10pXSkKK200X2lmbmRlZihbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLAlbQUNfREVGVU4oW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfUFJPR19DWFhDUFBdLAkJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19DWFhDUFBdKV0pCittNF9pZm5kZWYoW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwJW0FDX0RFRlVOKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19GNzddKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0ZDXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfRkNdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0NYWF0sCQlbQUNfREVGVU4oW19MVF9QUk9HX0NYWF0pXSkKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQzZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTExIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworIyBGaWxlIGxpc3RzCitjb21tb25faGVhZGVycyA9IGNvbW1vbi5oIHByb3RvdHlwZXMuaCB2ZXJzaW9uLmgKK2NvbW1vbl9zb3VyY2VzID0gdGxzLmMgc3RyLmMgZmlsZS5jIGNsaWVudC5jIGxvZy5jIG9wdGlvbnMuYyBwcm90b2NvbC5jCitjb21tb25fc291cmNlcyArPSBuZXR3b3JrLmMgcmVzb2x2ZXIuYyBzc2wuYyBjdHguYyB2ZXJpZnkuYyBzdGhyZWFkcy5jCitjb21tb25fc291cmNlcyArPSBmZC5jIGRocGFyYW0uYyBjcm9uLmMgc3R1bm5lbC5jCit1bml4X3NvdXJjZXMgPSBwdHkuYyBsaWJ3cmFwLmMgdWlfdW5peC5jCitzaGFyZWRfc291cmNlcyA9IGVudi5jCit3aW4zMl9ndWlfc291cmNlcyA9IHVpX3dpbl9ndWkuYyByZXNvdXJjZXMuaCByZXNvdXJjZXMucmMKK3dpbjMyX2d1aV9zb3VyY2VzICs9IHN0dW5uZWwuaWNvIGFjdGl2ZS5pY28gZXJyb3IuaWNvIGlkbGUuaWNvCit3aW4zMl9jbGlfc291cmNlcyA9IHVpX3dpbl9jbGkuYworCisjIFVuaXggZXhlY3V0YWJsZXMKK2Jpbl9QUk9HUkFNUyA9IHN0dW5uZWwKK3N0dW5uZWxfU09VUkNFUyA9ICQoY29tbW9uX2hlYWRlcnMpICQoY29tbW9uX3NvdXJjZXMpICQodW5peF9zb3VyY2VzKQorYmluX1NDUklQVFMgPSBzdHVubmVsMworCitFWFRSQV9ESVNUID0gc3R1bm5lbDMuaW4KK0NMRUFORklMRVMgPSBzdHVubmVsMworCisjIFVuaXggc2hhcmVkIGxpYnJhcnkKK3BrZ2xpYl9MVExJQlJBUklFUyA9IGxpYnN0dW5uZWwubGEKK2xpYnN0dW5uZWxfbGFfU09VUkNFUyA9ICQoc2hhcmVkX3NvdXJjZXMpCitsaWJzdHVubmVsX2xhX0xERkxBR1MgPSAtYXZvaWQtdmVyc2lvbgorCisjIFJlZCBIYXQgImJ5IGRlc2lnbiIgYnVnICM4MjM2OQorc3R1bm5lbF9DUFBGTEFHUyA9IC1JL3Vzci9rZXJiZXJvcy9pbmNsdWRlCisKKyMgQWRkaXRpb25hbCBwcmVwcm9jZXNvciBkZWZpbml0aW9ucworc3R1bm5lbF9DUFBGTEFHUyArPSAtSSQoU1NMRElSKS9pbmNsdWRlCitzdHVubmVsX0NQUEZMQUdTICs9IC1ETElCRElSPSciJChwa2dsaWJkaXIpIicKK3N0dW5uZWxfQ1BQRkxBR1MgKz0gLURDT05GRElSPSciJChzeXNjb25mZGlyKS9zdHVubmVsIicKKworIyBHZW5lcmF0ZSBhIG5ldyBzZXQgb2YgREggcGFyYW1ldGVycyBmb3IgZWFjaCB2ZXJzaW9uCitkaHBhcmFtLmM6IHZlcnNpb24uaAorCWVjaG8gJyNpbmNsdWRlICJjb21tb24uaCInID5kaHBhcmFtLmMKKwllY2hvICcjaWZuZGVmIE9QRU5TU0xfTk9fREgnID4+ZGhwYXJhbS5jCisJZWNobyAnI2RlZmluZSBETl9uZXcgREhfbmV3JyA+PmRocGFyYW0uYworCW9wZW5zc2wgZGhwYXJhbSAtbm9vdXQgLUMgMjA0OCA+PmRocGFyYW0uYworCWVjaG8gJyNlbmRpZiAvKiBPUEVOU1NMX05PX0RIICovJyA+PmRocGFyYW0uYworCisjIFNTTCBsaWJyYXJ5CitzdHVubmVsX0xERkxBR1MgPSAtTCQoU1NMRElSKS9saWI2NCAtTCQoU1NMRElSKS9saWIgLWxzc2wgLWxjcnlwdG8KKworIyBXaW4zMiBleGVjdXRhYmxlcworCitpZiBBVVRIT1JfVEVTVFMKKyMgSnVzdCBjaGVjayBpZiB0aGUgcHJvZ3JhbXMgY2FuIGJlIGJ1aWx0LCBkb24ndCBwZXJmb3JtIGFueSBhY3R1YWwgdGVzdHMKK2NoZWNrX1BST0dSQU1TID0gc3R1bm5lbC5leGUgdHN0dW5uZWwuZXhlCitlbmRpZgorc3R1bm5lbF9leGVfU09VUkNFUyA9ICQoY29tbW9uX2hlYWRlcnMpICQoY29tbW9uX3NvdXJjZXMpICQod2luMzJfZ3VpX3NvdXJjZXMpCit0c3R1bm5lbF9leGVfU09VUkNFUyA9ICQoY29tbW9uX2hlYWRlcnMpICQoY29tbW9uX3NvdXJjZXMpICQod2luMzJfY2xpX3NvdXJjZXMpCisKKyMgUmVtYWluaW5nIGZpbGVzIHRvIGJlIGluY2x1ZGVkCisjIEVYVFJBX1BST0dSQU1TID0gc3R1bm5lbC5leGUgdHN0dW5uZWwuZXhlCisjIEVYVFJBX0RJU1QgKz0gJCh3aW4zMl9ndWlfc291cmNlcykgJCh3aW4zMl9jbGlfc291cmNlcykKK0VYVFJBX0RJU1QgKz0gbWFrZS5iYXQgbWFrZWNlLmJhdCBtYWtldzMyLmJhdAorRVhUUkFfRElTVCArPSBtaW5ndy5tYWsgZXZjLm1hayB2Yy5tYWsgb3MyLm1haworCisjIHdpbjMyX3NzbF9kaXIgPSAvdXNyL3NyYy9vcGVuc3NsLTAuOS44dS1maXBzCisjIHdpbjMyX2NwcGZsYWdzID0gLUkkKHdpbjMyX3NzbF9kaXIpL2luYzMyCit3aW4zMl9zc2xfZGlyID0gL3Vzci9zcmMvb3BlbnNzbC0xLjAuMmQtaTY4Ngord2luMzJfY3BwZmxhZ3MgPSAtSSQod2luMzJfc3NsX2RpcikvaW5jbHVkZQord2luMzJfY2ZsYWdzID0gLW10aHJlYWRzIC1mc3RhY2stcHJvdGVjdG9yIC1PMgord2luMzJfY2ZsYWdzICs9IC1XYWxsIC1XZXh0cmEgLVdwZWRhbnRpYyAtV2Zvcm1hdD0yIC1XY29udmVyc2lvbiAtV25vLWxvbmctbG9uZword2luMzJfY2ZsYWdzICs9IC1EX0ZPUlRJRllfU09VUkNFPTIgLURVTklDT0RFIC1EX1VOSUNPREUKK3dpbjMyX2xkZmxhZ3MgPSAtbXRocmVhZHMgLWZzdGFjay1wcm90ZWN0b3IgLXMKKword2luMzJfY29tbW9uX2xpYnMgPSAtbHdzMl8zMgord2luMzJfc3NsX2xpYnMgPSAtTCQod2luMzJfc3NsX2RpcikgLWxjcnlwdG8gLWxzc2wKK3dpbjMyX2d1aV9saWJzID0gJCh3aW4zMl9jb21tb25fbGlicykgLWxnZGkzMiAtbHBzYXBpICQod2luMzJfc3NsX2xpYnMpCit3aW4zMl9jbGlfbGlicyA9ICQod2luMzJfY29tbW9uX2xpYnMpICQod2luMzJfc3NsX2xpYnMpCisKK3dpbjMyX2NvbW1vbl9vYmpzID0gdGxzLm9iaiBzdHIub2JqIGZpbGUub2JqIGNsaWVudC5vYmogbG9nLm9iaiBvcHRpb25zLm9iagord2luMzJfY29tbW9uX29ianMgKz0gcHJvdG9jb2wub2JqIG5ldHdvcmsub2JqIHJlc29sdmVyLm9iaiBzc2wub2JqIGN0eC5vYmoKK3dpbjMyX2NvbW1vbl9vYmpzICs9IHZlcmlmeS5vYmogc3RocmVhZHMub2JqIGZkLm9iaiBkaHBhcmFtLm9iaiBjcm9uLm9iagord2luMzJfY29tbW9uX29ianMgKz0gc3R1bm5lbC5vYmoKK3dpbjMyX2d1aV9vYmpzID0gdWlfd2luX2d1aS5vYmogcmVzb3VyY2VzLm9iagord2luMzJfY2xpX29ianMgPSB1aV93aW5fY2xpLm9iagorCit3aW4zMl9wcmVmaXggPSBpNjg2LXc2NC1taW5ndzMyLQord2luMzJfY2MgPSAkKHdpbjMyX3ByZWZpeClnY2MKK3dpbjMyX3dpbmRyZXMgPSAkKHdpbjMyX3ByZWZpeCl3aW5kcmVzCisKK01PU1RMWUNMRUFORklMRVMgPSAkKHdpbjMyX2NvbW1vbl9vYmpzKSAkKHdpbjMyX2d1aV9vYmpzKSAkKHdpbjMyX2NsaV9vYmpzKQorQ0xFQU5GSUxFUyArPSBzdHVubmVsLmV4ZSB0c3R1bm5lbC5leGUKKworIyBkaXN0LWhvb2s6IHN0dW5uZWwuZXhlIHRzdHVubmVsLmV4ZQorCisjIFNVRkZJWEVTID0gLmMgLnJjIC5vYmoKKworc3R1bm5lbC5leGU6ICQod2luMzJfY29tbW9uX29ianMpICQod2luMzJfZ3VpX29ianMpCisJJCh3aW4zMl9jYykgLW13aW5kb3dzICQod2luMzJfbGRmbGFncykgLW8gc3R1bm5lbC5leGUgJCh3aW4zMl9jb21tb25fb2JqcykgJCh3aW4zMl9ndWlfb2JqcykgJCh3aW4zMl9ndWlfbGlicykKKwordHN0dW5uZWwuZXhlOiAkKHdpbjMyX2NvbW1vbl9vYmpzKSAkKHdpbjMyX2NsaV9vYmpzKQorCSQod2luMzJfY2MpICQod2luMzJfbGRmbGFncykgLW8gdHN0dW5uZWwuZXhlICQod2luMzJfY29tbW9uX29ianMpICQod2luMzJfY2xpX29ianMpICQod2luMzJfY2xpX2xpYnMpCisKKyUub2JqOiAlLmMgJChjb21tb25faGVhZGVycykKKwkkKHdpbjMyX2NjKSAtYyAkKHdpbjMyX2NwcGZsYWdzKSAkKHdpbjMyX2NmbGFncykgLW8gJEAgJDwKKworcmVzb3VyY2VzLm9iajogcmVzb3VyY2VzLnJjIHJlc291cmNlcy5oIHZlcnNpb24uaAorCSQod2luMzJfd2luZHJlcykgLS1pbmNsdWRlLWRpciAkKHNyY2RpcikgJDwgJEAKKworZWRpdCA9IHNlZCBcCisJLWUgJ3N8QGJpbmRpcltAXXwkKGJpbmRpcil8ZycKKworc3R1bm5lbDM6IE1ha2VmaWxlCisJJChlZGl0KSAnJChzcmNkaXIpLyRALmluJyA+JEAKKworc3R1bm5lbDM6ICQoc3JjZGlyKS9zdHVubmVsMy5pbgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlLmluIGIvc3JjL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODdmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMjE5IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjE0LjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisKKworVlBBVEggPSBAc3JjZGlyQAorYW1fX2lzX2dudV9tYWtlID0gdGVzdCAtbiAnJChNQUtFRklMRV9MSVNUKScgJiYgdGVzdCAtbiAnJChNQUtFTEVWRUwpJworYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbiA9IFwKKyAgY2FzZSAkJHt0YXJnZXRfb3B0aW9uLX0gaW4gXAorICAgICAgPykgOzsgXAorICAgICAgKikgZWNobyAiYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbjogaW50ZXJuYWwgZXJyb3I6IGludmFsaWQiIFwKKyAgICAgICAgICAgICAgInRhcmdldCBvcHRpb24gJyQke3RhcmdldF9vcHRpb24tfScgc3BlY2lmaWVkIiA+JjI7IFwKKyAgICAgICAgIGV4aXQgMTs7IFwKKyAgZXNhYzsgXAorICBoYXNfb3B0PW5vOyBcCisgIHNhbmVfbWFrZWZsYWdzPSQkTUFLRUZMQUdTOyBcCisgIGlmICQoYW1fX2lzX2dudV9tYWtlKTsgdGhlbiBcCisgICAgc2FuZV9tYWtlZmxhZ3M9JCRNRkxBR1M7IFwKKyAgZWxzZSBcCisgICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCisgICAgICAqXFxbXCBcCV0qKSBcCisgICAgICAgIGJzPVxcOyBcCisgICAgICAgIHNhbmVfbWFrZWZsYWdzPWBwcmludGYgJyVzXG4nICIkJE1BS0VGTEFHUyIgXAorICAgICAgICAgIHwgc2VkICJzLyQkYnMkJGJzWyQkYnMgJCRicwldKi8vZyJgOzsgXAorICAgIGVzYWM7IFwKKyAgZmk7IFwKKyAgc2tpcF9uZXh0PW5vOyBcCisgIHN0cmlwX3RyYWlsb3B0ICgpIFwKKyAgeyBcCisgICAgZmxnPWBwcmludGYgJyVzXG4nICIkJGZsZyIgfCBzZWQgInMvJCQxLiokJC8vImA7IFwKKyAgfTsgXAorICBmb3IgZmxnIGluICQkc2FuZV9tYWtlZmxhZ3M7IGRvIFwKKyAgICB0ZXN0ICQkc2tpcF9uZXh0ID0geWVzICYmIHsgc2tpcF9uZXh0PW5vOyBjb250aW51ZTsgfTsgXAorICAgIGNhc2UgJCRmbGcgaW4gXAorICAgICAgKj0qfC0tKikgY29udGludWU7OyBcCisgICAgICAgIC0qSSkgc3RyaXBfdHJhaWxvcHQgJ0knOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpJPyopIHN0cmlwX3RyYWlsb3B0ICdJJzs7IFwKKyAgICAgICAgLSpPKSBzdHJpcF90cmFpbG9wdCAnTyc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKk8/Kikgc3RyaXBfdHJhaWxvcHQgJ08nOzsgXAorICAgICAgICAtKmwpIHN0cmlwX3RyYWlsb3B0ICdsJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qbD8qKSBzdHJpcF90cmFpbG9wdCAnbCc7OyBcCisgICAgICAtW2RFRG1dKSBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLVtKVF0pIHNraXBfbmV4dD15ZXM7OyBcCisgICAgZXNhYzsgXAorICAgIGNhc2UgJCRmbGcgaW4gXAorICAgICAgKiQkdGFyZ2V0X29wdGlvbiopIGhhc19vcHQ9eWVzOyBicmVhazs7IFwKKyAgICBlc2FjOyBcCisgIGRvbmU7IFwKKyAgdGVzdCAkJGhhc19vcHQgPSB5ZXMKK2FtX19tYWtlX2RyeXJ1biA9ICh0YXJnZXRfb3B0aW9uPW47ICQoYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbikpCithbV9fbWFrZV9rZWVwZ29pbmcgPSAodGFyZ2V0X29wdGlvbj1rOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorYmluX1BST0dSQU1TID0gc3R1bm5lbCQoRVhFRVhUKQorQEFVVEhPUl9URVNUU19UUlVFQGNoZWNrX1BST0dSQU1TID0gc3R1bm5lbC5leGUkKEVYRUVYVCkgXAorQEFVVEhPUl9URVNUU19UUlVFQAl0c3R1bm5lbC5leGUkKEVYRUVYVCkKK3N1YmRpciA9IHNyYworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3Bfc3JjZGlyKS9hdXRvL2RlcGNvbXAKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9jb21waWxlX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9saW5rX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jaGVja19saW5rX2ZsYWcubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcHRocmVhZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9yZXF1aXJlX2RlZmluZWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQocGtnbGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiIFwKKwkiJChERVNURElSKSQoYmluZGlyKSIKK0xUTElCUkFSSUVTID0gJChwa2dsaWJfTFRMSUJSQVJJRVMpCitsaWJzdHVubmVsX2xhX0xJQkFERCA9CithbV9fb2JqZWN0c18xID0gZW52LmxvCithbV9saWJzdHVubmVsX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEpCitsaWJzdHVubmVsX2xhX09CSkVDVFMgPSAkKGFtX2xpYnN0dW5uZWxfbGFfT0JKRUNUUykKK0FNX1ZfbHQgPSAkKGFtX192X2x0X0BBTV9WQCkKK2FtX192X2x0XyA9ICQoYW1fX3ZfbHRfQEFNX0RFRkFVTFRfVkApCithbV9fdl9sdF8wID0gLS1zaWxlbnQKK2FtX192X2x0XzEgPSAKK2xpYnN0dW5uZWxfbGFfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQobGlic3R1bm5lbF9sYV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitQUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKQorYW1fX29iamVjdHNfMiA9CithbV9fb2JqZWN0c18zID0gc3R1bm5lbC10bHMuJChPQkpFWFQpIHN0dW5uZWwtc3RyLiQoT0JKRVhUKSBcCisJc3R1bm5lbC1maWxlLiQoT0JKRVhUKSBzdHVubmVsLWNsaWVudC4kKE9CSkVYVCkgXAorCXN0dW5uZWwtbG9nLiQoT0JKRVhUKSBzdHVubmVsLW9wdGlvbnMuJChPQkpFWFQpIFwKKwlzdHVubmVsLXByb3RvY29sLiQoT0JKRVhUKSBzdHVubmVsLW5ldHdvcmsuJChPQkpFWFQpIFwKKwlzdHVubmVsLXJlc29sdmVyLiQoT0JKRVhUKSBzdHVubmVsLXNzbC4kKE9CSkVYVCkgXAorCXN0dW5uZWwtY3R4LiQoT0JKRVhUKSBzdHVubmVsLXZlcmlmeS4kKE9CSkVYVCkgXAorCXN0dW5uZWwtc3RocmVhZHMuJChPQkpFWFQpIHN0dW5uZWwtZmQuJChPQkpFWFQpIFwKKwlzdHVubmVsLWRocGFyYW0uJChPQkpFWFQpIHN0dW5uZWwtY3Jvbi4kKE9CSkVYVCkgXAorCXN0dW5uZWwtc3R1bm5lbC4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzQgPSBzdHVubmVsLXB0eS4kKE9CSkVYVCkgc3R1bm5lbC1saWJ3cmFwLiQoT0JKRVhUKSBcCisJc3R1bm5lbC11aV91bml4LiQoT0JKRVhUKQorYW1fc3R1bm5lbF9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18yKSAkKGFtX19vYmplY3RzXzMpIFwKKwkkKGFtX19vYmplY3RzXzQpCitzdHVubmVsX09CSkVDVFMgPSAkKGFtX3N0dW5uZWxfT0JKRUNUUykKK3N0dW5uZWxfTERBREQgPSAkKExEQUREKQorc3R1bm5lbF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChzdHVubmVsX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2FtX19vYmplY3RzXzUgPSB0bHMuJChPQkpFWFQpIHN0ci4kKE9CSkVYVCkgZmlsZS4kKE9CSkVYVCkgXAorCWNsaWVudC4kKE9CSkVYVCkgbG9nLiQoT0JKRVhUKSBvcHRpb25zLiQoT0JKRVhUKSBcCisJcHJvdG9jb2wuJChPQkpFWFQpIG5ldHdvcmsuJChPQkpFWFQpIHJlc29sdmVyLiQoT0JKRVhUKSBcCisJc3NsLiQoT0JKRVhUKSBjdHguJChPQkpFWFQpIHZlcmlmeS4kKE9CSkVYVCkgXAorCXN0aHJlYWRzLiQoT0JKRVhUKSBmZC4kKE9CSkVYVCkgZGhwYXJhbS4kKE9CSkVYVCkgXAorCWNyb24uJChPQkpFWFQpIHN0dW5uZWwuJChPQkpFWFQpCithbV9fb2JqZWN0c182ID0gdWlfd2luX2d1aS4kKE9CSkVYVCkKK2FtX3N0dW5uZWxfZXhlX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzIpICQoYW1fX29iamVjdHNfNSkgXAorCSQoYW1fX29iamVjdHNfNikKK3N0dW5uZWxfZXhlX09CSkVDVFMgPSAkKGFtX3N0dW5uZWxfZXhlX09CSkVDVFMpCitzdHVubmVsX2V4ZV9MREFERCA9ICQoTERBREQpCithbV9fb2JqZWN0c183ID0gdWlfd2luX2NsaS4kKE9CSkVYVCkKK2FtX3RzdHVubmVsX2V4ZV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18yKSAkKGFtX19vYmplY3RzXzUpIFwKKwkkKGFtX19vYmplY3RzXzcpCit0c3R1bm5lbF9leGVfT0JKRUNUUyA9ICQoYW1fdHN0dW5uZWxfZXhlX09CSkVDVFMpCit0c3R1bm5lbF9leGVfTERBREQgPSAkKExEQUREKQorU0NSSVBUUyA9ICQoYmluX1NDUklQVFMpCitBTV9WX1AgPSAkKGFtX192X1BfQEFNX1ZAKQorYW1fX3ZfUF8gPSAkKGFtX192X1BfQEFNX0RFRkFVTFRfVkApCithbV9fdl9QXzAgPSBmYWxzZQorYW1fX3ZfUF8xID0gOgorQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCithbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCithbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICAgIiAkQDsKK2FtX192X0dFTl8xID0gCitBTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCithbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfYXRfMCA9IEAKK2FtX192X2F0XzEgPSAKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNACitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9hdXRvL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0FNX1ZfQ0MgPSAkKGFtX192X0NDX0BBTV9WQCkKK2FtX192X0NDXyA9ICQoYW1fX3ZfQ0NfQEFNX0RFRkFVTFRfVkApCithbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgICAiICRAOworYW1fX3ZfQ0NfMSA9IAorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitBTV9WX0NDTEQgPSAkKGFtX192X0NDTERfQEFNX1ZAKQorYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfQEFNX0RFRkFVTFRfVkApCithbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAgICIgJEA7CithbV9fdl9DQ0xEXzEgPSAKK1NPVVJDRVMgPSAkKGxpYnN0dW5uZWxfbGFfU09VUkNFUykgJChzdHVubmVsX1NPVVJDRVMpIFwKKwkkKHN0dW5uZWxfZXhlX1NPVVJDRVMpICQodHN0dW5uZWxfZXhlX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYnN0dW5uZWxfbGFfU09VUkNFUykgJChzdHVubmVsX1NPVVJDRVMpIFwKKwkkKHN0dW5uZWxfZXhlX1NPVVJDRVMpICQodHN0dW5uZWxfZXhlX1NPVVJDRVMpCithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYworYW1fX3RhZ2dlZF9maWxlcyA9ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKFRBR1NfRklMRVMpIFwKKwkkKExJU1ApY29uZmlnLmguaW4KKyMgUmVhZCBhIGxpc3Qgb2YgbmV3bGluZS1zZXBhcmF0ZWQgc3RyaW5ncyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKKyMgYW5kIHByaW50IGVhY2ggb2YgdGhlbSBvbmNlLCB3aXRob3V0IGR1cGxpY2F0ZXMuICBJbnB1dCBvcmRlciBpcworIyAqbm90KiBwcmVzZXJ2ZWQuCithbV9fdW5pcXVpZnlfaW5wdXQgPSAkKEFXSykgJ1wKKyAgQkVHSU4geyBub25lbXB0eSA9IDA7IH0gXAorICB7IGl0ZW1zWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGl0ZW1zKSBwcmludCBpOyB9OyB9IFwKKycKKyMgTWFrZSBzdXJlIHRoZSBsaXN0IG9mIHNvdXJjZXMgaXMgdW5pcXVlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwKKyMgZS5nLiwgdGhlIHNhbWUgc291cmNlIGZpbGUgbWlnaHQgYmUgc2hhcmVkIGFtb25nIF9TT1VSQ0VTIHZhcmlhYmxlcworIyBmb3IgZGlmZmVyZW50IHByb2dyYW1zL2xpYnJhcmllcy4KK2FtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMgPSBcCisgIGxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCisgIHVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisgIGRvbmUgfCAkKGFtX191bmlxdWlmeV9pbnB1dClgCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1UQVIgPSBAQU1UQVJACitBTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IEBBTV9ERUZBVUxUX1ZFUkJPU0lUWUAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRkFVTFRfR1JPVVAgPSBAREVGQVVMVF9HUk9VUEAKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BUSFJFQURfQ0MgPSBAUFRIUkVBRF9DQ0AKK1BUSFJFQURfQ0ZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQAorUFRIUkVBRF9MSUJTID0gQFBUSFJFQURfTElCU0AKK1JBTkRPTV9GSUxFID0gQFJBTkRPTV9GSUxFQAorUkFOTElCID0gQFJBTkxJQkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1NMRElSID0gQFNTTERJUkAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYXhfcHRocmVhZF9jb25maWcgPSBAYXhfcHRocmVhZF9jb25maWdACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACisKKyMgRmlsZSBsaXN0cworY29tbW9uX2hlYWRlcnMgPSBjb21tb24uaCBwcm90b3R5cGVzLmggdmVyc2lvbi5oCitjb21tb25fc291cmNlcyA9IHRscy5jIHN0ci5jIGZpbGUuYyBjbGllbnQuYyBsb2cuYyBvcHRpb25zLmMgXAorCXByb3RvY29sLmMgbmV0d29yay5jIHJlc29sdmVyLmMgc3NsLmMgY3R4LmMgdmVyaWZ5LmMgXAorCXN0aHJlYWRzLmMgZmQuYyBkaHBhcmFtLmMgY3Jvbi5jIHN0dW5uZWwuYwordW5peF9zb3VyY2VzID0gcHR5LmMgbGlid3JhcC5jIHVpX3VuaXguYworc2hhcmVkX3NvdXJjZXMgPSBlbnYuYword2luMzJfZ3VpX3NvdXJjZXMgPSB1aV93aW5fZ3VpLmMgcmVzb3VyY2VzLmggcmVzb3VyY2VzLnJjIHN0dW5uZWwuaWNvIFwKKwlhY3RpdmUuaWNvIGVycm9yLmljbyBpZGxlLmljbword2luMzJfY2xpX3NvdXJjZXMgPSB1aV93aW5fY2xpLmMKK3N0dW5uZWxfU09VUkNFUyA9ICQoY29tbW9uX2hlYWRlcnMpICQoY29tbW9uX3NvdXJjZXMpICQodW5peF9zb3VyY2VzKQorYmluX1NDUklQVFMgPSBzdHVubmVsMworCisjIFJlbWFpbmluZyBmaWxlcyB0byBiZSBpbmNsdWRlZAorIyBFWFRSQV9QUk9HUkFNUyA9IHN0dW5uZWwuZXhlIHRzdHVubmVsLmV4ZQorIyBFWFRSQV9ESVNUICs9ICQod2luMzJfZ3VpX3NvdXJjZXMpICQod2luMzJfY2xpX3NvdXJjZXMpCitFWFRSQV9ESVNUID0gc3R1bm5lbDMuaW4gbWFrZS5iYXQgbWFrZWNlLmJhdCBtYWtldzMyLmJhdCBtaW5ndy5tYWsgXAorCWV2Yy5tYWsgdmMubWFrIG9zMi5tYWsKK0NMRUFORklMRVMgPSBzdHVubmVsMyBzdHVubmVsLmV4ZSB0c3R1bm5lbC5leGUKKworIyBVbml4IHNoYXJlZCBsaWJyYXJ5Citwa2dsaWJfTFRMSUJSQVJJRVMgPSBsaWJzdHVubmVsLmxhCitsaWJzdHVubmVsX2xhX1NPVVJDRVMgPSAkKHNoYXJlZF9zb3VyY2VzKQorbGlic3R1bm5lbF9sYV9MREZMQUdTID0gLWF2b2lkLXZlcnNpb24KKworIyBSZWQgSGF0ICJieSBkZXNpZ24iIGJ1ZyAjODIzNjkKKworIyBBZGRpdGlvbmFsIHByZXByb2Nlc29yIGRlZmluaXRpb25zCitzdHVubmVsX0NQUEZMQUdTID0gLUkvdXNyL2tlcmJlcm9zL2luY2x1ZGUgLUkkKFNTTERJUikvaW5jbHVkZSBcCisJLURMSUJESVI9JyIkKHBrZ2xpYmRpcikiJyAtRENPTkZESVI9JyIkKHN5c2NvbmZkaXIpL3N0dW5uZWwiJworCisjIFNTTCBsaWJyYXJ5CitzdHVubmVsX0xERkxBR1MgPSAtTCQoU1NMRElSKS9saWI2NCAtTCQoU1NMRElSKS9saWIgLWxzc2wgLWxjcnlwdG8KK3N0dW5uZWxfZXhlX1NPVVJDRVMgPSAkKGNvbW1vbl9oZWFkZXJzKSAkKGNvbW1vbl9zb3VyY2VzKSAkKHdpbjMyX2d1aV9zb3VyY2VzKQordHN0dW5uZWxfZXhlX1NPVVJDRVMgPSAkKGNvbW1vbl9oZWFkZXJzKSAkKGNvbW1vbl9zb3VyY2VzKSAkKHdpbjMyX2NsaV9zb3VyY2VzKQorCisjIHdpbjMyX3NzbF9kaXIgPSAvdXNyL3NyYy9vcGVuc3NsLTAuOS44dS1maXBzCisjIHdpbjMyX2NwcGZsYWdzID0gLUkkKHdpbjMyX3NzbF9kaXIpL2luYzMyCit3aW4zMl9zc2xfZGlyID0gL3Vzci9zcmMvb3BlbnNzbC0xLjAuMmQtaTY4Ngord2luMzJfY3BwZmxhZ3MgPSAtSSQod2luMzJfc3NsX2RpcikvaW5jbHVkZQord2luMzJfY2ZsYWdzID0gLW10aHJlYWRzIC1mc3RhY2stcHJvdGVjdG9yIC1PMiAtV2FsbCAtV2V4dHJhIFwKKwktV3BlZGFudGljIC1XZm9ybWF0PTIgLVdjb252ZXJzaW9uIC1Xbm8tbG9uZy1sb25nIFwKKwktRF9GT1JUSUZZX1NPVVJDRT0yIC1EVU5JQ09ERSAtRF9VTklDT0RFCit3aW4zMl9sZGZsYWdzID0gLW10aHJlYWRzIC1mc3RhY2stcHJvdGVjdG9yIC1zCit3aW4zMl9jb21tb25fbGlicyA9IC1sd3MyXzMyCit3aW4zMl9zc2xfbGlicyA9IC1MJCh3aW4zMl9zc2xfZGlyKSAtbGNyeXB0byAtbHNzbAord2luMzJfZ3VpX2xpYnMgPSAkKHdpbjMyX2NvbW1vbl9saWJzKSAtbGdkaTMyIC1scHNhcGkgJCh3aW4zMl9zc2xfbGlicykKK3dpbjMyX2NsaV9saWJzID0gJCh3aW4zMl9jb21tb25fbGlicykgJCh3aW4zMl9zc2xfbGlicykKK3dpbjMyX2NvbW1vbl9vYmpzID0gdGxzLm9iaiBzdHIub2JqIGZpbGUub2JqIGNsaWVudC5vYmogbG9nLm9iaiBcCisJb3B0aW9ucy5vYmogcHJvdG9jb2wub2JqIG5ldHdvcmsub2JqIHJlc29sdmVyLm9iaiBzc2wub2JqIFwKKwljdHgub2JqIHZlcmlmeS5vYmogc3RocmVhZHMub2JqIGZkLm9iaiBkaHBhcmFtLm9iaiBjcm9uLm9iaiBcCisJc3R1bm5lbC5vYmoKK3dpbjMyX2d1aV9vYmpzID0gdWlfd2luX2d1aS5vYmogcmVzb3VyY2VzLm9iagord2luMzJfY2xpX29ianMgPSB1aV93aW5fY2xpLm9iagord2luMzJfcHJlZml4ID0gaTY4Ni13NjQtbWluZ3czMi0KK3dpbjMyX2NjID0gJCh3aW4zMl9wcmVmaXgpZ2NjCit3aW4zMl93aW5kcmVzID0gJCh3aW4zMl9wcmVmaXgpd2luZHJlcworTU9TVExZQ0xFQU5GSUxFUyA9ICQod2luMzJfY29tbW9uX29ianMpICQod2luMzJfZ3VpX29ianMpICQod2luMzJfY2xpX29ianMpCitlZGl0ID0gc2VkIFwKKwktZSAnc3xAYmluZGlyW0BdfCQoYmluZGlyKXxnJworCithbGw6IGNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3JjL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHNyYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2NvbmZpZy5oOiBzdGFtcC1oMQorCUB0ZXN0IC1mICRAIHx8IHJtIC1mIHN0YW1wLWgxCisJQHRlc3QgLWYgJEAgfHwgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDEKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgc3JjL2NvbmZpZy5oCiskKHNyY2RpcikvY29uZmlnLmguaW46ICAkKGFtX19jb25maWd1cmVfZGVwcykgCisJKCQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikpCisJcm0gLWYgc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQorCitpbnN0YWxsLXBrZ2xpYkxUTElCUkFSSUVTOiAkKHBrZ2xpYl9MVExJQlJBUklFUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwlAbGlzdD0nJChwa2dsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChwa2dsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQocGtnbGliZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2dsaWJkaXIpIiB8fCBleGl0IDE7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQocGtnbGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQocGtnbGliZGlyKSI7IFwKKwl9CisKK3VuaW5zdGFsbC1wa2dsaWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHBrZ2xpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKHBrZ2xpYmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQocGtnbGliZGlyKS8kJGYnIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKHBrZ2xpYmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tcGtnbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQocGtnbGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChwa2dsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQocGtnbGliX0xUTElCUkFSSUVTKSc7IFwKKwlsb2NzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgXAorCSAgICAgIHNlZCAnc3xeW14vXSokJHwufDsgc3wvW14vXSokJHx8OyBzfCQkfC9zb19sb2NhdGlvbnN8JyB8IFwKKwkgICAgICBzb3J0IC11YDsgXAorCXRlc3QgLXogIiQkbG9jcyIgfHwgeyBcCisJICBlY2hvIHJtIC1mICQke2xvY3N9OyBcCisJICBybSAtZiAkJHtsb2NzfTsgXAorCX0KKworbGlic3R1bm5lbC5sYTogJChsaWJzdHVubmVsX2xhX09CSkVDVFMpICQobGlic3R1bm5lbF9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGlic3R1bm5lbF9sYV9ERVBFTkRFTkNJRVMpIAorCSQoQU1fVl9DQ0xEKSQobGlic3R1bm5lbF9sYV9MSU5LKSAtcnBhdGggJChwa2dsaWJkaXIpICQobGlic3R1bm5lbF9sYV9PQkpFQ1RTKSAkKGxpYnN0dW5uZWxfbGFfTElCQUREKSAkKExJQlMpCitpbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpciknIjsgXAorCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIgfHwgZXhpdCAxOyBcCisJZmk7IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIFwKKwkgfHwgdGVzdCAtZiAkJHAxIFwKKwkgIDsgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIFwKKwkgICAgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQoYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKGJpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgIHNlZCAtZSAnaDtzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pJyBcCisJICAgICAgLWUgJ3MvJCQvJChFWEVFWFQpLycgXAorCWA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1iaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CisKK2NsZWFuLWNoZWNrUFJPR1JBTVM6CisJQGxpc3Q9JyQoY2hlY2tfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CisKK3N0dW5uZWwkKEVYRUVYVCk6ICQoc3R1bm5lbF9PQkpFQ1RTKSAkKHN0dW5uZWxfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3N0dW5uZWxfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgc3R1bm5lbCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoc3R1bm5lbF9MSU5LKSAkKHN0dW5uZWxfT0JKRUNUUykgJChzdHVubmVsX0xEQUREKSAkKExJQlMpCitpbnN0YWxsLWJpblNDUklQVFM6ICQoYmluX1NDUklQVFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJQGxpc3Q9JyQoYmluX1NDUklQVFMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpciknIjsgXAorCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIgfHwgZXhpdCAxOyBcCisJZmk7IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO24nIFwKKwkgICAgLWUgJ2g7c3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7JCh0cmFuc2Zvcm0pJyB8IHNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDE7IH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgeyBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgICBpZiAoKytuW2RdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgeyBcCisJCXByaW50ICJmIiwgZCwgZmlsZXNbZF07IG5bZF0gPSAwOyBmaWxlc1tkXSA9ICIiIH0gfSBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsIGQgIi8iICQkNCwgJCQxIH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgICAgZWNobyAiICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCisJICAgICAgICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgIiQoREVTVERJUikkKGJpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtYmluU0NSSVBUUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9TQ1JJUFRTKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgICAgICAgc2VkIC1lICdzLC4qLywsOyQodHJhbnNmb3JtKSdgOyBcCisJZGlyPSckKERFU1RESVIpJChiaW5kaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2xpZW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jcm9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jdHguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RocGFyYW0uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Vudi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ZkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9maWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9sb2cuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL25ldHdvcmsuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL29wdGlvbnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Byb3RvY29sLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZXNvbHZlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3NsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdGhyZWFkcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3RyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLWNsaWVudC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1jcm9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLWN0eC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1kaHBhcmFtLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLWZkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLWZpbGUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtbGlid3JhcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1sb2cuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtbmV0d29yay5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1vcHRpb25zLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLXByb3RvY29sLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLXB0eS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1yZXNvbHZlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3R1bm5lbC1zc2wuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtc3RocmVhZHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtc3RyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLXN0dW5uZWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtdGxzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLXVpX3VuaXguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0dW5uZWwtdmVyaWZ5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHVubmVsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90bHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VpX3dpbl9jbGkuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VpX3dpbl9ndWkuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZlcmlmeS5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENPTVBJTEUpIC1jIC1vICRAICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCitzdHVubmVsLXRscy5vOiB0bHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtdGxzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtdGxzLlRwbyAtYyAtbyBzdHVubmVsLXRscy5vIGB0ZXN0IC1mICd0bHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtdGxzLlRwbyAkKERFUERJUikvc3R1bm5lbC10bHMuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd0bHMuYycgb2JqZWN0PSdzdHVubmVsLXRscy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtdGxzLm8gYHRlc3QgLWYgJ3Rscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bHMuYworCitzdHVubmVsLXRscy5vYmo6IHRscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC10bHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXRscy5UcG8gLWMgLW8gc3R1bm5lbC10bHMub2JqIGBpZiB0ZXN0IC1mICd0bHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0bHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGxzLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtdGxzLlRwbyAkKERFUERJUikvc3R1bm5lbC10bHMuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd0bHMuYycgb2JqZWN0PSdzdHVubmVsLXRscy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC10bHMub2JqIGBpZiB0ZXN0IC1mICd0bHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0bHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGxzLmMnOyBmaWAKKworc3R1bm5lbC1zdHIubzogc3RyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXN0ci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXN0ci5UcG8gLWMgLW8gc3R1bm5lbC1zdHIubyBgdGVzdCAtZiAnc3RyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0ci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLXN0ci5UcG8gJChERVBESVIpL3N0dW5uZWwtc3RyLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3RyLmMnIG9iamVjdD0nc3R1bm5lbC1zdHIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLXN0ci5vIGB0ZXN0IC1mICdzdHIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RyLmMKKworc3R1bm5lbC1zdHIub2JqOiBzdHIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtc3RyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1zdHIuVHBvIC1jIC1vIHN0dW5uZWwtc3RyLm9iaiBgaWYgdGVzdCAtZiAnc3RyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0ci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLXN0ci5UcG8gJChERVBESVIpL3N0dW5uZWwtc3RyLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3RyLmMnIG9iamVjdD0nc3R1bm5lbC1zdHIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtc3RyLm9iaiBgaWYgdGVzdCAtZiAnc3RyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0ci5jJzsgZmlgCisKK3N0dW5uZWwtZmlsZS5vOiBmaWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLWZpbGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1maWxlLlRwbyAtYyAtbyBzdHVubmVsLWZpbGUubyBgdGVzdCAtZiAnZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmaWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZmlsZS5UcG8gJChERVBESVIpL3N0dW5uZWwtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2ZpbGUuYycgb2JqZWN0PSdzdHVubmVsLWZpbGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWZpbGUubyBgdGVzdCAtZiAnZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmaWxlLmMKKworc3R1bm5lbC1maWxlLm9iajogZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1maWxlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1maWxlLlRwbyAtYyAtbyBzdHVubmVsLWZpbGUub2JqIGBpZiB0ZXN0IC1mICdmaWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZmlsZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9maWxlLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZmlsZS5UcG8gJChERVBESVIpL3N0dW5uZWwtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2ZpbGUuYycgb2JqZWN0PSdzdHVubmVsLWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2ZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmaWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZpbGUuYyc7IGZpYAorCitzdHVubmVsLWNsaWVudC5vOiBjbGllbnQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtY2xpZW50Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtY2xpZW50LlRwbyAtYyAtbyBzdHVubmVsLWNsaWVudC5vIGB0ZXN0IC1mICdjbGllbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2xpZW50LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtY2xpZW50LlRwbyAkKERFUERJUikvc3R1bm5lbC1jbGllbnQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjbGllbnQuYycgb2JqZWN0PSdzdHVubmVsLWNsaWVudC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtY2xpZW50Lm8gYHRlc3QgLWYgJ2NsaWVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjbGllbnQuYworCitzdHVubmVsLWNsaWVudC5vYmo6IGNsaWVudC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1jbGllbnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLWNsaWVudC5UcG8gLWMgLW8gc3R1bm5lbC1jbGllbnQub2JqIGBpZiB0ZXN0IC1mICdjbGllbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbGllbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2xpZW50LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtY2xpZW50LlRwbyAkKERFUERJUikvc3R1bm5lbC1jbGllbnQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjbGllbnQuYycgb2JqZWN0PSdzdHVubmVsLWNsaWVudC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1jbGllbnQub2JqIGBpZiB0ZXN0IC1mICdjbGllbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbGllbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2xpZW50LmMnOyBmaWAKKworc3R1bm5lbC1sb2cubzogbG9nLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLWxvZy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLWxvZy5UcG8gLWMgLW8gc3R1bm5lbC1sb2cubyBgdGVzdCAtZiAnbG9nLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGxvZy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWxvZy5UcG8gJChERVBESVIpL3N0dW5uZWwtbG9nLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbG9nLmMnIG9iamVjdD0nc3R1bm5lbC1sb2cubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWxvZy5vIGB0ZXN0IC1mICdsb2cuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbG9nLmMKKworc3R1bm5lbC1sb2cub2JqOiBsb2cuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtbG9nLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1sb2cuVHBvIC1jIC1vIHN0dW5uZWwtbG9nLm9iaiBgaWYgdGVzdCAtZiAnbG9nLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbG9nLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2xvZy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWxvZy5UcG8gJChERVBESVIpL3N0dW5uZWwtbG9nLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbG9nLmMnIG9iamVjdD0nc3R1bm5lbC1sb2cub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtbG9nLm9iaiBgaWYgdGVzdCAtZiAnbG9nLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbG9nLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2xvZy5jJzsgZmlgCisKK3N0dW5uZWwtb3B0aW9ucy5vOiBvcHRpb25zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLW9wdGlvbnMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1vcHRpb25zLlRwbyAtYyAtbyBzdHVubmVsLW9wdGlvbnMubyBgdGVzdCAtZiAnb3B0aW9ucy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BvcHRpb25zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtb3B0aW9ucy5UcG8gJChERVBESVIpL3N0dW5uZWwtb3B0aW9ucy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J29wdGlvbnMuYycgb2JqZWN0PSdzdHVubmVsLW9wdGlvbnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLW9wdGlvbnMubyBgdGVzdCAtZiAnb3B0aW9ucy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BvcHRpb25zLmMKKworc3R1bm5lbC1vcHRpb25zLm9iajogb3B0aW9ucy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1vcHRpb25zLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1vcHRpb25zLlRwbyAtYyAtbyBzdHVubmVsLW9wdGlvbnMub2JqIGBpZiB0ZXN0IC1mICdvcHRpb25zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnb3B0aW9ucy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9vcHRpb25zLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtb3B0aW9ucy5UcG8gJChERVBESVIpL3N0dW5uZWwtb3B0aW9ucy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J29wdGlvbnMuYycgb2JqZWN0PSdzdHVubmVsLW9wdGlvbnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtb3B0aW9ucy5vYmogYGlmIHRlc3QgLWYgJ29wdGlvbnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdvcHRpb25zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL29wdGlvbnMuYyc7IGZpYAorCitzdHVubmVsLXByb3RvY29sLm86IHByb3RvY29sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXByb3RvY29sLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtcHJvdG9jb2wuVHBvIC1jIC1vIHN0dW5uZWwtcHJvdG9jb2wubyBgdGVzdCAtZiAncHJvdG9jb2wuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcHJvdG9jb2wuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1wcm90b2NvbC5UcG8gJChERVBESVIpL3N0dW5uZWwtcHJvdG9jb2wuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdwcm90b2NvbC5jJyBvYmplY3Q9J3N0dW5uZWwtcHJvdG9jb2wubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLXByb3RvY29sLm8gYHRlc3QgLWYgJ3Byb3RvY29sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHByb3RvY29sLmMKKworc3R1bm5lbC1wcm90b2NvbC5vYmo6IHByb3RvY29sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXByb3RvY29sLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1wcm90b2NvbC5UcG8gLWMgLW8gc3R1bm5lbC1wcm90b2NvbC5vYmogYGlmIHRlc3QgLWYgJ3Byb3RvY29sLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncHJvdG9jb2wuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcHJvdG9jb2wuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1wcm90b2NvbC5UcG8gJChERVBESVIpL3N0dW5uZWwtcHJvdG9jb2wuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdwcm90b2NvbC5jJyBvYmplY3Q9J3N0dW5uZWwtcHJvdG9jb2wub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtcHJvdG9jb2wub2JqIGBpZiB0ZXN0IC1mICdwcm90b2NvbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Byb3RvY29sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Byb3RvY29sLmMnOyBmaWAKKworc3R1bm5lbC1uZXR3b3JrLm86IG5ldHdvcmsuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtbmV0d29yay5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLW5ldHdvcmsuVHBvIC1jIC1vIHN0dW5uZWwtbmV0d29yay5vIGB0ZXN0IC1mICduZXR3b3JrLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5ldHdvcmsuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1uZXR3b3JrLlRwbyAkKERFUERJUikvc3R1bm5lbC1uZXR3b3JrLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbmV0d29yay5jJyBvYmplY3Q9J3N0dW5uZWwtbmV0d29yay5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtbmV0d29yay5vIGB0ZXN0IC1mICduZXR3b3JrLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5ldHdvcmsuYworCitzdHVubmVsLW5ldHdvcmsub2JqOiBuZXR3b3JrLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLW5ldHdvcmsub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLW5ldHdvcmsuVHBvIC1jIC1vIHN0dW5uZWwtbmV0d29yay5vYmogYGlmIHRlc3QgLWYgJ25ldHdvcmsuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduZXR3b3JrLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25ldHdvcmsuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1uZXR3b3JrLlRwbyAkKERFUERJUikvc3R1bm5lbC1uZXR3b3JrLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbmV0d29yay5jJyBvYmplY3Q9J3N0dW5uZWwtbmV0d29yay5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1uZXR3b3JrLm9iaiBgaWYgdGVzdCAtZiAnbmV0d29yay5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25ldHdvcmsuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbmV0d29yay5jJzsgZmlgCisKK3N0dW5uZWwtcmVzb2x2ZXIubzogcmVzb2x2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtcmVzb2x2ZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1yZXNvbHZlci5UcG8gLWMgLW8gc3R1bm5lbC1yZXNvbHZlci5vIGB0ZXN0IC1mICdyZXNvbHZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2ByZXNvbHZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLXJlc29sdmVyLlRwbyAkKERFUERJUikvc3R1bm5lbC1yZXNvbHZlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3Jlc29sdmVyLmMnIG9iamVjdD0nc3R1bm5lbC1yZXNvbHZlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtcmVzb2x2ZXIubyBgdGVzdCAtZiAncmVzb2x2ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcmVzb2x2ZXIuYworCitzdHVubmVsLXJlc29sdmVyLm9iajogcmVzb2x2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtcmVzb2x2ZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXJlc29sdmVyLlRwbyAtYyAtbyBzdHVubmVsLXJlc29sdmVyLm9iaiBgaWYgdGVzdCAtZiAncmVzb2x2ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdyZXNvbHZlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yZXNvbHZlci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLXJlc29sdmVyLlRwbyAkKERFUERJUikvc3R1bm5lbC1yZXNvbHZlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3Jlc29sdmVyLmMnIG9iamVjdD0nc3R1bm5lbC1yZXNvbHZlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1yZXNvbHZlci5vYmogYGlmIHRlc3QgLWYgJ3Jlc29sdmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncmVzb2x2ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcmVzb2x2ZXIuYyc7IGZpYAorCitzdHVubmVsLXNzbC5vOiBzc2wuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtc3NsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtc3NsLlRwbyAtYyAtbyBzdHVubmVsLXNzbC5vIGB0ZXN0IC1mICdzc2wuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3NsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtc3NsLlRwbyAkKERFUERJUikvc3R1bm5lbC1zc2wuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzc2wuYycgb2JqZWN0PSdzdHVubmVsLXNzbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtc3NsLm8gYHRlc3QgLWYgJ3NzbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bzc2wuYworCitzdHVubmVsLXNzbC5vYmo6IHNzbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1zc2wub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXNzbC5UcG8gLWMgLW8gc3R1bm5lbC1zc2wub2JqIGBpZiB0ZXN0IC1mICdzc2wuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzc2wuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3NsLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtc3NsLlRwbyAkKERFUERJUikvc3R1bm5lbC1zc2wuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzc2wuYycgb2JqZWN0PSdzdHVubmVsLXNzbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1zc2wub2JqIGBpZiB0ZXN0IC1mICdzc2wuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzc2wuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3NsLmMnOyBmaWAKKworc3R1bm5lbC1jdHgubzogY3R4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLWN0eC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLWN0eC5UcG8gLWMgLW8gc3R1bm5lbC1jdHgubyBgdGVzdCAtZiAnY3R4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGN0eC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWN0eC5UcG8gJChERVBESVIpL3N0dW5uZWwtY3R4LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nY3R4LmMnIG9iamVjdD0nc3R1bm5lbC1jdHgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWN0eC5vIGB0ZXN0IC1mICdjdHguYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3R4LmMKKworc3R1bm5lbC1jdHgub2JqOiBjdHguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtY3R4Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1jdHguVHBvIC1jIC1vIHN0dW5uZWwtY3R4Lm9iaiBgaWYgdGVzdCAtZiAnY3R4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY3R4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2N0eC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWN0eC5UcG8gJChERVBESVIpL3N0dW5uZWwtY3R4LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nY3R4LmMnIG9iamVjdD0nc3R1bm5lbC1jdHgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtY3R4Lm9iaiBgaWYgdGVzdCAtZiAnY3R4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY3R4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2N0eC5jJzsgZmlgCisKK3N0dW5uZWwtdmVyaWZ5Lm86IHZlcmlmeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC12ZXJpZnkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC12ZXJpZnkuVHBvIC1jIC1vIHN0dW5uZWwtdmVyaWZ5Lm8gYHRlc3QgLWYgJ3ZlcmlmeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2ZXJpZnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC12ZXJpZnkuVHBvICQoREVQRElSKS9zdHVubmVsLXZlcmlmeS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3ZlcmlmeS5jJyBvYmplY3Q9J3N0dW5uZWwtdmVyaWZ5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC12ZXJpZnkubyBgdGVzdCAtZiAndmVyaWZ5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHZlcmlmeS5jCisKK3N0dW5uZWwtdmVyaWZ5Lm9iajogdmVyaWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXZlcmlmeS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtdmVyaWZ5LlRwbyAtYyAtbyBzdHVubmVsLXZlcmlmeS5vYmogYGlmIHRlc3QgLWYgJ3ZlcmlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZlcmlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92ZXJpZnkuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC12ZXJpZnkuVHBvICQoREVQRElSKS9zdHVubmVsLXZlcmlmeS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3ZlcmlmeS5jJyBvYmplY3Q9J3N0dW5uZWwtdmVyaWZ5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLXZlcmlmeS5vYmogYGlmIHRlc3QgLWYgJ3ZlcmlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZlcmlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92ZXJpZnkuYyc7IGZpYAorCitzdHVubmVsLXN0aHJlYWRzLm86IHN0aHJlYWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXN0aHJlYWRzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtc3RocmVhZHMuVHBvIC1jIC1vIHN0dW5uZWwtc3RocmVhZHMubyBgdGVzdCAtZiAnc3RocmVhZHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RocmVhZHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1zdGhyZWFkcy5UcG8gJChERVBESVIpL3N0dW5uZWwtc3RocmVhZHMuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzdGhyZWFkcy5jJyBvYmplY3Q9J3N0dW5uZWwtc3RocmVhZHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLXN0aHJlYWRzLm8gYHRlc3QgLWYgJ3N0aHJlYWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0aHJlYWRzLmMKKworc3R1bm5lbC1zdGhyZWFkcy5vYmo6IHN0aHJlYWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXN0aHJlYWRzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1zdGhyZWFkcy5UcG8gLWMgLW8gc3R1bm5lbC1zdGhyZWFkcy5vYmogYGlmIHRlc3QgLWYgJ3N0aHJlYWRzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RocmVhZHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RocmVhZHMuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1zdGhyZWFkcy5UcG8gJChERVBESVIpL3N0dW5uZWwtc3RocmVhZHMuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzdGhyZWFkcy5jJyBvYmplY3Q9J3N0dW5uZWwtc3RocmVhZHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtc3RocmVhZHMub2JqIGBpZiB0ZXN0IC1mICdzdGhyZWFkcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0aHJlYWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0aHJlYWRzLmMnOyBmaWAKKworc3R1bm5lbC1mZC5vOiBmZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1mZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLWZkLlRwbyAtYyAtbyBzdHVubmVsLWZkLm8gYHRlc3QgLWYgJ2ZkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZmQuVHBvICQoREVQRElSKS9zdHVubmVsLWZkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nZmQuYycgb2JqZWN0PSdzdHVubmVsLWZkLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1mZC5vIGB0ZXN0IC1mICdmZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmZC5jCisKK3N0dW5uZWwtZmQub2JqOiBmZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1mZC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtZmQuVHBvIC1jIC1vIHN0dW5uZWwtZmQub2JqIGBpZiB0ZXN0IC1mICdmZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZkLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZmQuVHBvICQoREVQRElSKS9zdHVubmVsLWZkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nZmQuYycgb2JqZWN0PSdzdHVubmVsLWZkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWZkLm9iaiBgaWYgdGVzdCAtZiAnZmQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mZC5jJzsgZmlgCisKK3N0dW5uZWwtZGhwYXJhbS5vOiBkaHBhcmFtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLWRocGFyYW0ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1kaHBhcmFtLlRwbyAtYyAtbyBzdHVubmVsLWRocGFyYW0ubyBgdGVzdCAtZiAnZGhwYXJhbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaHBhcmFtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZGhwYXJhbS5UcG8gJChERVBESVIpL3N0dW5uZWwtZGhwYXJhbS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2RocGFyYW0uYycgb2JqZWN0PSdzdHVubmVsLWRocGFyYW0ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWRocGFyYW0ubyBgdGVzdCAtZiAnZGhwYXJhbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaHBhcmFtLmMKKworc3R1bm5lbC1kaHBhcmFtLm9iajogZGhwYXJhbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1kaHBhcmFtLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1kaHBhcmFtLlRwbyAtYyAtbyBzdHVubmVsLWRocGFyYW0ub2JqIGBpZiB0ZXN0IC1mICdkaHBhcmFtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGhwYXJhbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaHBhcmFtLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3N0dW5uZWwtZGhwYXJhbS5UcG8gJChERVBESVIpL3N0dW5uZWwtZGhwYXJhbS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2RocGFyYW0uYycgb2JqZWN0PSdzdHVubmVsLWRocGFyYW0ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtZGhwYXJhbS5vYmogYGlmIHRlc3QgLWYgJ2RocGFyYW0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaHBhcmFtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2RocGFyYW0uYyc7IGZpYAorCitzdHVubmVsLWNyb24ubzogY3Jvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1jcm9uLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtY3Jvbi5UcG8gLWMgLW8gc3R1bm5lbC1jcm9uLm8gYHRlc3QgLWYgJ2Nyb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3Jvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWNyb24uVHBvICQoREVQRElSKS9zdHVubmVsLWNyb24uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjcm9uLmMnIG9iamVjdD0nc3R1bm5lbC1jcm9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1jcm9uLm8gYHRlc3QgLWYgJ2Nyb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3Jvbi5jCisKK3N0dW5uZWwtY3Jvbi5vYmo6IGNyb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtY3Jvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtY3Jvbi5UcG8gLWMgLW8gc3R1bm5lbC1jcm9uLm9iaiBgaWYgdGVzdCAtZiAnY3Jvbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Nyb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY3Jvbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWNyb24uVHBvICQoREVQRElSKS9zdHVubmVsLWNyb24uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjcm9uLmMnIG9iamVjdD0nc3R1bm5lbC1jcm9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWNyb24ub2JqIGBpZiB0ZXN0IC1mICdjcm9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY3Jvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jcm9uLmMnOyBmaWAKKworc3R1bm5lbC1zdHVubmVsLm86IHN0dW5uZWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtc3R1bm5lbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXN0dW5uZWwuVHBvIC1jIC1vIHN0dW5uZWwtc3R1bm5lbC5vIGB0ZXN0IC1mICdzdHVubmVsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0dW5uZWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1zdHVubmVsLlRwbyAkKERFUERJUikvc3R1bm5lbC1zdHVubmVsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3R1bm5lbC5jJyBvYmplY3Q9J3N0dW5uZWwtc3R1bm5lbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtc3R1bm5lbC5vIGB0ZXN0IC1mICdzdHVubmVsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0dW5uZWwuYworCitzdHVubmVsLXN0dW5uZWwub2JqOiBzdHVubmVsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXN0dW5uZWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXN0dW5uZWwuVHBvIC1jIC1vIHN0dW5uZWwtc3R1bm5lbC5vYmogYGlmIHRlc3QgLWYgJ3N0dW5uZWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdHVubmVsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0dW5uZWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1zdHVubmVsLlRwbyAkKERFUERJUikvc3R1bm5lbC1zdHVubmVsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3R1bm5lbC5jJyBvYmplY3Q9J3N0dW5uZWwtc3R1bm5lbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1zdHVubmVsLm9iaiBgaWYgdGVzdCAtZiAnc3R1bm5lbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0dW5uZWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3R1bm5lbC5jJzsgZmlgCisKK3N0dW5uZWwtcHR5Lm86IHB0eS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1wdHkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3R1bm5lbC1wdHkuVHBvIC1jIC1vIHN0dW5uZWwtcHR5Lm8gYHRlc3QgLWYgJ3B0eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwdHkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1wdHkuVHBvICQoREVQRElSKS9zdHVubmVsLXB0eS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3B0eS5jJyBvYmplY3Q9J3N0dW5uZWwtcHR5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1wdHkubyBgdGVzdCAtZiAncHR5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHB0eS5jCisKK3N0dW5uZWwtcHR5Lm9iajogcHR5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXB0eS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtcHR5LlRwbyAtYyAtbyBzdHVubmVsLXB0eS5vYmogYGlmIHRlc3QgLWYgJ3B0eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3B0eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wdHkuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC1wdHkuVHBvICQoREVQRElSKS9zdHVubmVsLXB0eS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3B0eS5jJyBvYmplY3Q9J3N0dW5uZWwtcHR5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLXB0eS5vYmogYGlmIHRlc3QgLWYgJ3B0eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3B0eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wdHkuYyc7IGZpYAorCitzdHVubmVsLWxpYndyYXAubzogbGlid3JhcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3R1bm5lbC1saWJ3cmFwLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtbGlid3JhcC5UcG8gLWMgLW8gc3R1bm5lbC1saWJ3cmFwLm8gYHRlc3QgLWYgJ2xpYndyYXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbGlid3JhcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWxpYndyYXAuVHBvICQoREVQRElSKS9zdHVubmVsLWxpYndyYXAuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdsaWJ3cmFwLmMnIG9iamVjdD0nc3R1bm5lbC1saWJ3cmFwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC1saWJ3cmFwLm8gYHRlc3QgLWYgJ2xpYndyYXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbGlid3JhcC5jCisKK3N0dW5uZWwtbGlid3JhcC5vYmo6IGxpYndyYXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtbGlid3JhcC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N0dW5uZWwtbGlid3JhcC5UcG8gLWMgLW8gc3R1bm5lbC1saWJ3cmFwLm9iaiBgaWYgdGVzdCAtZiAnbGlid3JhcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xpYndyYXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbGlid3JhcC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9zdHVubmVsLWxpYndyYXAuVHBvICQoREVQRElSKS9zdHVubmVsLWxpYndyYXAuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdsaWJ3cmFwLmMnIG9iamVjdD0nc3R1bm5lbC1saWJ3cmFwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc3R1bm5lbF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdHVubmVsLWxpYndyYXAub2JqIGBpZiB0ZXN0IC1mICdsaWJ3cmFwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbGlid3JhcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9saWJ3cmFwLmMnOyBmaWAKKworc3R1bm5lbC11aV91bml4Lm86IHVpX3VuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN0dW5uZWwtdWlfdW5peC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXVpX3VuaXguVHBvIC1jIC1vIHN0dW5uZWwtdWlfdW5peC5vIGB0ZXN0IC1mICd1aV91bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHVpX3VuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC11aV91bml4LlRwbyAkKERFUERJUikvc3R1bm5lbC11aV91bml4LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndWlfdW5peC5jJyBvYmplY3Q9J3N0dW5uZWwtdWlfdW5peC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN0dW5uZWwtdWlfdW5peC5vIGB0ZXN0IC1mICd1aV91bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHVpX3VuaXguYworCitzdHVubmVsLXVpX3VuaXgub2JqOiB1aV91bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzdHVubmVsX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdHVubmVsLXVpX3VuaXgub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdHVubmVsLXVpX3VuaXguVHBvIC1jIC1vIHN0dW5uZWwtdWlfdW5peC5vYmogYGlmIHRlc3QgLWYgJ3VpX3VuaXguYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1aV91bml4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3VpX3VuaXguYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc3R1bm5lbC11aV91bml4LlRwbyAkKERFUERJUikvc3R1bm5lbC11aV91bml4LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndWlfdW5peC5jJyBvYmplY3Q9J3N0dW5uZWwtdWlfdW5peC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHN0dW5uZWxfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3R1bm5lbC11aV91bml4Lm9iaiBgaWYgdGVzdCAtZiAndWlfdW5peC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3VpX3VuaXguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdWlfdW5peC5jJzsgZmlgCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK0lEOiAkKGFtX190YWdnZWRfZmlsZXMpCisJJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiB0YWdzLWFtCitUQUdTOiB0YWdzCisKK3RhZ3MtYW06ICQoVEFHU19ERVBFTkRFTkNJRVMpICQoYW1fX3RhZ2dlZF9maWxlcykKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBjdGFncy1hbQorCitDVEFHUzogY3RhZ3MKK2N0YWdzLWFtOiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKGFtX190YWdnZWRfZmlsZXMpCisJJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKK2NzY29wZWxpc3Q6IGNzY29wZWxpc3QtYW0KKworY3Njb3BlbGlzdC1hbTogJChhbV9fdGFnZ2VkX2ZpbGVzKQorCWxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCisJY2FzZSAiJChzcmNkaXIpIiBpbiBcCisJICBbXFwvXSogfCA/OltcXC9dKikgc2Rpcj0iJChzcmNkaXIpIiA7OyBcCisJICAqKSBzZGlyPSQoc3ViZGlyKS8kKHNyY2RpcikgOzsgXAorCWVzYWM7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gXAorCSAgICBlY2hvICIkKHN1YmRpcikvJCRpIjsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIiQkc2Rpci8kJGkiOyBcCisJICBmaTsgXAorCWRvbmUgPj4gJCh0b3BfYnVpbGRkaXIpL2NzY29wZS5maWxlcworCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkKGNoZWNrX1BST0dSQU1TKQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpICQoUFJPR1JBTVMpICQoU0NSSVBUUykgY29uZmlnLmgKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHBrZ2xpYmRpcikiICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQoYmluZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGNsZWFuLXBrZ2xpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluU0NSSVBUUyBcCisJaW5zdGFsbC1wa2dsaWJMVExJQlJBUklFUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluU0NSSVBUUyBcCisJdW5pbnN0YWxsLXBrZ2xpYkxUTElCUkFSSUVTCisKKy5NQUtFOiBhbGwgY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tcGtnbGliTFRMSUJSQVJJRVMgY3Njb3BlbGlzdC1hbSBjdGFncyBcCisJY3RhZ3MtYW0gZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5TQ1JJUFRTIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAorCWluc3RhbGwtcGtnbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSBcCisJdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1iaW5TQ1JJUFRTIFwKKwl1bmluc3RhbGwtcGtnbGliTFRMSUJSQVJJRVMKKworCisjIEdlbmVyYXRlIGEgbmV3IHNldCBvZiBESCBwYXJhbWV0ZXJzIGZvciBlYWNoIHZlcnNpb24KK2RocGFyYW0uYzogdmVyc2lvbi5oCisJZWNobyAnI2luY2x1ZGUgImNvbW1vbi5oIicgPmRocGFyYW0uYworCWVjaG8gJyNpZm5kZWYgT1BFTlNTTF9OT19ESCcgPj5kaHBhcmFtLmMKKwllY2hvICcjZGVmaW5lIEROX25ldyBESF9uZXcnID4+ZGhwYXJhbS5jCisJb3BlbnNzbCBkaHBhcmFtIC1ub291dCAtQyAyMDQ4ID4+ZGhwYXJhbS5jCisJZWNobyAnI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8nID4+ZGhwYXJhbS5jCisKKyMgZGlzdC1ob29rOiBzdHVubmVsLmV4ZSB0c3R1bm5lbC5leGUKKworIyBTVUZGSVhFUyA9IC5jIC5yYyAub2JqCisKK3N0dW5uZWwuZXhlOiAkKHdpbjMyX2NvbW1vbl9vYmpzKSAkKHdpbjMyX2d1aV9vYmpzKQorCSQod2luMzJfY2MpIC1td2luZG93cyAkKHdpbjMyX2xkZmxhZ3MpIC1vIHN0dW5uZWwuZXhlICQod2luMzJfY29tbW9uX29ianMpICQod2luMzJfZ3VpX29ianMpICQod2luMzJfZ3VpX2xpYnMpCisKK3RzdHVubmVsLmV4ZTogJCh3aW4zMl9jb21tb25fb2JqcykgJCh3aW4zMl9jbGlfb2JqcykKKwkkKHdpbjMyX2NjKSAkKHdpbjMyX2xkZmxhZ3MpIC1vIHRzdHVubmVsLmV4ZSAkKHdpbjMyX2NvbW1vbl9vYmpzKSAkKHdpbjMyX2NsaV9vYmpzKSAkKHdpbjMyX2NsaV9saWJzKQorCislLm9iajogJS5jICQoY29tbW9uX2hlYWRlcnMpCisJJCh3aW4zMl9jYykgLWMgJCh3aW4zMl9jcHBmbGFncykgJCh3aW4zMl9jZmxhZ3MpIC1vICRAICQ8CisKK3Jlc291cmNlcy5vYmo6IHJlc291cmNlcy5yYyByZXNvdXJjZXMuaCB2ZXJzaW9uLmgKKwkkKHdpbjMyX3dpbmRyZXMpIC0taW5jbHVkZS1kaXIgJChzcmNkaXIpICQ8ICRACisKK3N0dW5uZWwzOiBNYWtlZmlsZQorCSQoZWRpdCkgJyQoc3JjZGlyKS8kQC5pbicgPiRACisKK3N0dW5uZWwzOiAkKHNyY2Rpcikvc3R1bm5lbDMuaW4KKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc3JjL2FjdGl2ZS5pY28gYi9zcmMvYWN0aXZlLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRmZWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FjdGl2ZS5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2NsaWVudC5jIGIvc3JjL2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzNkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY2xpZW50LmMKQEAgLTAsMCArMSwxNDMzIEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKyNpZm5kZWYgU0hVVF9SRAorI2RlZmluZSBTSFVUX1JEIDAKKyNlbmRpZgorI2lmbmRlZiBTSFVUX1dSCisjZGVmaW5lIFNIVVRfV1IgMQorI2VuZGlmCisjaWZuZGVmIFNIVVRfUkRXUgorI2RlZmluZSBTSFVUX1JEV1IgMgorI2VuZGlmCisKK05PRVhQT1JUIHZvaWQgY2xpZW50X3RyeShDTEkgKik7CitOT0VYUE9SVCB2b2lkIGNsaWVudF9ydW4oQ0xJICopOworTk9FWFBPUlQgdm9pZCBsb2NhbF9zdGFydChDTEkgKik7CitOT0VYUE9SVCB2b2lkIHJlbW90ZV9zdGFydChDTEkgKik7CitOT0VYUE9SVCB2b2lkIHNzbF9zdGFydChDTEkgKik7CitOT0VYUE9SVCB2b2lkIG5ld19jaGFpbihDTEkgKik7CitOT0VYUE9SVCB2b2lkIHRyYW5zZmVyKENMSSAqKTsKK05PRVhQT1JUIGludCBwYXJzZV9zb2NrZXRfZXJyb3IoQ0xJICosIGNvbnN0IGNoYXIgKik7CisKK05PRVhQT1JUIHZvaWQgcHJpbnRfY2lwaGVyKENMSSAqKTsKK05PRVhQT1JUIHZvaWQgYXV0aF91c2VyKENMSSAqLCBjaGFyICopOworTk9FWFBPUlQgU09DS0VUIGNvbm5lY3RfbG9jYWwoQ0xJICopOworTk9FWFBPUlQgU09DS0VUIGNvbm5lY3RfcmVtb3RlKENMSSAqKTsKK05PRVhQT1JUIHZvaWQgY29ubmVjdF9jYWNoZShTU0xfU0VTU0lPTiAqLCBTT0NLQUREUl9VTklPTiAqKTsKK05PRVhQT1JUIHVuc2lnbmVkIGNvbm5lY3RfaW5kZXgoQ0xJICopOworTk9FWFBPUlQgdm9pZCBzZXR1cF9jb25uZWN0X2FkZHIoQ0xJICopOworTk9FWFBPUlQgdm9pZCBsb2NhbF9iaW5kKENMSSAqYyk7CitOT0VYUE9SVCB2b2lkIHByaW50X2JvdW5kX2FkZHJlc3MoQ0xJICopOworTk9FWFBPUlQgdm9pZCByZXNldChTT0NLRVQsIGNoYXIgKik7CisKKy8qIGFsbG9jYXRlIGxvY2FsIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgbmV3IHRocmVhZCAqLworQ0xJICphbGxvY19jbGllbnRfc2Vzc2lvbihTRVJWSUNFX09QVElPTlMgKm9wdCwgU09DS0VUIHJmZCwgU09DS0VUIHdmZCkgeworICAgIENMSSAqYzsKKworICAgIGM9c3RyX2FsbG9jX2RldGFjaGVkKHNpemVvZihDTEkpKTsKKyAgICBjLT5vcHQ9b3B0OworICAgIGMtPmxvY2FsX3JmZC5mZD1yZmQ7CisgICAgYy0+bG9jYWxfd2ZkLmZkPXdmZDsKKyAgICBjLT5yZWRpcmVjdD1SRURJUkVDVF9PRkY7CisgICAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgKmNsaWVudF90aHJlYWQodm9pZCAqYXJnKSB7CisgICAgQ0xJICpjPWFyZzsKKworICAgIGMtPnRscz1OVUxMOyAvKiBkbyBub3QgcmV1c2UgKi8KKyAgICB0bHNfYWxsb2MoYywgTlVMTCwgTlVMTCk7CisjaWZkZWYgREVCVUdfU1RBQ0tfU0laRQorICAgIHN0YWNrX2luZm8oMSk7IC8qIGluaXRpYWxpemUgKi8KKyNlbmRpZgorICAgIGNsaWVudF9tYWluKGMpOworI2lmZGVmIERFQlVHX1NUQUNLX1NJWkUKKyAgICBzdGFja19pbmZvKDApOyAvKiBkaXNwbGF5IGNvbXB1dGVkIHZhbHVlICovCisjZW5kaWYKKyAgICBzdHJfc3RhdHMoKTsgLyogY2xpZW50IHRocmVhZCBhbGxvY2F0aW9uIHRyYWNraW5nICovCisgICAgdGxzX2NsZWFudXAoKTsKKyAgICAvKiBzX2xvZygpIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHRsc19jbGVhbnVwKCkgKi8KKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBfZW5kdGhyZWFkKCk7CisjZW5kaWYKKyNpZmRlZiBVU0VfVUNPTlRFWFQKKyAgICBzX3BvbGxfd2FpdChOVUxMLCAwLCAwKTsgLyogd2FpdCBvbiBwb2xsKCkgKi8KKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGNsaWVudF9tYWluKENMSSAqYykgeworICAgIHNfbG9nKExPR19ERUJVRywgIlNlcnZpY2UgWyVzXSBzdGFydGVkIiwgYy0+b3B0LT5zZXJ2bmFtZSk7CisgICAgaWYoYy0+b3B0LT5leGVjX25hbWUgJiYgYy0+b3B0LT5jb25uZWN0X2FkZHIubmFtZXMpIHsKKyAgICAgICAgICAgIC8qIGV4ZWMrY29ubmVjdCBvcHRpb25zIHNwZWNpZmllZCB0b2dldGhlcgorICAgICAgICAgICAgICogLT4gc3Bhd24gYSBsb2NhbCBwcm9ncmFtIGluc3RlYWQgb2Ygc3RkaW8gKi8KKyAgICAgICAgZm9yKDs7KSB7CisgICAgICAgICAgICBTRVJWSUNFX09QVElPTlMgKm9wdD1jLT5vcHQ7CisgICAgICAgICAgICBtZW1zZXQoYywgMCwgc2l6ZW9mKENMSSkpOyAvKiBjb25uZWN0X2xvY2FsIG5lZWRzIGNsZWFuIGMgKi8KKyAgICAgICAgICAgIGMtPm9wdD1vcHQ7CisgICAgICAgICAgICBpZighc2V0am1wKGMtPmVycikpCisgICAgICAgICAgICAgICAgYy0+bG9jYWxfcmZkLmZkPWMtPmxvY2FsX3dmZC5mZD1jb25uZWN0X2xvY2FsKGMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2xpZW50X3J1bihjKTsKKyAgICAgICAgICAgIGlmKCFjLT5vcHQtPm9wdGlvbi5yZXRyeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNsZWVwKDEpOyAvKiBGSVhNRTogbm90IGEgZ29vZCBpZGVhIGluIHVjb250ZXh0IHRocmVhZGluZyAqLworICAgICAgICAgICAgc19wb2xsX2ZyZWUoYy0+ZmRzKTsKKyAgICAgICAgICAgIGMtPmZkcz1OVUxMOworICAgICAgICAgICAgc3RyX3N0YXRzKCk7IC8qIGNsaWVudCB0aHJlYWQgYWxsb2NhdGlvbiB0cmFja2luZyAqLworICAgICAgICAgICAgLyogYyBhbGxvY2F0aW9uIGlzIGRldGFjaGVkLCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgc3RyX3N0YXRzKCkgKi8KKyAgICAgICAgICAgIGlmKHNlcnZpY2Vfb3B0aW9ucy5uZXh0KSAvKiBubyB0bHNfY2xlYW51cCgpIGluIGluZXRkIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB0bHNfY2xlYW51cCgpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGNsaWVudF9ydW4oYyk7CisgICAgc3RyX2ZyZWUoYyk7Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZm9ybWF0IgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zvcm1hdC1leHRyYS1hcmdzIgorI2VuZGlmIC8qIF9fR05VQ19fICovCitOT0VYUE9SVCB2b2lkIGNsaWVudF9ydW4oQ0xJICpjKSB7CisgICAgaW50IGVyciwgcnN0OworI2lmbmRlZiBVU0VfRk9SSworICAgIGxvbmcgbnVtX2NsaWVudHNfY29weTsKKyNlbmRpZgorCisjaWZuZGVmIFVTRV9GT1JLCisgICAgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihDUklUX0NMSUVOVFMpOworICAgIHVpX2NsaWVudHMoKytudW1fY2xpZW50cyk7CisgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0NMSUVOVFMpOworI2VuZGlmCisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgY2xpZW50IGNvbnRleHQgKi8KKyAgICBjLT5yZW1vdGVfZmQuZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgYy0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgYy0+c3NsPU5VTEw7CisgICAgYy0+c29ja19ieXRlcz1jLT5zc2xfYnl0ZXM9MDsKKyAgICBpZihjLT5vcHQtPm9wdGlvbi5jbGllbnQpIHsKKyAgICAgICAgYy0+c29ja19yZmQ9JihjLT5sb2NhbF9yZmQpOworICAgICAgICBjLT5zb2NrX3dmZD0mKGMtPmxvY2FsX3dmZCk7CisgICAgICAgIGMtPnNzbF9yZmQ9Yy0+c3NsX3dmZD0mKGMtPnJlbW90ZV9mZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+c29ja19yZmQ9Yy0+c29ja193ZmQ9JihjLT5yZW1vdGVfZmQpOworICAgICAgICBjLT5zc2xfcmZkPSYoYy0+bG9jYWxfcmZkKTsKKyAgICAgICAgYy0+c3NsX3dmZD0mKGMtPmxvY2FsX3dmZCk7CisgICAgfQorICAgIGMtPmZkcz1zX3BvbGxfYWxsb2MoKTsKKyAgICBhZGRybGlzdF9jbGVhcigmYy0+Y29ubmVjdF9hZGRyLCAwKTsKKworICAgICAgICAvKiB0cnkgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCAqLworICAgIGVycj1zZXRqbXAoYy0+ZXJyKTsKKyAgICBpZighZXJyKQorICAgICAgICBjbGllbnRfdHJ5KGMpOworICAgIHJzdD1lcnI9PTEgJiYgYy0+b3B0LT5vcHRpb24ucmVzZXQ7CisgICAgc19sb2coTE9HX05PVElDRSwKKyAgICAgICAgIkNvbm5lY3Rpb24gJXM6ICVsbHUgYnl0ZShzKSBzZW50IHRvIFNTTCwgJWxsdSBieXRlKHMpIHNlbnQgdG8gc29ja2V0IiwKKyAgICAgICAgcnN0ID8gInJlc2V0IiA6ICJjbG9zZWQiLAorICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWMtPnNzbF9ieXRlcywgKHVuc2lnbmVkIGxvbmcgbG9uZyljLT5zb2NrX2J5dGVzKTsKKworICAgICAgICAvKiBjbGVhbnVwIHRlbXBvcmFyeSAoZS5nLiBJREVOVCkgc29ja2V0ICovCisgICAgaWYoYy0+ZmQhPUlOVkFMSURfU09DS0VUKQorICAgICAgICBjbG9zZXNvY2tldChjLT5mZCk7CisgICAgYy0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisKKyAgICAgICAgLyogY2xlYW51cCB0aGUgU1NMIGNvbnRleHQgKi8KKyAgICBpZihjLT5zc2wpIHsgLyogU1NMIGluaXRpYWxpemVkICovCisgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oYy0+c3NsLCBTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworICAgICAgICBTU0xfZnJlZShjLT5zc2wpOworICAgICAgICBjLT5zc2w9TlVMTDsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAwMDAwTAorICAgICAgICBFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKKyNlbHNlIC8qIE9wZW5TU0wgdmVyc2lvbiA8IDEuMC4wICovCisgICAgICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisjZW5kaWYgLyogT3BlblNTTCB2ZXJzaW9uID49IDEuMC4wICovCisgICAgfQorCisgICAgICAgIC8qIGNsZWFudXAgdGhlIHJlbW90ZSBzb2NrZXQgKi8KKyAgICBpZihjLT5yZW1vdGVfZmQuZmQhPUlOVkFMSURfU09DS0VUKSB7IC8qIHJlbW90ZSBzb2NrZXQgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgaWYocnN0ICYmIGMtPnJlbW90ZV9mZC5pc19zb2NrZXQpIC8qIHJlc2V0ICovCisgICAgICAgICAgICByZXNldChjLT5yZW1vdGVfZmQuZmQsICJsaW5nZXIgKHJlbW90ZSkiKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQoYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiUmVtb3RlIHNvY2tldCAoRkQ9JWQpIGNsb3NlZCIsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgICAgIGMtPnJlbW90ZV9mZC5mZD1JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisKKyAgICAgICAgLyogY2xlYW51cCB0aGUgbG9jYWwgc29ja2V0ICovCisgICAgaWYoYy0+bG9jYWxfcmZkLmZkIT1JTlZBTElEX1NPQ0tFVCkgeyAvKiBsb2NhbCBzb2NrZXQgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgaWYoYy0+bG9jYWxfcmZkLmZkPT1jLT5sb2NhbF93ZmQuZmQpIHsKKyAgICAgICAgICAgIGlmKHJzdCAmJiBjLT5sb2NhbF9yZmQuaXNfc29ja2V0KQorICAgICAgICAgICAgICAgIHJlc2V0KGMtPmxvY2FsX3JmZC5mZCwgImxpbmdlciAobG9jYWwpIik7CisgICAgICAgICAgICBjbG9zZXNvY2tldChjLT5sb2NhbF9yZmQuZmQpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiTG9jYWwgc29ja2V0IChGRD0lZCkgY2xvc2VkIiwgYy0+bG9jYWxfcmZkLmZkKTsKKyAgICAgICAgfSBlbHNlIHsgLyogc3RkaW4vc3Rkb3V0ICovCisgICAgICAgICAgICBpZihyc3QgJiYgYy0+bG9jYWxfcmZkLmlzX3NvY2tldCkKKyAgICAgICAgICAgICAgICByZXNldChjLT5sb2NhbF9yZmQuZmQsICJsaW5nZXIgKGxvY2FsX3JmZCkiKTsKKyAgICAgICAgICAgIGlmKHJzdCAmJiBjLT5sb2NhbF93ZmQuaXNfc29ja2V0KQorICAgICAgICAgICAgICAgIHJlc2V0KGMtPmxvY2FsX3dmZC5mZCwgImxpbmdlciAobG9jYWxfd2ZkKSIpOworICAgICAgICB9CisgICAgICAgIGMtPmxvY2FsX3JmZC5mZD1jLT5sb2NhbF93ZmQuZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisjaWZkZWYgVVNFX0ZPUksKKyAgICAvKiBkaXNwbGF5IGNoaWxkIHJldHVybiBjb2RlIGlmIGl0IG1hbmFnZWQgdG8gYXJyaXZlIG9uIHRpbWUgKi8KKyAgICAvKiBvdGhlcndpc2UgaXQgd2lsbCBiZSByZXRyaWV2ZWQgYnkgdGhlIGluaXQgcHJvY2VzcyBhbmQgaWdub3JlZCAqLworICAgIGlmKGMtPm9wdC0+ZXhlY19uYW1lKSAvKiAnZXhlYycgc3BlY2lmaWVkICovCisgICAgICAgIGNoaWxkX3N0YXR1cygpOyAvKiBudWxsIFNJR0NITEQgaGFuZGxlciB3YXMgdXNlZCAqLworICAgIHNfbG9nKExPR19ERUJVRywgIlNlcnZpY2UgWyVzXSBmaW5pc2hlZCIsIGMtPm9wdC0+c2Vydm5hbWUpOworI2Vsc2UKKyAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfQ0xJRU5UUyk7CisgICAgdWlfY2xpZW50cygtLW51bV9jbGllbnRzKTsKKyAgICBudW1fY2xpZW50c19jb3B5PW51bV9jbGllbnRzOyAvKiB0byBtb3ZlIHNfbG9nKCkgYXdheSBmcm9tIENSSVRfQ0xJRU5UUyAqLworICAgIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9DTElFTlRTKTsKKyAgICBzX2xvZyhMT0dfREVCVUcsICJTZXJ2aWNlIFslc10gZmluaXNoZWQgKCVsZCBsZWZ0KSIsCisgICAgICAgIGMtPm9wdC0+c2Vydm5hbWUsIG51bV9jbGllbnRzX2NvcHkpOworI2VuZGlmCisKKyAgICAgICAgLyogZnJlZSB0aGUgY2xpZW50IGNvbnRleHQgKi8KKyAgICBzdHJfZnJlZShjLT5jb25uZWN0X2FkZHIuYWRkcik7CisgICAgc19wb2xsX2ZyZWUoYy0+ZmRzKTsKKyAgICBjLT5mZHM9TlVMTDsKK30KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCitOT0VYUE9SVCB2b2lkIGNsaWVudF90cnkoQ0xJICpjKSB7CisgICAgbG9jYWxfc3RhcnQoYyk7CisgICAgcHJvdG9jb2woYywgYy0+b3B0LCBQUk9UT0NPTF9FQVJMWSk7CisgICAgaWYoYy0+b3B0LT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsKSB7CisgICAgICAgIHJlbW90ZV9zdGFydChjKTsKKyAgICAgICAgcHJvdG9jb2woYywgYy0+b3B0LCBQUk9UT0NPTF9NSURETEUpOworICAgICAgICBzc2xfc3RhcnQoYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3NsX3N0YXJ0KGMpOworICAgICAgICBwcm90b2NvbChjLCBjLT5vcHQsIFBST1RPQ09MX01JRERMRSk7CisgICAgICAgIHJlbW90ZV9zdGFydChjKTsKKyAgICB9CisgICAgcHJvdG9jb2woYywgYy0+b3B0LCBQUk9UT0NPTF9MQVRFKTsKKyAgICB0cmFuc2ZlcihjKTsKK30KKworTk9FWFBPUlQgdm9pZCBsb2NhbF9zdGFydChDTEkgKmMpIHsKKyAgICBTT0NLQUREUl9VTklPTiBhZGRyOworICAgIHNvY2tsZW5fdCBhZGRyX2xlbjsKKyAgICBjaGFyICphY2NlcHRlZF9hZGRyZXNzOworCisgICAgLyogY2hlY2sgaWYgbG9jYWxfcmZkIGlzIGEgc29ja2V0IGFuZCBnZXQgcGVlciBhZGRyZXNzICovCisgICAgYWRkcl9sZW49c2l6ZW9mKFNPQ0tBRERSX1VOSU9OKTsKKyAgICBjLT5sb2NhbF9yZmQuaXNfc29ja2V0PSFnZXRwZWVybmFtZShjLT5sb2NhbF9yZmQuZmQsICZhZGRyLnNhLCAmYWRkcl9sZW4pOworICAgIGlmKGMtPmxvY2FsX3JmZC5pc19zb2NrZXQpIHsKKyAgICAgICAgbWVtY3B5KCZjLT5wZWVyX2FkZHIuc2EsICZhZGRyLnNhLCAoc2l6ZV90KWFkZHJfbGVuKTsKKyAgICAgICAgYy0+cGVlcl9hZGRyX2xlbj1hZGRyX2xlbjsKKyAgICAgICAgaWYoc2V0X3NvY2tldF9vcHRpb25zKGMtPmxvY2FsX3JmZC5mZCwgMSkpCisgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkZhaWxlZCB0byBzZXQgbG9jYWwgc29ja2V0IG9wdGlvbnMiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSE9U19FTk9UU09DSykgeworICAgICAgICAgICAgc29ja2Vycm9yKCJnZXRwZWVyYnluYW1lIChsb2NhbF9yZmQpIik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiBsb2NhbF93ZmQgaXMgYSBzb2NrZXQgYW5kIGdldCBwZWVyIGFkZHJlc3MgKi8KKyAgICBpZihjLT5sb2NhbF9yZmQuZmQ9PWMtPmxvY2FsX3dmZC5mZCkgeworICAgICAgICBjLT5sb2NhbF93ZmQuaXNfc29ja2V0PWMtPmxvY2FsX3JmZC5pc19zb2NrZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWRkcl9sZW49c2l6ZW9mKFNPQ0tBRERSX1VOSU9OKTsKKyAgICAgICAgYy0+bG9jYWxfd2ZkLmlzX3NvY2tldD0hZ2V0cGVlcm5hbWUoYy0+bG9jYWxfd2ZkLmZkLCAmYWRkci5zYSwgJmFkZHJfbGVuKTsKKyAgICAgICAgaWYoYy0+bG9jYWxfd2ZkLmlzX3NvY2tldCkgeworICAgICAgICAgICAgaWYoIWMtPmxvY2FsX3JmZC5pc19zb2NrZXQpIHsgLyogYWxyZWFkeSByZXRyaWV2ZWQgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoJmMtPnBlZXJfYWRkci5zYSwgJmFkZHIuc2EsIChzaXplX3QpYWRkcl9sZW4pOworICAgICAgICAgICAgICAgIGMtPnBlZXJfYWRkcl9sZW49YWRkcl9sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzZXRfc29ja2V0X29wdGlvbnMoYy0+bG9jYWxfd2ZkLmZkLCAxKSkKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkZhaWxlZCB0byBzZXQgbG9jYWwgc29ja2V0IG9wdGlvbnMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGdldF9sYXN0X3NvY2tldF9lcnJvcigpIT1TX0VOT1RTT0NLKSB7CisgICAgICAgICAgICAgICAgc29ja2Vycm9yKCJnZXRwZWVyYnluYW1lIChsb2NhbF93ZmQpIik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogbmVpdGhlciBvZiBsb2NhbCBkZXNjcmlwdG9ycyBpcyBhIHNvY2tldCAqLworICAgIGlmKCFjLT5sb2NhbF9yZmQuaXNfc29ja2V0ICYmICFjLT5sb2NhbF93ZmQuaXNfc29ja2V0KSB7CisjaWZuZGVmIFVTRV9XSU4zMgorICAgICAgICBpZihjLT5vcHQtPm9wdGlvbi50cmFuc3BhcmVudF9zcmMpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJUcmFuc3BhcmVudCBzb3VyY2UgbmVlZHMgYSBzb2NrZXQiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJTZXJ2aWNlIFslc10gYWNjZXB0ZWQgY29ubmVjdGlvbiIsIGMtPm9wdC0+c2Vydm5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogYXV0aGVudGljYXRlIGJhc2VkIG9uIHJldHJpZXZlZCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgKi8KKyAgICBhY2NlcHRlZF9hZGRyZXNzPXNfbnRvcCgmYy0+cGVlcl9hZGRyLCBjLT5wZWVyX2FkZHJfbGVuKTsKKyNpZmRlZiBVU0VfTElCV1JBUAorICAgIGxpYndyYXBfYXV0aChjLCBhY2NlcHRlZF9hZGRyZXNzKTsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUCAqLworICAgIGF1dGhfdXNlcihjLCBhY2NlcHRlZF9hZGRyZXNzKTsKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiU2VydmljZSBbJXNdIGFjY2VwdGVkIGNvbm5lY3Rpb24gZnJvbSAlcyIsCisgICAgICAgIGMtPm9wdC0+c2Vydm5hbWUsIGFjY2VwdGVkX2FkZHJlc3MpOworICAgIHN0cl9mcmVlKGFjY2VwdGVkX2FkZHJlc3MpOworfQorCitOT0VYUE9SVCB2b2lkIHJlbW90ZV9zdGFydChDTEkgKmMpIHsKKyAgICAvKiB3aGVyZSB0byBiaW5kIGNvbm5lY3Rpbmcgc29ja2V0ICovCisgICAgaWYoYy0+b3B0LT5vcHRpb24ubG9jYWwpIC8qIG91dGdvaW5nIGludGVyZmFjZSAqLworICAgICAgICBjLT5iaW5kX2FkZHI9JmMtPm9wdC0+c291cmNlX2FkZHI7CisjaWZuZGVmIFVTRV9XSU4zMgorICAgIGVsc2UgaWYoYy0+b3B0LT5vcHRpb24udHJhbnNwYXJlbnRfc3JjKQorICAgICAgICBjLT5iaW5kX2FkZHI9JmMtPnBlZXJfYWRkcjsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgYy0+YmluZF9hZGRyPU5VTEw7IC8qIGRvbid0IGJpbmQgKi8KKworICAgIC8qIHNldHVwIGMtPnJlbW90ZV9mZCwgbm93ICovCisgICAgaWYoYy0+b3B0LT5leGVjX25hbWUgJiYgIWMtPm9wdC0+Y29ubmVjdF9hZGRyLm5hbWVzKQorICAgICAgICBjLT5yZW1vdGVfZmQuZmQ9Y29ubmVjdF9sb2NhbChjKTsgLyogbm90IGZvciBleGVjK2Nvbm5lY3QgdGFyZ2V0cyAqLworICAgIGVsc2UKKyAgICAgICAgYy0+cmVtb3RlX2ZkLmZkPWNvbm5lY3RfcmVtb3RlKGMpOworCisgICAgYy0+cmVtb3RlX2ZkLmlzX3NvY2tldD0xOyAvKiBhbHdheXMhICovCisgICAgc19sb2coTE9HX0RFQlVHLCAiUmVtb3RlIHNvY2tldCAoRkQ9JWQpIGluaXRpYWxpemVkIiwgYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICBpZihzZXRfc29ja2V0X29wdGlvbnMoYy0+cmVtb3RlX2ZkLmZkLCAyKSkKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gc2V0IHJlbW90ZSBzb2NrZXQgb3B0aW9ucyIpOworfQorCitOT0VYUE9SVCB2b2lkIHNzbF9zdGFydChDTEkgKmMpIHsKKyAgICBpbnQgaSwgZXJyOworICAgIFNTTF9TRVNTSU9OICpvbGRfc2Vzc2lvbjsKKyAgICBpbnQgdW5zYWZlX29wZW5zc2w7CisgICAgWDUwOSAqcGVlcl9jZXJ0OworCisgICAgYy0+c3NsPVNTTF9uZXcoYy0+b3B0LT5jdHgpOworICAgIGlmKCFjLT5zc2wpIHsKKyAgICAgICAgc3NsZXJyb3IoIlNTTF9uZXciKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBTU0xfc2V0X2V4X2RhdGEoYy0+c3NsLCBpbmRleF9jbGksIGMpOyAvKiBmb3IgY2FsbGJhY2tzICovCisgICAgaWYoYy0+b3B0LT5vcHRpb24uY2xpZW50KSB7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisgICAgICAgIGlmKGMtPm9wdC0+c25pKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNOSTogc2VuZGluZyBzZXJ2ZXJuYW1lOiAlcyIsIGMtPm9wdC0+c25pKTsKKyAgICAgICAgICAgIGlmKCFTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoYy0+c3NsLCBjLT5vcHQtPnNuaSkpIHsKKyAgICAgICAgICAgICAgICBzc2xlcnJvcigiU1NMX3NldF90bHNleHRfaG9zdF9uYW1lIik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoYy0+b3B0LT5zZXNzaW9uKSB7CisgICAgICAgICAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfU0VTU0lPTik7CisgICAgICAgICAgICBTU0xfc2V0X3Nlc3Npb24oYy0+c3NsLCBjLT5vcHQtPnNlc3Npb24pOworICAgICAgICAgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX1NFU1NJT04pOworICAgICAgICB9CisgICAgICAgIFNTTF9zZXRfZmQoYy0+c3NsLCAoaW50KWMtPnJlbW90ZV9mZC5mZCk7CisgICAgICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShjLT5zc2wpOworICAgIH0gZWxzZSB7IC8qIFNTTCBzZXJ2ZXIgKi8KKyAgICAgICAgaWYoYy0+bG9jYWxfcmZkLmZkPT1jLT5sb2NhbF93ZmQuZmQpCisgICAgICAgICAgICBTU0xfc2V0X2ZkKGMtPnNzbCwgKGludCljLT5sb2NhbF9yZmQuZmQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgLyogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGhhdmUgU1NMIG9uIFNURElOL1NURE9VVD8gKi8KKyAgICAgICAgICAgIFNTTF9zZXRfcmZkKGMtPnNzbCwgKGludCljLT5sb2NhbF9yZmQuZmQpOworICAgICAgICAgICAgU1NMX3NldF93ZmQoYy0+c3NsLCAoaW50KWMtPmxvY2FsX3dmZC5mZCk7CisgICAgICAgIH0KKyAgICAgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoYy0+c3NsKTsKKyAgICB9CisKKyAgICB1bnNhZmVfb3BlbnNzbD1TU0xlYXkoKTwweDAwOTA4MTBmTCB8fAorICAgICAgICAoU1NMZWF5KCk+PTB4MTAwMDAwMDBMICYmIFNTTGVheSgpPDB4MTAwMDAwMmZMKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIC8qIGNyaXRpY2FsIHNlY3Rpb24gZm9yIE9wZW5TU0wgdmVyc2lvbiA8IDAuOS44cCBvciAxLngueCA8IDEuMC4wYiAqCisgICAgICAgICAqIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpcyBhIGNydWRlIHdvcmthcm91bmQgZm9yIENWRS0yMDEwLTM4NjQgICAqCisgICAgICAgICAqIHNlZSBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2JpZC80NDg4NCBmb3IgZGV0YWlscyAgICAgICAgICAqCisgICAgICAgICAqIGFsdGVybmF0aXZlIHNvbHV0aW9uIGlzIHRvIGRpc2FibGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoaW5nICAgICAqCisgICAgICAgICAqIE5PVEU6IHRoaXMgY3JpdGljYWwgc2VjdGlvbiBhbHNvIGNvdmVycyBjYWxsYmFja3MgKGUuZy4gT0NTUCkgICAqLworICAgICAgICBpZih1bnNhZmVfb3BlbnNzbCkKKyAgICAgICAgICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9TU0wpOworCisgICAgICAgIGlmKGMtPm9wdC0+b3B0aW9uLmNsaWVudCkKKyAgICAgICAgICAgIGk9U1NMX2Nvbm5lY3QoYy0+c3NsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaT1TU0xfYWNjZXB0KGMtPnNzbCk7CisKKyAgICAgICAgaWYodW5zYWZlX29wZW5zc2wpCisgICAgICAgICAgICBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKENSSVRfU1NMKTsKKworICAgICAgICBlcnI9U1NMX2dldF9lcnJvcihjLT5zc2wsIGkpOworICAgICAgICBpZihlcnI9PVNTTF9FUlJPUl9OT05FKQorICAgICAgICAgICAgYnJlYWs7IC8qIG9rIC0+IGRvbmUgKi8KKyAgICAgICAgaWYoZXJyPT1TU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVycj09U1NMX0VSUk9SX1dBTlRfV1JJVEUpIHsKKyAgICAgICAgICAgIHNfcG9sbF9pbml0KGMtPmZkcyk7CisgICAgICAgICAgICBzX3BvbGxfYWRkKGMtPmZkcywgYy0+c3NsX3JmZC0+ZmQsCisgICAgICAgICAgICAgICAgZXJyPT1TU0xfRVJST1JfV0FOVF9SRUFELAorICAgICAgICAgICAgICAgIGVycj09U1NMX0VSUk9SX1dBTlRfV1JJVEUpOworICAgICAgICAgICAgc3dpdGNoKHNfcG9sbF93YWl0KGMtPmZkcywgYy0+b3B0LT50aW1lb3V0X2J1c3ksIDApKSB7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgIHNvY2tlcnJvcigic3NsX3N0YXJ0OiBzX3BvbGxfd2FpdCIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgInNzbF9zdGFydDogc19wb2xsX3dhaXQ6IgorICAgICAgICAgICAgICAgICAgICAiIFRJTUVPVVRidXN5IGV4Y2VlZGVkOiBzZW5kaW5nIHJlc2V0Iik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBPSyAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAic3NsX3N0YXJ0OiBzX3BvbGxfd2FpdDogdW5rbm93biByZXN1bHQiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsgLyogb2sgLT4gcmV0cnkgKi8KKyAgICAgICAgfQorICAgICAgICBpZihlcnI9PVNTTF9FUlJPUl9TWVNDQUxMKSB7CisgICAgICAgICAgICBzd2l0Y2goZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgU19FSU5UUjoKKyAgICAgICAgICAgIGNhc2UgU19FV09VTERCTE9DSzoKKyNpZiBTX0VBR0FJTiE9U19FV09VTERCTE9DSworICAgICAgICAgICAgY2FzZSBTX0VBR0FJTjoKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMtPm9wdC0+b3B0aW9uLmNsaWVudCkKKyAgICAgICAgICAgIHNzbGVycm9yKCJTU0xfY29ubmVjdCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzc2xlcnJvcigiU1NMX2FjY2VwdCIpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHNfbG9nKExPR19JTkZPLCAiU1NMICVzOiAlcyIsCisgICAgICAgIGMtPm9wdC0+b3B0aW9uLmNsaWVudCA/ICJjb25uZWN0ZWQiIDogImFjY2VwdGVkIiwKKyAgICAgICAgU1NMX3Nlc3Npb25fcmV1c2VkKGMtPnNzbCkgPworICAgICAgICAgICAgInByZXZpb3VzIHNlc3Npb24gcmV1c2VkIiA6ICJuZXcgc2Vzc2lvbiBuZWdvdGlhdGVkIik7CisgICAgaWYoU1NMX3Nlc3Npb25fcmV1c2VkKGMtPnNzbCkpIHsKKyAgICAgICAgYy0+cmVkaXJlY3Q9KHVpbnRwdHJfdClTU0xfU0VTU0lPTl9nZXRfZXhfZGF0YShTU0xfZ2V0X3Nlc3Npb24oYy0+c3NsKSwKKyAgICAgICAgICAgIGluZGV4X3JlZGlyZWN0KTsKKyAgICAgICAgaWYoYy0+b3B0LT5yZWRpcmVjdF9hZGRyLm5hbWVzICYmICFjLT5yZWRpcmVjdCkgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIk5vIGFwcGxpY2F0aW9uIGRhdGEgZm91bmQgaW4gdGhlIHJldXNlZCBzZXNzaW9uIik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBhIG5ldyBzZXNzaW9uIHdhcyBuZWdvdGlhdGVkICovCisgICAgICAgIG5ld19jaGFpbihjKTsKKyAgICAgICAgcGVlcl9jZXJ0PVNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjLT5zc2wpOworICAgICAgICBpZihwZWVyX2NlcnQpIC8qIGMtPnJlZGlyZWN0IHdhcyBzZXQgYnkgdGhlIGNhbGxiYWNrICovCisgICAgICAgICAgICBYNTA5X2ZyZWUocGVlcl9jZXJ0KTsKKyAgICAgICAgZWxzZSBpZihjLT5vcHQtPnJlZGlyZWN0X2FkZHIubmFtZXMpCisgICAgICAgICAgICBjLT5yZWRpcmVjdD1SRURJUkVDVF9PTjsKKyAgICAgICAgU1NMX1NFU1NJT05fc2V0X2V4X2RhdGEoU1NMX2dldF9zZXNzaW9uKGMtPnNzbCksCisgICAgICAgICAgICBpbmRleF9yZWRpcmVjdCwgKHZvaWQgKiljLT5yZWRpcmVjdCk7CisgICAgICAgIGlmKGMtPm9wdC0+b3B0aW9uLmNsaWVudCkgeworICAgICAgICAgICAgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihDUklUX1NFU1NJT04pOworICAgICAgICAgICAgb2xkX3Nlc3Npb249Yy0+b3B0LT5zZXNzaW9uOworICAgICAgICAgICAgYy0+b3B0LT5zZXNzaW9uPVNTTF9nZXQxX3Nlc3Npb24oYy0+c3NsKTsgLyogc3RvcmUgaXQgKi8KKyAgICAgICAgICAgIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9TRVNTSU9OKTsKKyAgICAgICAgICAgIGlmKG9sZF9zZXNzaW9uKQorICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OX2ZyZWUob2xkX3Nlc3Npb24pOyAvKiByZWxlYXNlIHRoZSBvbGQgb25lICovCisgICAgICAgIH0gZWxzZSB7IC8qIFNTTCBzZXJ2ZXIgKi8KKyAgICAgICAgICAgIFNTTF9DVFhfYWRkX3Nlc3Npb24oYy0+b3B0LT5jdHgsIFNTTF9nZXRfc2Vzc2lvbihjLT5zc2wpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludF9jaXBoZXIoYyk7CisgICAgfQorfQorCitOT0VYUE9SVCB2b2lkIG5ld19jaGFpbihDTEkgKmMpIHsKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgaSwgbGVuOworICAgIFg1MDkgKnBlZXJfY2VydDsKKyAgICBTVEFDS19PRihYNTA5KSAqc2s7CisgICAgY2hhciAqY2hhaW47CisKKyAgICBpZihjLT5vcHQtPmNoYWluKSAvKiBhbHJlYWR5IGNhY2hlZCAqLworICAgICAgICByZXR1cm47IC8qIHRoaXMgcmFjZSBjb25kaXRpb24gaXMgc2FmZSB0byBpZ25vcmUgKi8KKyAgICBiaW89QklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgaWYoIWJpbykKKyAgICAgICAgcmV0dXJuOworICAgIHNrPVNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGMtPnNzbCk7CisgICAgZm9yKGk9MDsgc2sgJiYgaTxza19YNTA5X251bShzayk7IGkrKykgeworICAgICAgICBwZWVyX2NlcnQ9c2tfWDUwOV92YWx1ZShzaywgaSk7CisgICAgICAgIFBFTV93cml0ZV9iaW9fWDUwOShiaW8sIHBlZXJfY2VydCk7CisgICAgfQorICAgIGlmKCFzayB8fCAhYy0+b3B0LT5vcHRpb24uY2xpZW50KSB7CisgICAgICAgIHBlZXJfY2VydD1TU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoYy0+c3NsKTsKKyAgICAgICAgaWYocGVlcl9jZXJ0KSB7CisgICAgICAgICAgICBQRU1fd3JpdGVfYmlvX1g1MDkoYmlvLCBwZWVyX2NlcnQpOworICAgICAgICAgICAgWDUwOV9mcmVlKHBlZXJfY2VydCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGVuPUJJT19wZW5kaW5nKGJpbyk7CisgICAgaWYobGVuPD0wKSB7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiTm8gcGVlciBjZXJ0aWZpY2F0ZSByZWNlaXZlZCIpOworICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHByZXZlbnQgYXV0b21hdGljIGRlYWxsb2NhdGlvbiBvZiB0aGUgY2FjaGVkIHZhbHVlICovCisgICAgY2hhaW49c3RyX2FsbG9jX2RldGFjaGVkKChzaXplX3QpbGVuKzEpOworICAgIGxlbj1CSU9fcmVhZChiaW8sIGNoYWluLCBsZW4pOworICAgIGlmKGxlbjwwKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJCSU9fcmVhZCBmYWlsZWQiKTsKKyAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgc3RyX2ZyZWUoY2hhaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYWluW2xlbl09J1wwJzsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGMtPm9wdC0+Y2hhaW49Y2hhaW47IC8qIHRoaXMgcmFjZSBjb25kaXRpb24gaXMgc2FmZSB0byBpZ25vcmUgKi8KKyAgICB1aV9uZXdfY2hhaW4oYy0+b3B0LT5zZWN0aW9uX251bWJlcik7CisgICAgc19sb2coTE9HX0RFQlVHLCAiUGVlciBjZXJ0aWZpY2F0ZSB3YXMgY2FjaGVkICglZCBieXRlcykiLCBsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRyYW5zZmVyIGRhdGEgKi8KK05PRVhQT1JUIHZvaWQgdHJhbnNmZXIoQ0xJICpjKSB7CisgICAgaW50IHdhdGNoZG9nPTA7IC8qIGEgY291bnRlciB0byBkZXRlY3QgYW4gaW5maW5pdGUgbG9vcCAqLworICAgIHNzaXplX3QgbnVtOworICAgIGludCBlcnI7CisgICAgLyogbG9naWNhbCBjaGFubmVscyAobm90IGZpbGUgZGVzY3JpcHRvcnMhKSBvcGVuIGZvciByZWFkIG9yIHdyaXRlICovCisgICAgaW50IHNvY2tfb3Blbl9yZD0xLCBzb2NrX29wZW5fd3I9MTsKKyAgICAvKiBhd2FpdGVkIGNvbmRpdGlvbnMgb24gU1NMIGZpbGUgZGVzY3JpcHRvcnMgKi8KKyAgICBpbnQgc2h1dGRvd25fd2FudHNfcmVhZD0wLCBzaHV0ZG93bl93YW50c193cml0ZT0wOworICAgIGludCByZWFkX3dhbnRzX3JlYWQ9MCwgcmVhZF93YW50c193cml0ZT0wOworICAgIGludCB3cml0ZV93YW50c19yZWFkPTAsIHdyaXRlX3dhbnRzX3dyaXRlPTA7CisgICAgLyogYWN0dWFsIGNvbmRpdGlvbnMgb24gZmlsZSBkZXNjcmlwdG9ycyAqLworICAgIGludCBzb2NrX2Nhbl9yZCwgc29ja19jYW5fd3IsIHNzbF9jYW5fcmQsIHNzbF9jYW5fd3I7CisjaWZkZWYgVVNFX1dJTjMyCisgICAgdW5zaWduZWQgbG9uZyBieXRlczsKKyNlbHNlCisgICAgaW50IGJ5dGVzOworI2VuZGlmCisKKyAgICBjLT5zb2NrX3B0cj1jLT5zc2xfcHRyPTA7CisKKyAgICBkbyB7IC8qIG1haW4gbG9vcCBvZiBjbGllbnQgZGF0YSB0cmFuc2ZlciAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGluaXRpYWxpemUgKl93YW50c18qICovCisgICAgICAgIHJlYWRfd2FudHNfcmVhZHw9IShTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1JFQ0VJVkVEX1NIVVRET1dOKQorICAgICAgICAgICAgJiYgYy0+c3NsX3B0cjxCVUZGU0laRSAmJiAhcmVhZF93YW50c193cml0ZTsKKyAgICAgICAgd3JpdGVfd2FudHNfd3JpdGV8PSEoU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpJlNTTF9TRU5UX1NIVVRET1dOKQorICAgICAgICAgICAgJiYgYy0+c29ja19wdHIgJiYgIXdyaXRlX3dhbnRzX3JlYWQ7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzZXR1cCBjLT5mZHMgc3RydWN0dXJlICovCisgICAgICAgIHNfcG9sbF9pbml0KGMtPmZkcyk7IC8qIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICAvKiBmb3IgcGxhaW4gc29ja2V0IG9wZW4gZGF0YSBzdHJlbSA9IG9wZW4gZmlsZSBkZXNjcmlwdG9yICovCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0byBhZGQgZWFjaCBvcGVuIHNvY2tldCB0byByZWNlaXZlIGV4Y2VwdGlvbnMhICovCisgICAgICAgIGlmKHNvY2tfb3Blbl9yZCkgLyogb25seSBwb2xsIGlmIHRoZSByZWFkIGZpbGUgZGVzY3JpcHRvciBpcyBvcGVuICovCisgICAgICAgICAgICBzX3BvbGxfYWRkKGMtPmZkcywgYy0+c29ja19yZmQtPmZkLCBjLT5zb2NrX3B0cjxCVUZGU0laRSwgMCk7CisgICAgICAgIGlmKHNvY2tfb3Blbl93cikgLyogb25seSBwb2xsIGlmIHRoZSB3cml0ZSBmaWxlIGRlc2NyaXB0b3IgaXMgb3BlbiAqLworICAgICAgICAgICAgc19wb2xsX2FkZChjLT5mZHMsIGMtPnNvY2tfd2ZkLT5mZCwgMCwgYy0+c3NsX3B0cj4wKTsKKyAgICAgICAgLyogcG9sbCBTU0wgZmlsZSBkZXNjcmlwdG9ycyB1bmxlc3MgU1NMIHNodXRkb3duIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgaWYoU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpIT0KKyAgICAgICAgICAgICAgICAoU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKSkgeworICAgICAgICAgICAgc19wb2xsX2FkZChjLT5mZHMsIGMtPnNzbF9yZmQtPmZkLAorICAgICAgICAgICAgICAgIHJlYWRfd2FudHNfcmVhZCB8fCB3cml0ZV93YW50c19yZWFkIHx8IHNodXRkb3duX3dhbnRzX3JlYWQsIDApOworICAgICAgICAgICAgc19wb2xsX2FkZChjLT5mZHMsIGMtPnNzbF93ZmQtPmZkLCAwLAorICAgICAgICAgICAgICAgIHJlYWRfd2FudHNfd3JpdGUgfHwgd3JpdGVfd2FudHNfd3JpdGUgfHwgc2h1dGRvd25fd2FudHNfd3JpdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3YWl0IGZvciBhbiBldmVudCAqLworICAgICAgICBlcnI9c19wb2xsX3dhaXQoYy0+ZmRzLAorICAgICAgICAgICAgKHNvY2tfb3Blbl9yZCAmJiAvKiBib3RoIHBlZXJzIG9wZW4gKi8KKyAgICAgICAgICAgICAgICAhKFNTTF9nZXRfc2h1dGRvd24oYy0+c3NsKSZTU0xfUkVDRUlWRURfU0hVVERPV04pKSB8fAorICAgICAgICAgICAgYy0+c3NsX3B0ciAvKiBkYXRhIGJ1ZmZlcmVkIHRvIHdyaXRlIHRvIHNvY2tldCAqLyB8fAorICAgICAgICAgICAgYy0+c29ja19wdHIgLyogZGF0YSBidWZmZXJlZCB0byB3cml0ZSB0byBTU0wgKi8gPworICAgICAgICAgICAgYy0+b3B0LT50aW1lb3V0X2lkbGUgOiBjLT5vcHQtPnRpbWVvdXRfY2xvc2UsIDApOworICAgICAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBzb2NrZXJyb3IoInRyYW5zZmVyOiBzX3BvbGxfd2FpdCIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICBjYXNlIDA6IC8qIHRpbWVvdXQgKi8KKyAgICAgICAgICAgIGlmKChzb2NrX29wZW5fcmQgJiYKKyAgICAgICAgICAgICAgICAgICAgIShTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgYy0+c3NsX3B0ciB8fCBjLT5zb2NrX3B0cikgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAidHJhbnNmZXI6IHNfcG9sbF93YWl0OiIKKyAgICAgICAgICAgICAgICAgICAgIiBUSU1FT1VUaWRsZSBleGNlZWRlZDogc2VuZGluZyByZXNldCIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIGFscmVhZHkgY2xvc2luZyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgInRyYW5zZmVyOiBzX3BvbGxfd2FpdDoiCisgICAgICAgICAgICAgICAgICAgICIgVElNRU9VVGNsb3NlIGV4Y2VlZGVkOiBjbG9zaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBPSyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiByZXRyaWV2ZSByZXN1bHRzIGZyb20gYy0+ZmRzICovCisgICAgICAgIHNvY2tfY2FuX3JkPXNfcG9sbF9jYW5yZWFkKGMtPmZkcywgYy0+c29ja19yZmQtPmZkKTsKKyAgICAgICAgc29ja19jYW5fd3I9c19wb2xsX2NhbndyaXRlKGMtPmZkcywgYy0+c29ja193ZmQtPmZkKTsKKyAgICAgICAgc3NsX2Nhbl9yZD1zX3BvbGxfY2FucmVhZChjLT5mZHMsIGMtPnNzbF9yZmQtPmZkKTsKKyAgICAgICAgc3NsX2Nhbl93cj1zX3BvbGxfY2Fud3JpdGUoYy0+ZmRzLCBjLT5zc2xfd2ZkLT5mZCk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjaGVja3MgZm9yIGludGVybmFsIGZhaWx1cmVzICovCisgICAgICAgIC8qIHBsZWFzZSByZXBvcnQgYW55IGludGVybmFsIGVycm9ycyB0byBzdHVubmVsLXVzZXJzIG1haWxpbmcgbGlzdCAqLworICAgICAgICBpZighKHNvY2tfY2FuX3JkIHx8IHNvY2tfY2FuX3dyIHx8IHNzbF9jYW5fcmQgfHwgc3NsX2Nhbl93cikpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJJTlRFUk5BTCBFUlJPUjogIgorICAgICAgICAgICAgICAgICJzX3BvbGxfd2FpdCByZXR1cm5lZCAlZCwgYnV0IG5vIGRlc2NyaXB0b3IgaXMgcmVhZHkiLCBlcnIpOworICAgICAgICAgICAgc19wb2xsX2R1bXAoYy0+ZmRzLCBMT0dfRVJSKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGMtPnJlbmVnX3N0YXRlPT1SRU5FR19ERVRFQ1RFRCAmJiAhYy0+b3B0LT5vcHRpb24ucmVuZWdvdGlhdGlvbikgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkFib3J0aW5nIGR1ZSB0byByZW5lZ290aWF0aW9uIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc2VuZCBTU0wgY2xvc2Vfbm90aWZ5IGFsZXJ0ICovCisgICAgICAgIGlmKHNodXRkb3duX3dhbnRzX3JlYWQgfHwgc2h1dGRvd25fd2FudHNfd3JpdGUpIHsKKyAgICAgICAgICAgIG51bT1TU0xfc2h1dGRvd24oYy0+c3NsKTsgLyogc2VuZCBjbG9zZV9ub3RpZnkgYWxlcnQgKi8KKyAgICAgICAgICAgIGlmKG51bTwwKSAvKiAtMSAtIG5vdCBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICBlcnI9U1NMX2dldF9lcnJvcihjLT5zc2wsIChpbnQpbnVtKTsKKyAgICAgICAgICAgIGVsc2UgLyogMCBvciAxIC0gc3VjY2VzcyAqLworICAgICAgICAgICAgICAgIGVycj1TU0xfRVJST1JfTk9ORTsKKyAgICAgICAgICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6IC8qIHRoZSBzaHV0ZG93biB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiU1NMX3NodXRkb3duIHN1Y2Nlc3NmdWxseSBzZW50IGNsb3NlX25vdGlmeSBhbGVydCIpOworICAgICAgICAgICAgICAgIHNodXRkb3duX3dhbnRzX3JlYWQ9c2h1dGRvd25fd2FudHNfd3JpdGU9MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6IC8qIHNvY2tldCBlcnJvciAqLworICAgICAgICAgICAgICAgIGlmKHBhcnNlX3NvY2tldF9lcnJvcihjLCAiU1NMX3NodXRkb3duIikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBhIG5vbi1jcml0aWNhbCBlcnJvcjogcmV0cnkgKi8KKyAgICAgICAgICAgICAgICBTU0xfc2V0X3NodXRkb3duKGMtPnNzbCwgU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bl93YW50c19yZWFkPXNodXRkb3duX3dhbnRzX3dyaXRlPTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNTTF9zaHV0ZG93biByZXR1cm5lZCBXQU5UX1dSSVRFOiByZXRyeWluZyIpOworICAgICAgICAgICAgICAgIHNodXRkb3duX3dhbnRzX3JlYWQ9MDsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bl93YW50c193cml0ZT0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNTTF9zaHV0ZG93biByZXR1cm5lZCBXQU5UX1JFQUQ6IHJldHJ5aW5nIik7CisgICAgICAgICAgICAgICAgc2h1dGRvd25fd2FudHNfcmVhZD0xOworICAgICAgICAgICAgICAgIHNodXRkb3duX3dhbnRzX3dyaXRlPTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6IC8qIFNTTCBlcnJvciAqLworICAgICAgICAgICAgICAgIHNzbGVycm9yKCJTU0xfc2h1dGRvd24iKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJTU0xfc2h1dGRvd24vU1NMX2dldF9lcnJvciByZXR1cm5lZCAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3cml0ZSB0byBzb2NrZXQgKi8KKyAgICAgICAgaWYoc29ja19vcGVuX3dyICYmIHNvY2tfY2FuX3dyKSB7CisgICAgICAgICAgICBudW09d3JpdGVzb2NrZXQoYy0+c29ja193ZmQtPmZkLCBjLT5zc2xfYnVmZiwgYy0+c3NsX3B0cik7CisgICAgICAgICAgICBzd2l0Y2gobnVtKSB7CisgICAgICAgICAgICBjYXNlIC0xOiAvKiBlcnJvciAqLworICAgICAgICAgICAgICAgIGlmKHBhcnNlX3NvY2tldF9lcnJvcihjLCAid3JpdGVzb2NrZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGEgbm9uLWNyaXRpY2FsIGVycm9yOiByZXRyeSAqLworICAgICAgICAgICAgICAgIHNvY2tfb3Blbl9yZD1zb2NrX29wZW5fd3I9MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbWVtbW92ZShjLT5zc2xfYnVmZiwgYy0+c3NsX2J1ZmYrbnVtLCBjLT5zc2xfcHRyLShzaXplX3QpbnVtKTsKKyAgICAgICAgICAgICAgICBjLT5zc2xfcHRyLT0oc2l6ZV90KW51bTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYy0+c3NsX2J1ZmYrYy0+c3NsX3B0ciwgMCwgKHNpemVfdCludW0pOyAvKiBwYXJhbm9pYSAqLworICAgICAgICAgICAgICAgIGMtPnNvY2tfYnl0ZXMrPShzaXplX3QpbnVtOworICAgICAgICAgICAgICAgIHdhdGNoZG9nPTA7IC8qIHJlc2V0IHdhdGNoZG9nICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHJlYWQgZnJvbSBzb2NrZXQgKi8KKyAgICAgICAgaWYoc29ja19vcGVuX3JkICYmIHNvY2tfY2FuX3JkKSB7CisgICAgICAgICAgICBudW09cmVhZHNvY2tldChjLT5zb2NrX3JmZC0+ZmQsCisgICAgICAgICAgICAgICAgYy0+c29ja19idWZmK2MtPnNvY2tfcHRyLCBCVUZGU0laRS1jLT5zb2NrX3B0cik7CisgICAgICAgICAgICBzd2l0Y2gobnVtKSB7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgIGlmKHBhcnNlX3NvY2tldF9lcnJvcihjLCAicmVhZHNvY2tldCIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogYSBub24tY3JpdGljYWwgZXJyb3I6IHJldHJ5ICovCisgICAgICAgICAgICAgICAgc29ja19vcGVuX3JkPXNvY2tfb3Blbl93cj0wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOiAvKiBjbG9zZSAqLworICAgICAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiUmVhZCBzb2NrZXQgY2xvc2VkIChyZWFkc29ja2V0KSIpOworICAgICAgICAgICAgICAgIHNvY2tfb3Blbl9yZD0wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjLT5zb2NrX3B0cis9KHNpemVfdCludW07CisgICAgICAgICAgICAgICAgd2F0Y2hkb2c9MDsgLyogcmVzZXQgd2F0Y2hkb2cgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdXBkYXRlICpfd2FudHNfKiBiYXNlZCBvbiBuZXcgKl9wdHIgKi8KKyAgICAgICAgLyogdGhpcyB1cGRhdGUgaXMgYWxzbyByZXF1aXJlZCBmb3IgU1NMX3BlbmRpbmcoKSB0byBiZSB1c2VkICovCisgICAgICAgIHJlYWRfd2FudHNfcmVhZHw9IShTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1JFQ0VJVkVEX1NIVVRET1dOKQorICAgICAgICAgICAgJiYgYy0+c3NsX3B0cjxCVUZGU0laRSAmJiAhcmVhZF93YW50c193cml0ZTsKKyAgICAgICAgd3JpdGVfd2FudHNfd3JpdGV8PSEoU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpJlNTTF9TRU5UX1NIVVRET1dOKQorICAgICAgICAgICAgJiYgYy0+c29ja19wdHIgJiYgIXdyaXRlX3dhbnRzX3JlYWQ7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3cml0ZSB0byBTU0wgKi8KKyAgICAgICAgaWYoKHdyaXRlX3dhbnRzX3JlYWQgJiYgc3NsX2Nhbl9yZCkgfHwKKyAgICAgICAgICAgICAgICAod3JpdGVfd2FudHNfd3JpdGUgJiYgc3NsX2Nhbl93cikpIHsKKyAgICAgICAgICAgIHdyaXRlX3dhbnRzX3JlYWQ9MDsKKyAgICAgICAgICAgIHdyaXRlX3dhbnRzX3dyaXRlPTA7CisgICAgICAgICAgICBudW09U1NMX3dyaXRlKGMtPnNzbCwgYy0+c29ja19idWZmLCAoaW50KShjLT5zb2NrX3B0cikpOworICAgICAgICAgICAgc3dpdGNoKGVycj1TU0xfZ2V0X2Vycm9yKGMtPnNzbCwgKGludCludW0pKSB7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgIGlmKG51bT09MCkKKyAgICAgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU1NMX3dyaXRlIHJldHVybmVkIDAiKTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKGMtPnNvY2tfYnVmZiwgYy0+c29ja19idWZmK251bSwKKyAgICAgICAgICAgICAgICAgICAgYy0+c29ja19wdHItKHNpemVfdCludW0pOworICAgICAgICAgICAgICAgIGMtPnNvY2tfcHRyLT0oc2l6ZV90KW51bTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYy0+c29ja19idWZmK2MtPnNvY2tfcHRyLCAwLCAoc2l6ZV90KW51bSk7IC8qIHBhcmFub2lhICovCisgICAgICAgICAgICAgICAgYy0+c3NsX2J5dGVzKz0oc2l6ZV90KW51bTsKKyAgICAgICAgICAgICAgICB3YXRjaGRvZz0wOyAvKiByZXNldCB3YXRjaGRvZyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURTogLyogYnVmZmVyZWQgZGF0YT8gKi8KKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTU0xfd3JpdGUgcmV0dXJuZWQgV0FOVF9XUklURTogcmV0cnlpbmciKTsKKyAgICAgICAgICAgICAgICB3cml0ZV93YW50c193cml0ZT0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNTTF93cml0ZSByZXR1cm5lZCBXQU5UX1JFQUQ6IHJldHJ5aW5nIik7CisgICAgICAgICAgICAgICAgd3JpdGVfd2FudHNfcmVhZD0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICJTU0xfd3JpdGUgcmV0dXJuZWQgV0FOVF9YNTA5X0xPT0tVUDogcmV0cnlpbmciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6IC8qIHNvY2tldCBlcnJvciAqLworICAgICAgICAgICAgICAgIGlmKG51bSAmJiBwYXJzZV9zb2NrZXRfZXJyb3IoYywgIlNTTF93cml0ZSIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogYSBub24tY3JpdGljYWwgZXJyb3I6IHJldHJ5ICovCisgICAgICAgICAgICAgICAgLyogRU9GIC0+IGJ1Z2d5IChlLmcuIE1pY3Jvc29mdCkgcGVlcjoKKyAgICAgICAgICAgICAgICAgKiBTU0wgc29ja2V0IGNsb3NlZCB3aXRob3V0IGNsb3NlX25vdGlmeSBhbGVydCAqLworICAgICAgICAgICAgICAgIGlmKGMtPnNvY2tfcHRyKSB7IC8qIFRPRE86IHdoYXQgYWJvdXQgYnVmZmVyZWQgZGF0YT8gKi8KKyAgICAgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgc29ja2V0IGNsb3NlZCAoU1NMX3dyaXRlKSB3aXRoICVsZCB1bnNlbnQgYnl0ZShzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5zb2NrX3B0cik7CisgICAgICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogcmVzZXQgdGhlIHNvY2tldCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNTTCBzb2NrZXQgY2xvc2VkIChTU0xfd3JpdGUpIik7CisgICAgICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wsIFNTTF9TRU5UX1NIVVRET1dOfFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjogLyogY2xvc2Vfbm90aWZ5IGFsZXJ0IHJlY2VpdmVkICovCisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJTU0wgY2xvc2VkIChTU0xfd3JpdGUpIik7CisgICAgICAgICAgICAgICAgaWYoU1NMX3ZlcnNpb24oYy0+c3NsKT09U1NMMl9WRVJTSU9OKQorICAgICAgICAgICAgICAgICAgICBTU0xfc2V0X3NodXRkb3duKGMtPnNzbCwgU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgICAgICBzc2xlcnJvcigiU1NMX3dyaXRlIik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiU1NMX3dyaXRlL1NTTF9nZXRfZXJyb3IgcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcmVhZCBmcm9tIFNTTCAqLworICAgICAgICBpZigocmVhZF93YW50c19yZWFkICYmIChzc2xfY2FuX3JkIHx8IFNTTF9wZW5kaW5nKGMtPnNzbCkpKSB8fAorICAgICAgICAgICAgICAgIC8qIGl0IG1heSBiZSBwb3NzaWJsZSB0byByZWFkIHNvbWUgcGVuZGluZyBkYXRhIGFmdGVyCisgICAgICAgICAgICAgICAgICogd3JpdGVzb2NrZXQoKSBhYm92ZSBtYWRlIHNvbWUgcm9vbSBpbiBjLT5zc2xfYnVmZiAqLworICAgICAgICAgICAgICAgIChyZWFkX3dhbnRzX3dyaXRlICYmIHNzbF9jYW5fd3IpKSB7CisgICAgICAgICAgICByZWFkX3dhbnRzX3JlYWQ9MDsKKyAgICAgICAgICAgIHJlYWRfd2FudHNfd3JpdGU9MDsKKyAgICAgICAgICAgIG51bT1TU0xfcmVhZChjLT5zc2wsIGMtPnNzbF9idWZmK2MtPnNzbF9wdHIsIChpbnQpKEJVRkZTSVpFLWMtPnNzbF9wdHIpKTsKKyAgICAgICAgICAgIHN3aXRjaChlcnI9U1NMX2dldF9lcnJvcihjLT5zc2wsIChpbnQpbnVtKSkgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgICAgICBpZihudW09PTApCisgICAgICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNTTF9yZWFkIHJldHVybmVkIDAiKTsKKyAgICAgICAgICAgICAgICBjLT5zc2xfcHRyKz0oc2l6ZV90KW51bTsKKyAgICAgICAgICAgICAgICB3YXRjaGRvZz0wOyAvKiByZXNldCB3YXRjaGRvZyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTU0xfcmVhZCByZXR1cm5lZCBXQU5UX1dSSVRFOiByZXRyeWluZyIpOworICAgICAgICAgICAgICAgIHJlYWRfd2FudHNfd3JpdGU9MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDogLyogaGFwcGVucyBxdWl0ZSBvZnRlbiAqLworI2lmIDAKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTU0xfcmVhZCByZXR1cm5lZCBXQU5UX1JFQUQ6IHJldHJ5aW5nIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZWFkX3dhbnRzX3JlYWQ9MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAiU1NMX3JlYWQgcmV0dXJuZWQgV0FOVF9YNTA5X0xPT0tVUDogcmV0cnlpbmciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgICAgaWYobnVtICYmIHBhcnNlX3NvY2tldF9lcnJvcihjLCAiU1NMX3JlYWQiKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGEgbm9uLWNyaXRpY2FsIGVycm9yOiByZXRyeSAqLworICAgICAgICAgICAgICAgIC8qIEVPRiAtPiBidWdneSAoZS5nLiBNaWNyb3NvZnQpIHBlZXI6CisgICAgICAgICAgICAgICAgICogU1NMIHNvY2tldCBjbG9zZWQgd2l0aG91dCBjbG9zZV9ub3RpZnkgYWxlcnQgKi8KKyAgICAgICAgICAgICAgICBpZihjLT5zb2NrX3B0ciB8fCB3cml0ZV93YW50c193cml0ZSkgeworICAgICAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBzb2NrZXQgY2xvc2VkIChTU0xfcmVhZCkgd2l0aCAlbGQgdW5zZW50IGJ5dGUocykiLAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+c29ja19wdHIpOworICAgICAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIHJlc2V0IHRoZSBzb2NrZXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJTU0wgc29ja2V0IGNsb3NlZCAoU1NMX3JlYWQpIik7CisgICAgICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wsCisgICAgICAgICAgICAgICAgICAgIFNTTF9TRU5UX1NIVVRET1dOfFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjogLyogY2xvc2Vfbm90aWZ5IGFsZXJ0IHJlY2VpdmVkICovCisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJTU0wgY2xvc2VkIChTU0xfcmVhZCkiKTsKKyAgICAgICAgICAgICAgICBpZihTU0xfdmVyc2lvbihjLT5zc2wpPT1TU0wyX1ZFUlNJT04pCisgICAgICAgICAgICAgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oYy0+c3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgICAgICBzc2xlcnJvcigiU1NMX3JlYWQiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJTU0xfcmVhZC9TU0xfZ2V0X2Vycm9yIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNoZWNrIGZvciBoYW5ndXAgY29uZGl0aW9ucyAqLworICAgICAgICAvKiBodHRwOi8vbWFyYy5pbmZvLz9sPWxpbnV4LW1hbiZtPTEyODAwMjA2NjMwNjA4NyAqLworICAgICAgICAvKiByZWFkc29ja2V0KCkgbXVzdCBiZSB0aGUgbGFzdCBzb2NrX3JmZCBvcGVyYXRpb24gYmVmb3JlIEZJT05SRUFEICovCisgICAgICAgIGlmKHNvY2tfb3Blbl9yZCAmJiBzX3BvbGxfcmRodXAoYy0+ZmRzLCBjLT5zb2NrX3JmZC0+ZmQpICYmCisgICAgICAgICAgICAgICAgKGlvY3Rsc29ja2V0KGMtPnNvY2tfcmZkLT5mZCwgRklPTlJFQUQsICZieXRlcykgfHwgIWJ5dGVzKSkgeworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJSZWFkIHNvY2tldCBjbG9zZWQgKHJlYWQgaGFuZ3VwKSIpOworICAgICAgICAgICAgc29ja19vcGVuX3JkPTA7CisgICAgICAgIH0KKyAgICAgICAgaWYoc29ja19vcGVuX3dyICYmIHNfcG9sbF9odXAoYy0+ZmRzLCBjLT5zb2NrX3dmZC0+ZmQpKSB7CisgICAgICAgICAgICBpZihjLT5zc2xfcHRyKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgIldyaXRlIHNvY2tldCBjbG9zZWQgKHdyaXRlIGhhbmd1cCkgd2l0aCAlbGQgdW5zZW50IGJ5dGUocykiLAorICAgICAgICAgICAgICAgICAgICBjLT5zc2xfcHRyKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIHJlc2V0IHRoZSBzb2NrZXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiV3JpdGUgc29ja2V0IGNsb3NlZCAod3JpdGUgaGFuZ3VwKSIpOworICAgICAgICAgICAgc29ja19vcGVuX3dyPTA7CisgICAgICAgIH0KKyAgICAgICAgLyogU1NMX3JlYWQoKSBtdXN0IGJlIHRoZSBsYXN0IHNzbF9yZmQgb3BlcmF0aW9uIGJlZm9yZSBGSU9OUkVBRCAqLworICAgICAgICBpZighKFNTTF9nZXRfc2h1dGRvd24oYy0+c3NsKSZTU0xfUkVDRUlWRURfU0hVVERPV04pICYmCisgICAgICAgICAgICAgICAgc19wb2xsX3JkaHVwKGMtPmZkcywgYy0+c3NsX3JmZC0+ZmQpICYmCisgICAgICAgICAgICAgICAgKGlvY3Rsc29ja2V0KGMtPnNzbF9yZmQtPmZkLCBGSU9OUkVBRCwgJmJ5dGVzKSB8fCAhYnl0ZXMpKSB7CisgICAgICAgICAgICAvKiBoYW5ndXAgLT4gYnVnZ3kgKGUuZy4gTWljcm9zb2Z0KSBwZWVyOgorICAgICAgICAgICAgICogU1NMIHNvY2tldCBjbG9zZWQgd2l0aG91dCBjbG9zZV9ub3RpZnkgYWxlcnQgKi8KKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiU1NMIHNvY2tldCBjbG9zZWQgKHJlYWQgaGFuZ3VwKSIpOworICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wsCisgICAgICAgICAgICAgICAgU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpfFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgICAgICAgIH0KKyAgICAgICAgaWYoIShTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1NFTlRfU0hVVERPV04pICYmCisgICAgICAgICAgICAgICAgc19wb2xsX2h1cChjLT5mZHMsIGMtPnNzbF93ZmQtPmZkKSkgeworICAgICAgICAgICAgaWYoYy0+c29ja19wdHIgfHwgd3JpdGVfd2FudHNfd3JpdGUpIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLAorICAgICAgICAgICAgICAgICAgICAiU1NMIHNvY2tldCBjbG9zZWQgKHdyaXRlIGhhbmd1cCkgd2l0aCAlbGQgdW5zZW50IGJ5dGUocykiLAorICAgICAgICAgICAgICAgICAgICBjLT5zb2NrX3B0cik7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOyAvKiByZXNldCB0aGUgc29ja2V0ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNTTCBzb2NrZXQgY2xvc2VkICh3cml0ZSBoYW5ndXApIik7CisgICAgICAgICAgICBTU0xfc2V0X3NodXRkb3duKGMtPnNzbCwKKyAgICAgICAgICAgICAgICBTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCl8U1NMX1NFTlRfU0hVVERPV04pOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjaGVjayB3cml0ZSBzaHV0ZG93biBjb25kaXRpb25zICovCisgICAgICAgIGlmKHNvY2tfb3Blbl93ciAmJiBTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1JFQ0VJVkVEX1NIVVRET1dOICYmCisgICAgICAgICAgICAgICAgIWMtPnNzbF9wdHIpIHsKKyAgICAgICAgICAgIHNvY2tfb3Blbl93cj0wOyAvKiBubyBmdXJ0aGVyIHdyaXRlIGFsbG93ZWQgKi8KKyAgICAgICAgICAgIGlmKCFjLT5zb2NrX3dmZC0+aXNfc29ja2V0KSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiQ2xvc2luZyB0aGUgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgICAgICAgICAgc29ja19vcGVuX3JkPTA7IC8qIGZpbGUgZGVzY3JpcHRvciBpcyByZWFkeSB0byBiZSBjbG9zZWQgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZighc2h1dGRvd24oYy0+c29ja193ZmQtPmZkLCBTSFVUX1dSKSkgeyAvKiBzZW5kIFRDUCBGSU4gKi8KKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTZW50IHNvY2tldCB3cml0ZSBzaHV0ZG93biIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJGYWlsZWQgdG8gc2VuZCBzb2NrZXQgd3JpdGUgc2h1dGRvd24iKTsKKyAgICAgICAgICAgICAgICBzb2NrX29wZW5fcmQ9MDsgLyogZmlsZSBkZXNjcmlwdG9yIGlzIHJlYWR5IHRvIGJlIGNsb3NlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCEoU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpJlNTTF9TRU5UX1NIVVRET1dOKSAmJiAhc29ja19vcGVuX3JkICYmCisgICAgICAgICAgICAgICAgIWMtPnNvY2tfcHRyICYmICF3cml0ZV93YW50c193cml0ZSkgeworICAgICAgICAgICAgaWYoU1NMX3ZlcnNpb24oYy0+c3NsKSE9U1NMMl9WRVJTSU9OKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU2VuZGluZyBjbG9zZV9ub3RpZnkgYWxlcnQiKTsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bl93YW50c193cml0ZT0xOworICAgICAgICAgICAgfSBlbHNlIHsgLyogbm8gYWxlcnRzIGluIFNTTHYyLCBpbmNsdWRpbmcgdGhlIGNsb3NlX25vdGlmeSBhbGVydCAqLworICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkNsb3NpbmcgU1NMdjIgc29ja2V0Iik7CisgICAgICAgICAgICAgICAgaWYoYy0+c3NsX3JmZC0+aXNfc29ja2V0KQorICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bihjLT5zc2xfcmZkLT5mZCwgU0hVVF9SRCk7IC8qIG5vdGlmeSB0aGUga2VybmVsICovCisgICAgICAgICAgICAgICAgaWYoYy0+c3NsX3dmZC0+aXNfc29ja2V0KQorICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bihjLT5zc2xfd2ZkLT5mZCwgU0hVVF9XUik7IC8qIHNlbmQgVENQIEZJTiAqLworICAgICAgICAgICAgICAgIC8qIG5vdGlmeSB0aGUgT3BlblNTTCBsaWJyYXJ5ICovCisgICAgICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihjLT5zc2wsIFNTTF9TRU5UX1NIVVRET1dOfFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNoZWNrIHdhdGNoZG9nICovCisgICAgICAgIGlmKCsrd2F0Y2hkb2c+MTAwKSB7IC8qIGxvb3AgZXhlY3V0ZXMgd2l0aG91dCB0cmFuc2ZlcnJpbmcgYW55IGRhdGEgKi8KKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsCisgICAgICAgICAgICAgICAgInRyYW5zZmVyKCkgbG9vcCBleGVjdXRlcyBub3QgdHJhbnNmZXJyaW5nIGFueSBkYXRhIik7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLAorICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIHRvIE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldCIpOworICAgICAgICAgICAgc3R1bm5lbF9pbmZvKExPR19FUlIpOworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgInByb3RvY29sPSVzLCBTU0xfcGVuZGluZz0lZCIsCisgICAgICAgICAgICAgICAgU1NMX2dldF92ZXJzaW9uKGMtPnNzbCksIFNTTF9wZW5kaW5nKGMtPnNzbCkpOworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgInNvY2tfb3Blbl9yZD0lcywgc29ja19vcGVuX3dyPSVzIiwKKyAgICAgICAgICAgICAgICBzb2NrX29wZW5fcmQgPyAiWSIgOiAibiIsIHNvY2tfb3Blbl93ciA/ICJZIiA6ICJuIik7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiU1NMX1JFQ0VJVkVEX1NIVVRET1dOPSVzLCBTU0xfU0VOVF9TSFVURE9XTj0lcyIsCisgICAgICAgICAgICAgICAgU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpJlNTTF9SRUNFSVZFRF9TSFVURE9XTiA/ICJZIiA6ICJuIiwKKyAgICAgICAgICAgICAgICBTU0xfZ2V0X3NodXRkb3duKGMtPnNzbCkmU1NMX1NFTlRfU0hVVERPV04gPyAiWSIgOiAibiIpOworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgInNvY2tfY2FuX3JkPSVzLCBzb2NrX2Nhbl93cj0lcyIsCisgICAgICAgICAgICAgICAgc29ja19jYW5fcmQgPyAiWSIgOiAibiIsIHNvY2tfY2FuX3dyID8gIlkiIDogIm4iKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJzc2xfY2FuX3JkPSVzLCBzc2xfY2FuX3dyPSVzIiwKKyAgICAgICAgICAgICAgICBzc2xfY2FuX3JkID8gIlkiIDogIm4iLCBzc2xfY2FuX3dyID8gIlkiIDogIm4iKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJyZWFkX3dhbnRzX3JlYWQ9JXMsIHJlYWRfd2FudHNfd3JpdGU9JXMiLAorICAgICAgICAgICAgICAgIHJlYWRfd2FudHNfcmVhZCA/ICJZIiA6ICJuIiwgcmVhZF93YW50c193cml0ZSA/ICJZIiA6ICJuIik7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAid3JpdGVfd2FudHNfcmVhZD0lcywgd3JpdGVfd2FudHNfd3JpdGU9JXMiLAorICAgICAgICAgICAgICAgIHdyaXRlX3dhbnRzX3JlYWQgPyAiWSIgOiAibiIsIHdyaXRlX3dhbnRzX3dyaXRlID8gIlkiIDogIm4iKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJzaHV0ZG93bl93YW50c19yZWFkPSVzLCBzaHV0ZG93bl93YW50c193cml0ZT0lcyIsCisgICAgICAgICAgICAgICAgc2h1dGRvd25fd2FudHNfcmVhZCA/ICJZIiA6ICJuIiwKKyAgICAgICAgICAgICAgICBzaHV0ZG93bl93YW50c193cml0ZSA/ICJZIiA6ICJuIik7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAic29ja2V0IGlucHV0IGJ1ZmZlcjogJWxkIGJ5dGUocyksICIKKyAgICAgICAgICAgICAgICAic3NsIGlucHV0IGJ1ZmZlcjogJWxkIGJ5dGUocykiLCBjLT5zb2NrX3B0ciwgYy0+c3NsX3B0cik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUoc29ja19vcGVuX3dyIHx8ICEoU1NMX2dldF9zaHV0ZG93bihjLT5zc2wpJlNTTF9TRU5UX1NIVVRET1dOKSB8fAorICAgICAgICBzaHV0ZG93bl93YW50c19yZWFkIHx8IHNodXRkb3duX3dhbnRzX3dyaXRlKTsKK30KKworICAgIC8qIHJldHVybnMgMCBvbiBjbG9zZSBhbmQgMSBvbiBub24tY3JpdGljYWwgZXJyb3JzICovCitOT0VYUE9SVCBpbnQgcGFyc2Vfc29ja2V0X2Vycm9yKENMSSAqYywgY29uc3QgY2hhciAqdGV4dCkgeworICAgIHN3aXRjaChnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSkgeworICAgICAgICAvKiBodHRwOi8vdGFuZ2VudHNvZnQubmV0L3dza2ZhcS9hcnRpY2xlcy9ic2QtY29tcGF0aWJpbGl0eS5odG1sICovCisgICAgY2FzZSAwOiAvKiBjbG9zZSBvbiByZWFkLCBvciBjbG9zZSBvbiB3cml0ZSBvbiBXSU4zMiAqLworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBjYXNlIEVQSVBFOiAvKiBjbG9zZSBvbiB3cml0ZSBvbiBVbml4ICovCisjZW5kaWYKKyAgICBjYXNlIFNfRUNPTk5BQk9SVEVEOgorICAgICAgICBzX2xvZyhMT0dfSU5GTywgIiVzOiBTb2NrZXQgaXMgY2xvc2VkIiwgdGV4dCk7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgU19FSU5UUjoKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJXM6IEludGVycnVwdGVkIGJ5IGEgc2lnbmFsOiByZXRyeWluZyIsIHRleHQpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFNfRVdPVUxEQkxPQ0s6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlczogV291bGQgYmxvY2s6IHJldHJ5aW5nIiwgdGV4dCk7CisgICAgICAgIHNsZWVwKDEpOyAvKiBNaWNyb3NvZnQgYnVnIEtCMTc3MzQ2ICovCisgICAgICAgIHJldHVybiAxOworI2lmIFNfRUFHQUlOIT1TX0VXT1VMREJMT0NLCisgICAgY2FzZSBTX0VBR0FJTjoKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLAorICAgICAgICAgICAgIiVzOiBUZW1wb3JhcnkgbGFjayBvZiByZXNvdXJjZXM6IHJldHJ5aW5nIiwgdGV4dCk7CisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisjaWZkZWYgVVNFX1dJTjMyCisgICAgY2FzZSBTX0VDT05OUkVTRVQ6CisgICAgICAgIC8qIGR5aW5nICJleGVjIiBwcm9jZXNzZXMgb24gV2luMzIgY2F1c2UgcmVzZXQgaW5zdGVhZCBvZiBjbG9zZSAqLworICAgICAgICBpZihjLT5vcHQtPmV4ZWNfbmFtZSkgeworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICIlczogU29ja2V0IGlzIGNsb3NlZCAoZXhlYykiLCB0ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBzb2NrZXJyb3IodGV4dCk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgcmV0dXJuIC0xOyAvKiBzb21lIEMgY29tcGlsZXJzIHJlcXVpcmUgYSByZXR1cm4gdmFsdWUgKi8KKyAgICB9Cit9CisKK05PRVhQT1JUIHZvaWQgcHJpbnRfY2lwaGVyKENMSSAqYykgeyAvKiBwcmludCBuZWdvdGlhdGVkIGNpcGhlciAqLworICAgIFNTTF9DSVBIRVIgKmNpcGhlcjsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisgICAgY29uc3QgQ09NUF9NRVRIT0QgKmNvbXByZXNzaW9uLCAqZXhwYW5zaW9uOworI2VuZGlmCisKKyAgICBpZihjLT5vcHQtPmxvZ19sZXZlbDxMT0dfSU5GTykgLyogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uICovCisgICAgICAgIHJldHVybjsKKyAgICBjaXBoZXI9KFNTTF9DSVBIRVIgKilTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGMtPnNzbCk7CisgICAgc19sb2coTE9HX0lORk8sICJOZWdvdGlhdGVkICVzIGNpcGhlcnN1aXRlICVzICglZC1iaXQgZW5jcnlwdGlvbikiLAorICAgICAgICBTU0xfZ2V0X3ZlcnNpb24oYy0+c3NsKSwgU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpLAorICAgICAgICBTU0xfQ0lQSEVSX2dldF9iaXRzKGNpcGhlciwgTlVMTCkpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorICAgIGNvbXByZXNzaW9uPVNTTF9nZXRfY3VycmVudF9jb21wcmVzc2lvbihjLT5zc2wpOworICAgIGV4cGFuc2lvbj1TU0xfZ2V0X2N1cnJlbnRfZXhwYW5zaW9uKGMtPnNzbCk7CisgICAgc19sb2coY29tcHJlc3Npb258fGV4cGFuc2lvbiA/IExPR19JTkZPIDogTE9HX0RFQlVHLAorICAgICAgICAiQ29tcHJlc3Npb246ICVzLCBleHBhbnNpb246ICVzIiwKKyAgICAgICAgY29tcHJlc3Npb24gPyBTU0xfQ09NUF9nZXRfbmFtZShjb21wcmVzc2lvbikgOiAibnVsbCIsCisgICAgICAgIGV4cGFuc2lvbiA/IFNTTF9DT01QX2dldF9uYW1lKGV4cGFuc2lvbikgOiAibnVsbCIpOworI2VuZGlmCit9CisKK05PRVhQT1JUIHZvaWQgYXV0aF91c2VyKENMSSAqYywgY2hhciAqYWNjZXB0ZWRfYWRkcmVzcykgeworI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgc3RydWN0IHNlcnZlbnQgKnNfZW50OyAgICAvKiBzdHJ1Y3R1cmUgZm9yIGdldHNlcnZieW5hbWUgKi8KKyNlbmRpZgorICAgIFNPQ0tBRERSX1VOSU9OIGlkZW50OyAgICAgLyogSURFTlQgc29ja2V0IG5hbWUgKi8KKyAgICBjaGFyICpsaW5lLCAqdHlwZSwgKnN5c3RlbSwgKnVzZXI7CisKKyAgICBpZighYy0+b3B0LT51c2VybmFtZSkKKyAgICAgICAgcmV0dXJuOyAvKiAtdSBvcHRpb24gbm90IHNwZWNpZmllZCAqLworI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1VOCisgICAgaWYoYy0+cGVlcl9hZGRyLnNhLnNhX2ZhbWlseT09QUZfVU5JWCkgeworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIklERU5UIG5vdCBzdXBwb3J0ZWQgb24gVW5peCBzb2NrZXRzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjLT5mZD1zX3NvY2tldChjLT5wZWVyX2FkZHIuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwKKyAgICAgICAgMCwgMSwgInNvY2tldCAoYXV0aF91c2VyKSIpOworICAgIGlmKGMtPmZkPT1JTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIG1lbWNweSgmaWRlbnQsICZjLT5wZWVyX2FkZHIsIChzaXplX3QpYy0+cGVlcl9hZGRyX2xlbik7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBzX2VudD1nZXRzZXJ2YnluYW1lKCJhdXRoIiwgInRjcCIpOworICAgIGlmKHNfZW50KSB7CisgICAgICAgIGlkZW50LmluLnNpbl9wb3J0PSh1X3Nob3J0KXNfZW50LT5zX3BvcnQ7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiVW5rbm93biBzZXJ2aWNlICdhdXRoJzogdXNpbmcgZGVmYXVsdCAxMTMiKTsKKyAgICAgICAgaWRlbnQuaW4uc2luX3BvcnQ9aHRvbnMoMTEzKTsKKyAgICB9CisgICAgaWYoc19jb25uZWN0KGMsICZpZGVudCwgYWRkcl9sZW4oJmlkZW50KSkpCisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICBzX2xvZyhMT0dfREVCVUcsICJJREVOVCBzZXJ2ZXIgY29ubmVjdGVkIik7CisgICAgZmRfcHJpbnRmKGMsIGMtPmZkLCAiJXUgLCAldSIsCisgICAgICAgIG50b2hzKGMtPnBlZXJfYWRkci5pbi5zaW5fcG9ydCksCisgICAgICAgIG50b2hzKGMtPm9wdC0+bG9jYWxfYWRkci5pbi5zaW5fcG9ydCkpOworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5mZCk7CisgICAgY2xvc2Vzb2NrZXQoYy0+ZmQpOworICAgIGMtPmZkPUlOVkFMSURfU09DS0VUOyAvKiBhdm9pZCBkb3VibGUgY2xvc2Ugb24gY2xlYW51cCAqLworICAgIHR5cGU9c3RyY2hyKGxpbmUsICc6Jyk7CisgICAgaWYoIXR5cGUpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIk1hbGZvcm1lZCBJREVOVCByZXNwb25zZSIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICAqdHlwZSsrPSdcMCc7CisgICAgc3lzdGVtPXN0cmNocih0eXBlLCAnOicpOworICAgIGlmKCFzeXN0ZW0pIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIk1hbGZvcm1lZCBJREVOVCByZXNwb25zZSIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICAqc3lzdGVtKys9J1wwJzsKKyAgICBpZihzdHJjbXAodHlwZSwgIiBVU0VSSUQgIikpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkluY29ycmVjdCBJTkVURCByZXNwb25zZSB0eXBlIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHVzZXI9c3RyY2hyKHN5c3RlbSwgJzonKTsKKyAgICBpZighdXNlcikgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTWFsZm9ybWVkIElERU5UIHJlc3BvbnNlIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgICp1c2VyKys9J1wwJzsKKyAgICB3aGlsZSgqdXNlcj09JyAnKSAvKiBza2lwIGxlYWRpbmcgc3BhY2VzICovCisgICAgICAgICsrdXNlcjsKKyAgICBpZihzdHJjbXAodXNlciwgYy0+b3B0LT51c2VybmFtZSkpIHsKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJDb25uZWN0aW9uIGZyb20gJXMgUkVGVVNFRCBieSBJREVOVCAodXNlciBcIiVzXCIpIiwKKyAgICAgICAgICAgIGFjY2VwdGVkX2FkZHJlc3MsIHVzZXIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBzX2xvZyhMT0dfSU5GTywgIklERU5UIGF1dGhlbnRpY2F0aW9uIHBhc3NlZCIpOworICAgIHN0cl9mcmVlKGxpbmUpOworfQorCisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fdm1zKQorCitOT0VYUE9SVCBpbnQgY29ubmVjdF9sb2NhbChDTEkgKmMpIHsgLyogc3Bhd24gbG9jYWwgcHJvY2VzcyAqLworICAgIHNfbG9nKExPR19FUlIsICJMb2NhbCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICByZXR1cm4gLTE7IC8qIHNvbWUgQyBjb21waWxlcnMgcmVxdWlyZSBhIHJldHVybiB2YWx1ZSAqLworfQorCisjZWxpZiBkZWZpbmVkKFVTRV9XSU4zMikKKworTk9FWFBPUlQgU09DS0VUIGNvbm5lY3RfbG9jYWwoQ0xJICpjKSB7IC8qIHNwYXduIGxvY2FsIHByb2Nlc3MgKi8KKyAgICBTT0NLRVQgZmRbMl07CisgICAgU1RBUlRVUElORk8gc2k7CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgICBMUFRTVFIgbmFtZSwgYXJnczsKKworICAgIGlmKG1ha2Vfc29ja2V0cyhmZCkpCisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICBtZW1zZXQoJnNpLCAwLCBzaXplb2Ygc2kpOworICAgIHNpLmNiPXNpemVvZiBzaTsKKyAgICBzaS5kd0ZsYWdzPVNUQVJURl9VU0VTSE9XV0lORE9XfFNUQVJURl9VU0VTVERIQU5ETEVTOworICAgIHNpLndTaG93V2luZG93PVNXX0hJREU7CisgICAgc2kuaFN0ZElucHV0PXNpLmhTdGRPdXRwdXQ9c2kuaFN0ZEVycm9yPShIQU5ETEUpZmRbMV07CisgICAgbWVtc2V0KCZwaSwgMCwgc2l6ZW9mIHBpKTsKKworICAgIG5hbWU9c3RyMnRzdHIoYy0+b3B0LT5leGVjX25hbWUpOworICAgIGFyZ3M9c3RyMnRzdHIoYy0+b3B0LT5leGVjX2FyZ3MpOworICAgIENyZWF0ZVByb2Nlc3MobmFtZSwgYXJncywgTlVMTCwgTlVMTCwgVFJVRSwgMCwgTlVMTCwgTlVMTCwgJnNpLCAmcGkpOworICAgIHN0cl9mcmVlKG5hbWUpOworICAgIHN0cl9mcmVlKGFyZ3MpOworCisgICAgY2xvc2Vzb2NrZXQoZmRbMV0pOworICAgIENsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKKyAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKKyAgICByZXR1cm4gZmRbMF07Cit9CisKKyNlbHNlIC8qIHN0YW5kYXJkIFVuaXggdmVyc2lvbiAqLworCitOT0VYUE9SVCBTT0NLRVQgY29ubmVjdF9sb2NhbChDTEkgKmMpIHsgLyogc3Bhd24gbG9jYWwgcHJvY2VzcyAqLworICAgIGNoYXIgKm5hbWUsIGhvc3RbNDBdLCBwb3J0WzZdOworICAgIGludCBmZFsyXSwgcGlkOworICAgIFg1MDkgKnBlZXJfY2VydDsKKyNpZmRlZiBIQVZFX1BUSFJFQURfU0lHTUFTSworICAgIHNpZ3NldF90IG5ld21hc2s7CisjZW5kaWYKKworICAgIGlmKGMtPm9wdC0+b3B0aW9uLnB0eSkgeworICAgICAgICBjaGFyIHR0eVs2NF07CisKKyAgICAgICAgaWYocHR5X2FsbG9jYXRlKGZkLCBmZCsxLCB0dHkpKQorICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJUVFk9JXMgYWxsb2NhdGVkIiwgdHR5KTsKKyAgICB9IGVsc2UKKyAgICAgICAgaWYobWFrZV9zb2NrZXRzKGZkKSkKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKworICAgIHBpZD1mb3JrKCk7CisgICAgYy0+cGlkPSh1bnNpZ25lZCBsb25nKXBpZDsKKyAgICBzd2l0Y2gocGlkKSB7CisgICAgY2FzZSAtMTogICAgLyogZXJyb3IgKi8KKyAgICAgICAgY2xvc2Vzb2NrZXQoZmRbMF0pOworICAgICAgICBjbG9zZXNvY2tldChmZFsxXSk7CisgICAgICAgIGlvZXJyb3IoImZvcmsiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIGNhc2UgIDA6ICAgIC8qIGNoaWxkICovCisgICAgICAgIHRsc19hbGxvYyhOVUxMLCBjLT50bHMsIE5VTEwpOyAvKiByZXVzZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSAqLworICAgICAgICBjbG9zZXNvY2tldChmZFswXSk7CisgICAgICAgIHNldF9ub25ibG9jayhmZFsxXSwgMCk7IC8qIHN3aXRjaCBiYWNrIHRvIGJsb2NraW5nIG1vZGUgKi8KKyAgICAgICAgLyogZHVwMigpIGRvZXMgbm90IGNvcHkgRkRfQ0xPRVhFQyBmbGFnICovCisgICAgICAgIGR1cDIoZmRbMV0sIDApOworICAgICAgICBkdXAyKGZkWzFdLCAxKTsKKyAgICAgICAgaWYoIWdsb2JhbF9vcHRpb25zLm9wdGlvbi5mb3JlZ3JvdW5kKQorICAgICAgICAgICAgZHVwMihmZFsxXSwgMik7CisgICAgICAgIGNsb3Nlc29ja2V0KGZkWzFdKTsgLyogbm90IHJlYWxseSBuZWVkZWQgZHVlIHRvIEZEX0NMT0VYRUMgKi8KKworICAgICAgICBpZighZ2V0bmFtZWluZm8oJmMtPnBlZXJfYWRkci5zYSwgYy0+cGVlcl9hZGRyX2xlbiwKKyAgICAgICAgICAgICAgICBob3N0LCA0MCwgcG9ydCwgNiwgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpKSB7CisgICAgICAgICAgICAvKiBqdXN0IGRvbid0IHNldCB0aGVzZSB2YXJpYWJsZXMgaWYgZ2V0bmFtZWluZm8oKSBmYWlscyAqLworICAgICAgICAgICAgcHV0ZW52KHN0cl9wcmludGYoIlJFTU9URV9IT1NUPSVzIiwgaG9zdCkpOworICAgICAgICAgICAgcHV0ZW52KHN0cl9wcmludGYoIlJFTU9URV9QT1JUPSVzIiwgcG9ydCkpOworICAgICAgICAgICAgaWYoYy0+b3B0LT5vcHRpb24udHJhbnNwYXJlbnRfc3JjKSB7CisjaWZuZGVmIExJQkRJUgorI2RlZmluZSBMSUJESVIgIi4iCisjZW5kaWYKKyNpZmRlZiBNQUNINjQKKyAgICAgICAgICAgICAgICBwdXRlbnYoIkxEX1BSRUxPQURfMzI9IiBMSUJESVIgIi9saWJzdHVubmVsLnNvIik7CisgICAgICAgICAgICAgICAgcHV0ZW52KCJMRF9QUkVMT0FEXzY0PSIgTElCRElSICIvIiBNQUNINjQgIi9saWJzdHVubmVsLnNvIik7CisjZWxpZiBfX29zZiAvKiBmb3IgVHJ1NjQgX1JMRF9MSVNUIGlzIHVzZWQgaW5zdGVhZCAqLworICAgICAgICAgICAgICAgIHB1dGVudigiX1JMRF9MSVNUPSIgTElCRElSICIvbGlic3R1bm5lbC5zbzpERUZBVUxUIik7CisjZWxzZQorICAgICAgICAgICAgICAgIHB1dGVudigiTERfUFJFTE9BRD0iIExJQkRJUiAiL2xpYnN0dW5uZWwuc28iKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoYy0+c3NsKSB7CisgICAgICAgICAgICBwZWVyX2NlcnQ9U1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGMtPnNzbCk7CisgICAgICAgICAgICBpZihwZWVyX2NlcnQpIHsKKyAgICAgICAgICAgICAgICBuYW1lPVg1MDlfTkFNRTJ0ZXh0KFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyX2NlcnQpKTsKKyAgICAgICAgICAgICAgICBwdXRlbnYoc3RyX3ByaW50ZigiU1NMX0NMSUVOVF9ETj0lcyIsIG5hbWUpKTsKKyAgICAgICAgICAgICAgICBuYW1lPVg1MDlfTkFNRTJ0ZXh0KFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHBlZXJfY2VydCkpOworICAgICAgICAgICAgICAgIHB1dGVudihzdHJfcHJpbnRmKCJTU0xfQ0xJRU5UX0lfRE49JXMiLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgWDUwOV9mcmVlKHBlZXJfY2VydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBIQVZFX1BUSFJFQURfU0lHTUFTSworICAgICAgICBzaWdlbXB0eXNldCgmbmV3bWFzayk7CisgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbmV3bWFzaywgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworICAgICAgICBzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKKyAgICAgICAgc2lnbmFsKFNJR1VTUjEsIFNJR19ERkwpOworICAgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisgICAgICAgIHNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKKyAgICAgICAgc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworICAgICAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgICAgICAgZXhlY3ZwKGMtPm9wdC0+ZXhlY19uYW1lLCBjLT5vcHQtPmV4ZWNfYXJncyk7CisgICAgICAgIGlvZXJyb3IoYy0+b3B0LT5leGVjX25hbWUpOyAvKiBleGVjdnAgZmFpbGVkICovCisgICAgICAgIF9leGl0KDEpOworICAgIGRlZmF1bHQ6IC8qIHBhcmVudCAqLworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkxvY2FsIG1vZGUgY2hpbGQgc3RhcnRlZCAoUElEPSVsdSkiLCBjLT5waWQpOworICAgICAgICBjbG9zZXNvY2tldChmZFsxXSk7CisgICAgICAgIHJldHVybiBmZFswXTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBub3QgVVNFX1dJTjMyIG9yIF9fdm1zICovCisKKy8qIGNvbm5lY3QgcmVtb3RlIGhvc3QgKi8KK05PRVhQT1JUIFNPQ0tFVCBjb25uZWN0X3JlbW90ZShDTEkgKmMpIHsKKyAgICBTT0NLRVQgZmQ7CisgICAgdW5zaWduZWQgaW5kX3N0YXJ0LCBpbmRfdHJ5LCBpbmRfY3VyOworCisgICAgc2V0dXBfY29ubmVjdF9hZGRyKGMpOworICAgIHN3aXRjaChjLT5jb25uZWN0X2FkZHIubnVtKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTm8gcmVtb3RlIGhvc3QgcmVzb2x2ZWQiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIGNhc2UgMToKKyAgICAgICAgaW5kX3N0YXJ0PTA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGluZF9zdGFydD1jb25uZWN0X2luZGV4KGMpOworICAgIH0KKworICAgIC8qIHRyeSB0byBjb25uZWN0IGVhY2ggaG9zdCBmcm9tIHRoZSBsaXN0ICovCisgICAgZm9yKGluZF90cnk9MDsgaW5kX3RyeTxjLT5jb25uZWN0X2FkZHIubnVtOyBpbmRfdHJ5KyspIHsKKyAgICAgICAgaW5kX2N1cj0oaW5kX3N0YXJ0K2luZF90cnkpJWMtPmNvbm5lY3RfYWRkci5udW07CisgICAgICAgIGMtPmZkPXNfc29ja2V0KGMtPmNvbm5lY3RfYWRkci5hZGRyW2luZF9jdXJdLnNhLnNhX2ZhbWlseSwKKyAgICAgICAgICAgIFNPQ0tfU1RSRUFNLCAwLCAxLCAicmVtb3RlIHNvY2tldCIpOworICAgICAgICBpZihjLT5mZD09SU5WQUxJRF9TT0NLRVQpCisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisKKyAgICAgICAgbG9jYWxfYmluZChjKTsgLyogZXhwbGljaXQgbG9jYWwgYmluZCBvciB0cmFuc3BhcmVudCBwcm94eSAqLworCisgICAgICAgIGlmKHNfY29ubmVjdChjLCAmYy0+Y29ubmVjdF9hZGRyLmFkZHJbaW5kX2N1cl0sCisgICAgICAgICAgICAgICAgYWRkcl9sZW4oJmMtPmNvbm5lY3RfYWRkci5hZGRyW2luZF9jdXJdKSkpIHsKKyAgICAgICAgICAgIGNsb3Nlc29ja2V0KGMtPmZkKTsKKyAgICAgICAgICAgIGMtPmZkPUlOVkFMSURfU09DS0VUOworICAgICAgICAgICAgY29udGludWU7IC8qIG5leHQgSVAgKi8KKyAgICAgICAgfQorICAgICAgICBpZihjLT5zc2wpCisgICAgICAgICAgICBjb25uZWN0X2NhY2hlKFNTTF9nZXRfc2Vzc2lvbihjLT5zc2wpLAorICAgICAgICAgICAgICAgICZjLT5jb25uZWN0X2FkZHIuYWRkcltpbmRfY3VyXSk7CisgICAgICAgIHByaW50X2JvdW5kX2FkZHJlc3MoYyk7CisgICAgICAgIGZkPWMtPmZkOworICAgICAgICBjLT5mZD1JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgcmV0dXJuIGZkOyAvKiBzdWNjZXNzISAqLworICAgIH0KKyAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgcmV0dXJuIElOVkFMSURfU09DS0VUOyAvKiBzb21lIEMgY29tcGlsZXJzIHJlcXVpcmUgYSByZXR1cm4gdmFsdWUgKi8KK30KKworTk9FWFBPUlQgdm9pZCBjb25uZWN0X2NhY2hlKFNTTF9TRVNTSU9OICpzZXNzLCBTT0NLQUREUl9VTklPTiAqY3VyX2FkZHIpIHsKKyAgICBTT0NLQUREUl9VTklPTiAqb2xkX2FkZHIsICpuZXdfYWRkcjsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIGNoYXIgKmFkZHJfdHh0OworCisgICAgLyogbWFrZSBhIGNvcHkgb2YgdGhlIGFkZHJlc3MsIHNvIGl0IG1heSB3b3JrIHdpdGggZGVsYXllZCByZXNvbHZlciAqLworICAgIGxlbj1hZGRyX2xlbihjdXJfYWRkcik7CisgICAgbmV3X2FkZHI9c3RyX2FsbG9jX2RldGFjaGVkKChzaXplX3QpbGVuKTsKKyAgICBtZW1jcHkobmV3X2FkZHIsIGN1cl9hZGRyLCAoc2l6ZV90KWxlbik7CisKKyAgICBhZGRyX3R4dD1zX250b3AoY3VyX2FkZHIsIGxlbik7CisgICAgc19sb2coTE9HX0lORk8sICJwZXJzaXN0ZW5jZTogJXMgY2FjaGVkIiwgYWRkcl90eHQpOworICAgIHN0cl9mcmVlKGFkZHJfdHh0KTsKKworICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9BRERSKTsKKyAgICBvbGRfYWRkcj1TU0xfU0VTU0lPTl9nZXRfZXhfZGF0YShzZXNzLCBpbmRleF9hZGRyKTsKKyAgICBTU0xfU0VTU0lPTl9zZXRfZXhfZGF0YShzZXNzLCBpbmRleF9hZGRyLCBuZXdfYWRkcik7CisgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0FERFIpOworICAgIHN0cl9mcmVlKG9sZF9hZGRyKTsgLyogTlVMTCBwb2ludGVycyBhcmUgaWdub3JlZCAqLworfQorCitOT0VYUE9SVCB1bnNpZ25lZCBjb25uZWN0X2luZGV4KENMSSAqYykgeworICAgIHVuc2lnbmVkIGk7CisgICAgU09DS0FERFJfVU5JT04gYWRkciwgKnB0cjsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIGNoYXIgKmFkZHJfdHh0OworCisgICAgaWYoYy0+c3NsICYmIFNTTF9zZXNzaW9uX3JldXNlZChjLT5zc2wpKSB7CisgICAgICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9BRERSKTsKKyAgICAgICAgcHRyPVNTTF9TRVNTSU9OX2dldF9leF9kYXRhKFNTTF9nZXRfc2Vzc2lvbihjLT5zc2wpLCBpbmRleF9hZGRyKTsKKyAgICAgICAgaWYocHRyKSB7CisgICAgICAgICAgICBsZW49YWRkcl9sZW4ocHRyKTsKKyAgICAgICAgICAgIG1lbWNweSgmYWRkciwgcHRyLCAoc2l6ZV90KWxlbik7CisgICAgICAgICAgICBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKENSSVRfQUREUik7CisgICAgICAgICAgICAvKiBhZGRyZXNzIHdhcyBjb3BpZWQsIHB0ciBpdHNlbGYgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisgICAgICAgICAgICBmb3IoaT0wOyBpPGMtPmNvbm5lY3RfYWRkci5udW07ICsraSkgeworICAgICAgICAgICAgICAgIGlmKGFkZHJfbGVuKCZjLT5jb25uZWN0X2FkZHIuYWRkcltpXSk9PWxlbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcCgmYy0+Y29ubmVjdF9hZGRyLmFkZHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZHIsIChzaXplX3QpbGVuKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRyX3R4dD1zX250b3AoJmFkZHIsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAicGVyc2lzdGVuY2U6ICVzIHJldXNlZCIsIGFkZHJfdHh0KTsKKyAgICAgICAgICAgICAgICAgICAgc3RyX2ZyZWUoYWRkcl90eHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyX3R4dD1zX250b3AoJmFkZHIsIGxlbik7CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgInBlcnNpc3RlbmNlOiAlcyBub3QgYXZhaWxhYmxlIiwgYWRkcl90eHQpOworICAgICAgICAgICAgc3RyX2ZyZWUoYWRkcl90eHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0FERFIpOworICAgICAgICAgICAgc19sb2coTE9HX05PVElDRSwgInBlcnNpc3RlbmNlOiBObyBjYWNoZWQgYWRkcmVzcyBmb3VuZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYy0+b3B0LT5mYWlsb3Zlcj09RkFJTE9WRVJfUlIpIHsKKyAgICAgICAgLyogdGhlIHJhY2UgY29uZGl0aW9uIGhlcmUgY2FuIGJlIHNhZmVseSBpZ25vcmVkICovCisgICAgICAgIGk9KmMtPmNvbm5lY3RfYWRkci5ycl9wdHI7CisgICAgICAgICpjLT5jb25uZWN0X2FkZHIucnJfcHRyPShpKzEpJWMtPmNvbm5lY3RfYWRkci5udW07CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiZmFpbG92ZXI6IHJvdW5kLXJvYmluLCBzdGFydGluZyBhdCBlbnRyeSAjJWQiLCBpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpPTA7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiZmFpbG92ZXI6IHByaW9yaXR5LCBzdGFydGluZyBhdCBlbnRyeSAjMCIpOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworTk9FWFBPUlQgdm9pZCBzZXR1cF9jb25uZWN0X2FkZHIoQ0xJICpjKSB7CisjaWZkZWYgU09fT1JJR0lOQUxfRFNUCisgICAgc29ja2xlbl90IGFkZHJsZW49c2l6ZW9mKFNPQ0tBRERSX1VOSU9OKTsKKyNlbmRpZiAvKiBTT19PUklHSU5BTF9EU1QgKi8KKworICAgIC8qIHByb2Nlc3MgInJlZGlyZWN0IiBmaXJzdCAqLworICAgIGlmKGMtPnJlZGlyZWN0PT1SRURJUkVDVF9PTikgeworICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiUmVkaXJlY3RpbmcgY29ubmVjdGlvbiIpOworICAgICAgICAvKiBjLT5jb25uZWN0X2FkZHIuYWRkciBtYXkgYmUgYWxsb2NhdGVkIGluIHByb3RvY29sIG5lZ290aWF0aW9ucyAqLworICAgICAgICBzdHJfZnJlZShjLT5jb25uZWN0X2FkZHIuYWRkcik7CisgICAgICAgIGFkZHJsaXN0X2R1cCgmYy0+Y29ubmVjdF9hZGRyLCAmYy0+b3B0LT5yZWRpcmVjdF9hZGRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoZSBhZGRyZXNzIHdhcyBhbHJlYWR5IHNldCBpbiBwcm90b2NvbCBuZWdvdGlhdGlvbnMgKi8KKyAgICAvKiB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzOiBDT05ORUNULCBTT0NLUyAqLworICAgIGlmKGMtPmNvbm5lY3RfYWRkci5udW0pCisgICAgICAgIHJldHVybjsKKworICAgIC8qIHRyYW5zcGFyZW50IGRlc3RpbmF0aW9uICovCisjaWZkZWYgU09fT1JJR0lOQUxfRFNUCisgICAgaWYoYy0+b3B0LT5vcHRpb24udHJhbnNwYXJlbnRfZHN0KSB7CisgICAgICAgIGMtPmNvbm5lY3RfYWRkci5udW09MTsKKyAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHI9c3RyX2FsbG9jKHNpemVvZihTT0NLQUREUl9VTklPTikpOworICAgICAgICBpZihnZXRzb2Nrb3B0KGMtPmxvY2FsX3JmZC5mZCwgU09MX0lQLCBTT19PUklHSU5BTF9EU1QsCisgICAgICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHIsICZhZGRybGVuKSkgeworICAgICAgICAgICAgc29ja2Vycm9yKCJzZXRzb2Nrb3B0IFNPX09SSUdJTkFMX0RTVCIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogU09fT1JJR0lOQUxfRFNUICovCisKKyAgICAvKiBkZWZhdWx0ICJjb25uZWN0IiB0YXJnZXQgKi8KKyAgICBhZGRybGlzdF9kdXAoJmMtPmNvbm5lY3RfYWRkciwgJmMtPm9wdC0+Y29ubmVjdF9hZGRyKTsKK30KKworTk9FWFBPUlQgdm9pZCBsb2NhbF9iaW5kKENMSSAqYykgeworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBpbnQgb247CisKKyAgICBvbj0xOworI2VuZGlmCisgICAgaWYoIWMtPmJpbmRfYWRkcikKKyAgICAgICAgcmV0dXJuOworI2lmIGRlZmluZWQoVVNFX1dJTjMyKQorICAgIC8qIGRvIG5vdGhpbmcgKi8KKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQorICAgIC8qIG5vbi1sb2NhbCBiaW5kIG9uIExpbnV4ICovCisgICAgaWYoYy0+b3B0LT5vcHRpb24udHJhbnNwYXJlbnRfc3JjKSB7CisgICAgICAgIGlmKHNldHNvY2tvcHQoYy0+ZmQsIFNPTF9JUCwgSVBfVFJBTlNQQVJFTlQsICZvbiwgc2l6ZW9mIG9uKSkgeworICAgICAgICAgICAgc29ja2Vycm9yKCJzZXRzb2Nrb3B0IElQX1RSQU5TUEFSRU5UIik7CisgICAgICAgICAgICBpZihzZXRzb2Nrb3B0KGMtPmZkLCBTT0xfSVAsIElQX0ZSRUVCSU5ELCAmb24sIHNpemVvZiBvbikpCisgICAgICAgICAgICAgICAgc29ja2Vycm9yKCJzZXRzb2Nrb3B0IElQX0ZSRUVCSU5EIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJJUF9GUkVFQklORCBzb2NrZXQgb3B0aW9uIHNldCIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiSVBfVFJBTlNQQVJFTlQgc29ja2V0IG9wdGlvbiBzZXQiKTsKKyAgICAgICAgLyogaWdub3JlIHRoZSBlcnJvciB0byByZXRhaW4gTGludXggMi4yIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgLyogdGhlIGVycm9yIHdpbGwgYmUgaGFuZGxlZCBieSBiaW5kKCksIGFueXdheSAqLworICAgIH0KKyNlbGlmIGRlZmluZWQoSVBfQklOREFOWSkgJiYgZGVmaW5lZChJUFY2X0JJTkRBTlkpCisgICAgLyogbm9uLWxvY2FsIGJpbmQgb24gRnJlZUJTRCAqLworICAgIGlmKGMtPm9wdC0+b3B0aW9uLnRyYW5zcGFyZW50X3NyYykgeworICAgICAgICBpZihjLT5iaW5kX2FkZHItPnNhLnNhX2ZhbWlseT09QUZfSU5FVCkgeyAvKiBJUHY0ICovCisgICAgICAgICAgICBpZihzZXRzb2Nrb3B0KGMtPmZkLCBJUFBST1RPX0lQLCBJUF9CSU5EQU5ZLCAmb24sIHNpemVvZiBvbikpIHsKKyAgICAgICAgICAgICAgICBzb2NrZXJyb3IoInNldHNvY2tvcHQgSVBfQklOREFOWSIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLyogSVB2NiAqLworICAgICAgICAgICAgaWYoc2V0c29ja29wdChjLT5mZCwgSVBQUk9UT19JUFY2LCBJUFY2X0JJTkRBTlksICZvbiwgc2l6ZW9mIG9uKSkgeworICAgICAgICAgICAgICAgIHNvY2tlcnJvcigic2V0c29ja29wdCBJUFY2X0JJTkRBTlkiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIC8qIHVuc3VwcG9ydGVkIHBsYXRmb3JtICovCisgICAgaWYoYy0+b3B0LT5vcHRpb24udHJhbnNwYXJlbnRfc3JjKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJUcmFuc3BhcmVudCBwcm94eSBpbiByZW1vdGUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIgorICAgICAgICAgICAgIiBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKG50b2hzKGMtPmJpbmRfYWRkci0+aW4uc2luX3BvcnQpPj0xMDI0KSB7IC8qIHNlY3VyaXR5IGNoZWNrICovCisgICAgICAgIC8qIHRoaXMgaXMgY3VycmVudGx5IG9ubHkgcG9zc2libGUgd2l0aCB0cmFuc3BhcmVudF9zcmMgKi8KKyAgICAgICAgaWYoIWJpbmQoYy0+ZmQsICZjLT5iaW5kX2FkZHItPnNhLCBhZGRyX2xlbihjLT5iaW5kX2FkZHIpKSkgeworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJsb2NhbF9iaW5kIHN1Y2NlZWRlZCBvbiB0aGUgb3JpZ2luYWwgcG9ydCIpOworICAgICAgICAgICAgcmV0dXJuOyAvKiBzdWNjZXNzICovCisgICAgICAgIH0KKyAgICAgICAgaWYoZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkhPVNfRUFERFJJTlVTRSkgeworICAgICAgICAgICAgc29ja2Vycm9yKCJsb2NhbF9iaW5kIChvcmlnaW5hbCBwb3J0KSIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgYy0+YmluZF9hZGRyLT5pbi5zaW5fcG9ydD1odG9ucygwKTsgLyogcmV0cnkgd2l0aCBlcGhlbWVyYWwgcG9ydCAqLworICAgIGlmKCFiaW5kKGMtPmZkLCAmYy0+YmluZF9hZGRyLT5zYSwgYWRkcl9sZW4oYy0+YmluZF9hZGRyKSkpIHsKKyAgICAgICAgc19sb2coTE9HX0lORk8sICJsb2NhbF9iaW5kIHN1Y2NlZWRlZCBvbiBhbiBlcGhlbWVyYWwgcG9ydCIpOworICAgICAgICByZXR1cm47IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisgICAgc29ja2Vycm9yKCJsb2NhbF9iaW5kIChlcGhlbWVyYWwgcG9ydCkiKTsKKyAgICBsb25nam1wKGMtPmVyciwgMSk7Cit9CisKK05PRVhQT1JUIHZvaWQgcHJpbnRfYm91bmRfYWRkcmVzcyhDTEkgKmMpIHsKKyAgICBjaGFyICp0eHQ7CisgICAgU09DS0FERFJfVU5JT04gYWRkcjsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbj1zaXplb2YgYWRkcjsKKworICAgIGlmKGMtPm9wdC0+bG9nX2xldmVsPExPR19OT1RJQ0UpIC8qIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiAqLworICAgICAgICByZXR1cm47CisgICAgbWVtc2V0KCZhZGRyLCAwLCAoc2l6ZV90KWFkZHJsZW4pOworICAgIGlmKGdldHNvY2tuYW1lKGMtPmZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKSkgeworICAgICAgICBzb2NrZXJyb3IoImdldHNvY2tuYW1lIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdHh0PXNfbnRvcCgmYWRkciwgYWRkcmxlbik7CisgICAgc19sb2coTE9HX05PVElDRSwiU2VydmljZSBbJXNdIGNvbm5lY3RlZCByZW1vdGUgc2VydmVyIGZyb20gJXMiLAorICAgICAgICBjLT5vcHQtPnNlcnZuYW1lLCB0eHQpOworICAgIHN0cl9mcmVlKHR4dCk7Cit9CisKK05PRVhQT1JUIHZvaWQgcmVzZXQoU09DS0VUIGZkLCBjaGFyICp0eHQpIHsgLyogc2V0IGxpbmdlcmluZyBvbiBhIHNvY2tldCAqLworICAgIHN0cnVjdCBsaW5nZXIgbDsKKworICAgIGwubF9vbm9mZj0xOworICAgIGwubF9saW5nZXI9MDsKKyAgICBpZihzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICh2b2lkICopJmwsIHNpemVvZiBsKSkKKyAgICAgICAgbG9nX2Vycm9yKExPR19ERUJVRywgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCksIHR4dCk7Cit9CisKKy8qIGVuZCBvZiBjbGllbnQuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi5oIGIvc3JjL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0N2M5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tbW9uLmgKQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICogCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICogCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqIAorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaWZuZGVmIENPTU1PTl9ICisjZGVmaW5lIENPTU1PTl9ICisKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNvbW1vbiBjb25zdGFudHMgKi8KKworI2RlZmluZSBMSUJXUkFQX0NMSUVOVFMgNQorCisvKiBDUFUgc3RhY2sgc2l6ZSAqLworI2RlZmluZSBERUZBVUxUX1NUQUNLX1NJWkUgNjU1MzYKKy8qICNkZWZpbmUgREVCVUdfU1RBQ0tfU0laRSAqLworCisvKiBJL08gYnVmZmVyIHNpemU6IDE4NDMyICgweDQ4MDApIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgU1NMIHJlY29yZCBwYXlsb2FkICovCisjZGVmaW5lIEJVRkZTSVpFIDE4NDMyCisKKy8qIGhvdyBtYW55IGJ5dGVzIG9mIHJhbmRvbSBpbnB1dCB0byByZWFkIGZyb20gZmlsZXMgZm9yIFBSTkcgKi8KKy8qIE9wZW5TU0wgbGlrZXMgYXQgbGVhc3QgMTI4IGJpdHMsIHNvIDY0IGJ5dGVzIHNlZW1zIHBsZW50eS4gKi8KKyNkZWZpbmUgUkFORE9NX0JZVEVTIDY0CisKKy8qIGZvciBGb3JtYXRHdWFyZCAqLworLyogI2RlZmluZSBfX05PX0ZPUk1BVEdVQVJEXyAqLworCisvKiBhZGRpdGlvbmFsIGRpYWdub3N0aWMgbWVzc2FnZXMgKi8KKy8qICNkZWZpbmUgREVCVUdfRkRfQUxMT0MgKi8KKworI2lmZGVmIERFQlVHX0lORk8KKyNkZWZpbmUgTk9FWFBPUlQKKyNlbHNlCisjZGVmaW5lIE5PRVhQT1JUIHN0YXRpYworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHBsYXRmb3JtICovCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgVVNFX1dJTjMyCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgVVNFX1dJTjMyCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgc29ja2xlbl90OworI2VuZGlmCisKKyNpZmRlZiBVU0VfV0lOMzIKK3R5cGVkZWYgc2lnbmVkICAgY2hhciAgICAgICBpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCAgIHNob3J0ICAgICAgaW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkICAgaW50ICAgICAgICBpbnQzMl90OwordHlwZWRlZiBzaWduZWQgICBsb25nIGxvbmcgIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1aW50NjRfdDsKKyNpZm5kZWYgX19NSU5HVzMyX18KKyNpZmRlZiAgX1dJTjY0Cit0eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgc3NpemVfdDsKKyNlbHNlCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgc3NpemVfdDsKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIFVTRV9JUHY2CisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfTk9OX0NPTkZPUk1JTkdfU1dQUklOVEZTCisjZGVmaW5lIEhBVkVfT1NTTF9FTkdJTkVfSAorI2RlZmluZSBIQVZFX09TU0xfT0NTUF9ICisvKiBwcmV2ZW50IGluY2x1ZGluZyB3aW5jcnlwdC5oLCBhcyBpdCBkZWZpbmVzIGl0cyBvd24gT0NTUF9SRVNQT05TRSAqLworI2RlZmluZSBfX1dJTkNSWVBUX0hfXworI2RlZmluZSBTX0VBRERSSU5VU0UgIFdTQUVBRERSSU5VU0UKKy8qIHdpbnNvY2sgZG9lcyBub3QgZGVmaW5lIFdTQUVBR0FJTiAqLworLyogaW4gbW9zdCAoYnV0IG5vdCBhbGwhKSBCU0QgaW1wbGVtZW50YXRpb25zIEVBR0FJTj09RVdPVUxEQkxPQ0sgKi8KKyNkZWZpbmUgU19FQUdBSU4gICAgICAgIFdTQUVXT1VMREJMT0NLCisjZGVmaW5lIFNfRUNPTk5SRVNFVCAgICBXU0FFQ09OTlJFU0VUCisjZGVmaW5lIFNfRUlOUFJPR1JFU1MgICBXU0FFSU5QUk9HUkVTUworI2RlZmluZSBTX0VJTlRSICAgICAgICAgV1NBRUlOVFIKKyNkZWZpbmUgU19FSU5WQUwgICAgICAgIFdTQUVJTlZBTAorI2RlZmluZSBTX0VJU0NPTk4gICAgICAgV1NBRUlTQ09OTgorI2RlZmluZSBTX0VNRklMRSAgICAgICAgV1NBRU1GSUxFCisvKiB3aW5zb2NrIGRvZXMgbm90IGRlZmluZSBXU0FFTkZJTEUgKi8KKyNkZWZpbmUgU19FTk9CVUZTICAgICAgIFdTQUVOT0JVRlMKKy8qIHdpbnNvY2sgZG9lcyBub3QgZGVmaW5lIFdTQUVOT01FTSAqLworI2RlZmluZSBTX0VOT1BST1RPT1BUICAgV1NBRU5PUFJPVE9PUFQKKyNkZWZpbmUgU19FTk9UU09DSyAgICAgIFdTQUVOT1RTT0NLCisjZGVmaW5lIFNfRU9QTk9UU1VQUCAgICBXU0FFT1BOT1RTVVBQCisjZGVmaW5lIFNfRVdPVUxEQkxPQ0sgICBXU0FFV09VTERCTE9DSworI2RlZmluZSBTX0VDT05OQUJPUlRFRCAgV1NBRUNPTk5BQk9SVEVECisjZWxzZSAvKiBVU0VfV0lOMzIgKi8KKyNkZWZpbmUgU19FQUREUklOVVNFICAgIEVBRERSSU5VU0UKKyNkZWZpbmUgU19FQUdBSU4gICAgICAgIEVBR0FJTgorI2RlZmluZSBTX0VDT05OUkVTRVQgICAgRUNPTk5SRVNFVAorI2RlZmluZSBTX0VJTlBST0dSRVNTICAgRUlOUFJPR1JFU1MKKyNkZWZpbmUgU19FSU5UUiAgICAgICAgIEVJTlRSCisjZGVmaW5lIFNfRUlOVkFMICAgICAgICBFSU5WQUwKKyNkZWZpbmUgU19FSVNDT05OICAgICAgIEVJU0NPTk4KKyNkZWZpbmUgU19FTUZJTEUgICAgICAgIEVNRklMRQorI2lmZGVmIEVORklMRQorI2RlZmluZSBTX0VORklMRSAgICAgICAgRU5GSUxFCisjZW5kaWYKKyNpZmRlZiBFTk9CVUZTCisjZGVmaW5lIFNfRU5PQlVGUyAgICAgICBFTk9CVUZTCisjZW5kaWYKKyNpZmRlZiBFTk9NRU0KKyNkZWZpbmUgU19FTk9NRU0gICAgICAgIEVOT01FTQorI2VuZGlmCisjZGVmaW5lIFNfRU5PUFJPVE9PUFQgICBFTk9QUk9UT09QVAorI2RlZmluZSBTX0VOT1RTT0NLICAgICAgRU5PVFNPQ0sKKyNkZWZpbmUgU19FT1BOT1RTVVBQICAgIEVPUE5PVFNVUFAKKyNkZWZpbmUgU19FV09VTERCTE9DSyAgIEVXT1VMREJMT0NLCisjZGVmaW5lIFNfRUNPTk5BQk9SVEVEICBFQ09OTkFCT1JURUQKKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZ2VuZXJpYyBoZWFkZXJzICovCisKKyNpZmRlZiBfX3ZtcworI2luY2x1ZGUgPHN0YXJsZXQuaD4KKyNlbmRpZiAvKiBfX3ZtcyAqLworCisvKiBmb3IgbnNyLXRhbmRlbS1uc2sgYXJjaGl0ZWN0dXJlICovCisjaWZkZWYgX19UQU5ERU0KKyNpbmNsdWRlIDxmbG9zcy5oPgorI2VuZGlmCisKKy8qIHRocmVhZHMgbW9kZWwgKi8KKyNpZmRlZiBVU0VfVUNPTlRFWFQKKyNkZWZpbmUgX19NQUtFQ09OVEVYVF9WMl9TT1VSQ0UKKyNpbmNsdWRlIDx1Y29udGV4dC5oPgorI2VuZGlmCisKKyNpZmRlZiBVU0VfUFRIUkVBRAorI2lmbmRlZiBUSFJFQURTCisjZGVmaW5lIFRIUkVBRFMKKyNlbmRpZgorI2lmbmRlZiBfUkVFTlRSQU5UCisvKiBfUkVFTlRSQU5UIGlzIHJlcXVpcmVkIGZvciB0aHJlYWQtc2FmZSBlcnJubyBvbiBTb2xhcmlzICovCisjZGVmaW5lIF9SRUVOVFJBTlQKKyNlbmRpZgorI2lmbmRlZiBfVEhSRUFEX1NBRkUKKyNkZWZpbmUgX1RIUkVBRF9TQUZFCisjZW5kaWYKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworLyogc3lzdGVtZCAqLworI2lmZGVmIFVTRV9TWVNURU1ECisjaW5jbHVkZSA8c3lzdGVtZC9zZC1kYWVtb24uaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKy8qIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHN5cy9zdGF0LmggZm9yIFVsdHJpeCAqLworLyogbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgc3lzL3NvY2tldC5oIGZvciBPcGVuQlNEICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgLyogdV9zaG9ydCwgdV9sb25nICovCisvKiBnZW5lcmFsIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorLyogbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgc3lzL3N0YXQuaCBmb3IgVWx0cml4ICovCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgLyogdmFfICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4gICAgICAgLyogaXNhbG51bSAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPiAgICAvKiBzdGF0ICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogV0lOMzIgaGVhZGVycyAqLworCisjaWZkZWYgVVNFX1dJTjMyCisKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfQUREUklORk8KKyNkZWZpbmUgSEFWRV9TTlBSSU5URgorI2RlZmluZSBzbnByaW50ZiAgICAgICAgICAgICAgICAgICAgX3NucHJpbnRmCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGCisjZGVmaW5lIHZzbnByaW50ZiAgICAgICAgICAgICAgICAgICBfdnNucHJpbnRmCisjZGVmaW5lIHN0cmNhc2VjbXAgICAgICAgICAgICAgICAgICBfc3RyaWNtcAorI2RlZmluZSBzdHJuY2FzZWNtcCAgICAgICAgICAgICAgICAgX3N0cm5pY21wCisjZGVmaW5lIHNsZWVwKGMpICAgICAgICAgICAgICAgICAgICBTbGVlcCgxMDAwKihjKSkKKworI2RlZmluZSBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSAgICAgV1NBR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgc2V0X2xhc3Rfc29ja2V0X2Vycm9yKGUpICAgIFdTQVNldExhc3RFcnJvcihlKQorI2RlZmluZSBnZXRfbGFzdF9lcnJvcigpICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgc2V0X2xhc3RfZXJyb3IoZSkgICAgICAgICAgIFNldExhc3RFcnJvcihlKQorI2RlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICAgICAgcmVjdigocyksKGIpLChpbnQpKG4pLDApCisjZGVmaW5lIHdyaXRlc29ja2V0KHMsYixuKSAgICAgICAgICBzZW5kKChzKSwoYiksKGludCkobiksMCkKKworLyogI2RlZmluZSBXaW4zMl9XaW5zb2NrICovCisjZGVmaW5lIF9fVVNFX1czMl9TT0NLRVRTCisKKy8qIFdpbnNvY2syIGhlYWRlciBmb3IgSVB2NiBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPHByb2Nlc3MuaD4gICAgIC8qIF9iZWdpbnRocmVhZCAqLworI2luY2x1ZGUgPHNobG9iai5oPiAgICAgIC8qIFNIR2V0Rm9sZGVyUGF0aCAqLworI2luY2x1ZGUgPHRjaGFyLmg+CisKKyNpbmNsdWRlICJyZXNvdXJjZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbm9uLVdJTjMyIGhlYWRlcnMgKi8KKworI2Vsc2UgLyogVVNFX1dJTjMyICovCisKKyNpZmRlZiBfX0lOTk9URUtfTElCQ19fCisjZGVmaW5lIHNvY2tsZW5fdCAgICAgICAgICAgICAgICAgICBfX3NvY2tsZW5fdAorI2RlZmluZSBzdHJjYXNlY21wICAgICAgICAgICAgICAgICAgc3RyaWNtcAorI2RlZmluZSBzdHJuY2FzZWNtcCAgICAgICAgICAgICAgICAgc3RybmljbXAKKyNkZWZpbmUgTklfTlVNRVJJQ0hPU1QgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTklfTlVNRVJJQ1NFUlYgICAgICAgICAgICAgIDIKKyNkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgICAgIHNvY2tfZXJybm8oKQorI2RlZmluZSBzZXRfbGFzdF9zb2NrZXRfZXJyb3IoZSkgICAgKCkKKyNkZWZpbmUgZ2V0X2xhc3RfZXJyb3IoKSAgICAgICAgICAgIGVycm5vCisjZGVmaW5lIHNldF9sYXN0X2Vycm9yKGUpICAgICAgICAgICAoZXJybm89KGUpKQorI2RlZmluZSByZWFkc29ja2V0KHMsYixuKSAgICAgICAgICAgcmVjdigocyksKGIpLChuKSwwKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICAgICAgc2VuZCgocyksKGIpLChuKSwwKQorI2RlZmluZSBjbG9zZXNvY2tldChzKSAgICAgICAgICAgICAgY2xvc2UocykKKyNkZWZpbmUgaW9jdGxzb2NrZXQoYSxiLGMpICAgICAgICAgIHNvX2lvY3RsKChhKSwoYiksKGMpKQorI2Vsc2UKKyNkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgICAgIGVycm5vCisjZGVmaW5lIHNldF9sYXN0X3NvY2tldF9lcnJvcihlKSAgICAoZXJybm89KGUpKQorI2RlZmluZSBnZXRfbGFzdF9lcnJvcigpICAgICAgICAgICAgZXJybm8KKyNkZWZpbmUgc2V0X2xhc3RfZXJyb3IoZSkgICAgICAgICAgIChlcnJubz0oZSkpCisjZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgICAgICByZWFkKChzKSwoYiksKG4pKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICAgICAgd3JpdGUoKHMpLChiKSwobikpCisjZGVmaW5lIGNsb3Nlc29ja2V0KHMpICAgICAgICAgICAgICBjbG9zZShzKQorI2RlZmluZSBpb2N0bHNvY2tldChhLGIsYykgICAgICAgICAgaW9jdGwoKGEpLChiKSwoYykpCisjZW5kaWYKKwordHlwZWRlZiBpbnQgU09DS0VUOworI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAoLTEpCisKKyAgICAvKiBPcGVuVk1TIGNvbXBhdGliaWxpdHkgKi8KKyNpZmRlZiBfX3ZtcworI2RlZmluZSBMSUJESVIgIl9fTkFfXyIKKyNpZmRlZiBfX2FscGhhCisjZGVmaW5lIEhPU1QgImFscGhhLW9wZW52bXMiCisjZWxzZQorI2RlZmluZSBIT1NUICJ2YXgtb3BlbnZtcyIKKyNlbmRpZgorI2luY2x1ZGUgPGluZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbHNlICAgLyogX192bXMgKi8KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNlbmRpZiAgLyogX192bXMgKi8KKworICAgIC8qIFVuaXgtc3BlY2lmaWMgaGVhZGVycyAqLworI2luY2x1ZGUgPHNpZ25hbC5oPiAgICAgICAgIC8qIHNpZ25hbCAqLworI2luY2x1ZGUgPHN5cy93YWl0Lmg+ICAgICAgIC8qIHdhaXQgKi8KKyNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+ICAgLyogZ2V0cmxpbWl0ICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZ2V0cGlkLCBmb3JrLCBleGVjdnAsIGV4aXQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RST1BUU19ICisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9NQUxMT0NfSAorI2luY2x1ZGUgPG1hbGxvYy5oPiAgICAgICAgIC8qIG1hbGxvcHQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPiAgICAgLyogZm9yIGFpeCAqLworI2VuZGlmCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoQlJPS0VOX1BPTEwpCisjaWZkZWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZGVmaW5lIFVTRV9QT0xMCisjZWxzZSAvKiBIQVZFX1BPTExfSCAqLworI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZGVmaW5lIFVTRV9QT0xMCisjZW5kaWYgLyogSEFWRV9TWVNfUE9MTF9IICovCisjZW5kaWYgLyogSEFWRV9QT0xMX0ggKi8KKyNlbmRpZiAvKiBIQVZFX1BPTEwgJiYgIUJST0tFTl9QT0xMICovCisKKyNpZmRlZiBIQVZFX1NZU19GSUxJT19ICisjaW5jbHVkZSA8c3lzL2ZpbGlvLmg+ICAgLyogZm9yIEZJT05CSU8gKi8KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2lmZGVmIEhBVkVfR1JQX0gKKyNpbmNsdWRlIDxncnAuaD4KKyNlbmRpZgorI2lmZGVmIF9fQkVPU19fCisjaW5jbHVkZSA8cG9zaXgvZ3JwLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1VJT19ICisjaW5jbHVkZSA8c3lzL3Vpby5oPiAgICAvKiBzdHJ1Y3QgaW92ZWMgKi8KKyNlbmRpZiAvKiBIQVZFX1NZU19VSU9fSCAqLworCisvKiBCU0Qgc29ja2V0cyAqLworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gIC8qIHN0cnVjdCBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gIC8qIGdldHBlZXJuYW1lICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAgLyogaW5ldF9udG9hICovCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gICAgLyogc2VsZWN0ICovCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+ICAgLyogaW9jdGwgKi8KKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaWZuZGVmIElOQUREUl9BTlkKKyNkZWZpbmUgSU5BRERSX0FOWSAgICAgICAodTMyKTB4MDAwMDAwMDAKKyNlbmRpZgorI2lmbmRlZiBJTkFERFJfTE9PUEJBQ0sKKyNkZWZpbmUgSU5BRERSX0xPT1BCQUNLICAodTMyKTB4N0YwMDAwMDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1dBSVRQSUQpCisvKiBmb3IgU1lTViBzeXN0ZW1zICovCisjZGVmaW5lIHdhaXRfZm9yX3BpZChhLCBiLCBjKSB3YWl0cGlkKChhKSwgKGIpLCAoYykpCisjZGVmaW5lIEhBVkVfV0FJVF9GT1JfUElEIDEKKyNlbGlmIGRlZmluZWQoSEFWRV9XQUlUNCkKKy8qIGZvciBCU0Qgc3lzdGVtcyAqLworI2RlZmluZSB3YWl0X2Zvcl9waWQoYSwgYiwgYykgd2FpdDQoKGEpLCAoYiksIChjKSwgTlVMTCkKKyNkZWZpbmUgSEFWRV9XQUlUX0ZPUl9QSUQgMQorI2VuZGlmCisKKy8qIFN1bk9TIDQgKi8KKyNpZiBkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoX19zdnI0X18pICYmICFkZWZpbmVkKF9fU1ZSNCkKKyNkZWZpbmUgYXRleGl0KGEpIG9uX2V4aXQoKGEpLCBOVUxMKQorZXh0ZXJuIGludCBzeXNfbmVycjsKK2V4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOworI2RlZmluZSBzdHJlcnJvcihudW0pICgobnVtKT09MCA/ICJObyBlcnJvciIgOiBcCisgICAgKChudW0pPj1zeXNfbmVyciA/ICJVbmtub3duIGVycm9yIiA6IHN5c19lcnJsaXN0W251bV0pKQorI2VuZGlmIC8qIFN1bk9TIDQgKi8KKworLyogQUlYIGRvZXMgbm90IGhhdmUgU09MX1RDUCBkZWZpbmVkICovCisjaWZuZGVmIFNPTF9UQ1AKKyNkZWZpbmUgU09MX1RDUCBTT0xfU09DS0VUCisjZW5kaWYgLyogU09MX1RDUCAqLworCisvKiBMaW51eCAqLworI2lmZGVmIF9fbGludXhfXworI2lmbmRlZiBJUF9GUkVFQklORAorLyoga2VybmVsIGhlYWRlcnMgd2l0aG91dCBJUF9GUkVFQklORCBkZWZpbml0aW9uICovCisjZGVmaW5lIElQX0ZSRUVCSU5EIDE1CisjZW5kaWYgLyogSVBfRlJFRUJJTkQgKi8KKyNpZm5kZWYgSVBfVFJBTlNQQVJFTlQKKy8qIGtlcm5lbCBoZWFkZXJzIHdpdGhvdXQgSVBfVFJBTlNQQVJFTlQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBJUF9UUkFOU1BBUkVOVCAxOQorI2VuZGlmIC8qIElQX1RSQU5TUEFSRU5UICovCisjaWZkZWYgSEFWRV9MSU5VWF9ORVRGSUxURVJfSVBWNF9ICisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2VuZGlmIC8qIEhBVkVfTElOVVhfTkVURklMVEVSX0lQVjRfSCAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2lmZGVmIEhBVkVfU1lTX1NZU0NBTExfSAorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+IC8qIFNZU19nZXR0aWQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfTElOVVhfU0NIRURfSAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+IC8qIFNDSEVEX0JBVENIICovCisjZW5kaWYKKworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCisjaWZuZGVmIFNfSVNSRUcKKyNkZWZpbmUgU19JU1JFRyhtKSAoKChtKSZTX0lGTVQpPT1TX0lGUkVHKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE9wZW5TU0wgaGVhZGVycyAqLworCisjZGVmaW5lIE9QRU5TU0xfVEhSRUFEX0RFRklORVMKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisvKiBvcGVuc3Nsdi5oIHJlcXVpcmVzIHByaW9yIG9wZW5zc2xjb25mLmggdG8gaW5jbHVkZSAtZmlwcyBpbiB2ZXJzaW9uIHN0cmluZyAqLworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI8MHgwMDkwNzAwZkwKKyNlcnJvciBPcGVuU1NMIDAuOS43IG9yIGxhdGVyIGlzIHJlcXVpcmVkCisjZW5kaWYgLyogT3BlblNTTCBvbGRlciB0aGFuIDAuOS43ICovCisKKyNpZiBkZWZpbmVkKFVTRV9QVEhSRUFEKSAmJiAhZGVmaW5lZChPUEVOU1NMX1RIUkVBRFMpCisjZXJyb3IgT3BlblNTTCBsaWJyYXJ5IGNvbXBpbGVkIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQKKyNlbmRpZiAvKiAhT1BFTlNTTF9USFJFQURTICYmIFVTRV9QVEhSRUFEICovCisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPDB4MDA5MDgwMGZMCisjZGVmaW5lIE9QRU5TU0xfTk9fRUNESAorI2RlZmluZSBPUEVOU1NMX05PX0NPTVAKKyNlbmRpZiAvKiBPcGVuU1NMIG9sZGVyIHRoYW4gMC45LjggKi8KKworLyogbm9uLWJsb2NraW5nIE9DU1AgQVBJIGlzIG5vdCBhdmFpbGFibGUgYmVmb3JlIE9wZW5TU0wgMC45LjhoICovCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUjwweDAwOTA4MDgwTAorI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKyNkZWZpbmUgT1BFTlNTTF9OT19PQ1NQCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKSAqLworI2VuZGlmIC8qIE9wZW5TU0wgb2xkZXIgdGhhbiAwLjkuOGggKi8KKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI8MHgxMDAwMDAwMEwKKyNkZWZpbmUgT1BFTlNTTF9OT19UTFNFWFQKKyNkZWZpbmUgT1BFTlNTTF9OT19QU0sKKyNlbmRpZiAvKiBPcGVuU1NMIG9sZGVyIHRoYW4gMS4wLjAgKi8KKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI8MHgxMDAwMTAwMEwgfHwgZGVmaW5lZChPUEVOU1NMX05PX1RMUzEpCisjZGVmaW5lIE9QRU5TU0xfTk9fVExTMV8xCisjZGVmaW5lIE9QRU5TU0xfTk9fVExTMV8yCisjZW5kaWYgLyogT3BlblNTTCBvbGRlciB0aGFuIDEuMC4xIHx8IGRlZmluZWQoT1BFTlNTTF9OT19UTFMxKSAqLworCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgxMDEwMDAwMEwKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisjZGVmaW5lIE9QRU5TU0xfTk9fU1NMMgorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikgKi8KKyNlbmRpZiAvKiBPcGVuU1NMIDEuMS4wIG9yIG5ld2VyICovCisKKyNpZiAhZGVmaW5lZChIQVZFX09TU0xfRU5HSU5FX0gpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fRU5HSU5FKQorI2RlZmluZSBPUEVOU1NMX05PX0VOR0lORQorI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfT1NTTF9FTkdJTkVfSCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19FTkdJTkUpICovCisKKyNpZiAhZGVmaW5lZChIQVZFX09TU0xfT0NTUF9IKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApCisjZGVmaW5lIE9QRU5TU0xfTk9fT0NTUAorI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfT1NTTF9PQ1NQX0gpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fT0NTUCkgKi8KKworI2lmIGRlZmluZWQoVVNFX1dJTjMyKSAmJiBkZWZpbmVkKE9QRU5TU0xfRklQUykKKyNkZWZpbmUgVVNFX0ZJUFMKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wyMy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdWkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+IC8qIGZvciBDUllQVE9fKiBhbmQgU1NMZWF5X3ZlcnNpb24gKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ0CisjaW5jbHVkZSA8b3BlbnNzbC9tZDQuaD4KKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX01ENCkgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fREgpICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQCisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKy8qIG5vdCBkZWZpbmVkIGluIHB1YmxpYyBoZWFkZXJzIGJlZm9yZSBPcGVuU1NMIDAuOS44ICovCitTVEFDS19PRihTU0xfQ09NUCkgKlNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzKHZvaWQpOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fQ09NUCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogb3RoZXIgZGVmaW5lcyAqLworCisvKiBhbHdheXMgdXNlIElQdjQgZGVmYXVsdHMhICovCisjZGVmaW5lIERFRkFVTFRfTE9PUEJBQ0sgIjEyNy4wLjAuMSIKKyNkZWZpbmUgREVGQVVMVF9BTlkgIjAuMC4wLjAiCisjaWYgMAorI2RlZmluZSBERUZBVUxUX0xPT1BCQUNLICI6OjEiCisjZGVmaW5lIERFRkFVTFRfQU5ZICI6OiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoVVNFX1dJTjMyKSB8fCBkZWZpbmVkIChfX3ZtcykKKyNkZWZpbmUgTE9HX0VNRVJHICAgICAgIDAKKyNkZWZpbmUgTE9HX0FMRVJUICAgICAgIDEKKyNkZWZpbmUgTE9HX0NSSVQgICAgICAgIDIKKyNkZWZpbmUgTE9HX0VSUiAgICAgICAgIDMKKyNkZWZpbmUgTE9HX1dBUk5JTkcgICAgIDQKKyNkZWZpbmUgTE9HX05PVElDRSAgICAgIDUKKyNkZWZpbmUgTE9HX0lORk8gICAgICAgIDYKKyNkZWZpbmUgTE9HX0RFQlVHICAgICAgIDcKKyNlbmRpZiAvKiBkZWZpbmVkIChVU0VfV0lOMzIpIHx8IGRlZmluZWQgKF9fdm1zKSAqLworCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFQsIEYpICgodW5zaWduZWQpKChjaGFyICopJigoVCAqKTBMKS0+RiAtIChjaGFyICopMEwpKQorI2VuZGlmCisKKyNlbmRpZiAvKiBkZWZpbmVkIENPTU1PTl9IICovCisKKy8qIGVuZCBvZiBjb21tb24uaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvbmZpZy5oLmluIGIvc3JjL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29uZmlnLmguaW4KQEAgLTAsMCArMSwzMzUgQEAKKy8qIHNyYy9jb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSBicm9rZW4gJ3BvbGwnIGltcGxlbWVudGF0aW9uLiAqLworI3VuZGVmIEJST0tFTl9QT0xMCisKKy8qIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgcGF0aCAqLworI3VuZGVmIEVHRF9TT0NLRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY2NlcHQ0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FDQ0VQVDQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjaHJvb3QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ0hST09UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGFlbW9uJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0RBRU1PTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSAnL2Rldi9wdG14JyBkZXZpY2UuICovCisjdW5kZWYgSEFWRV9ERVZfUFRNWAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSAnL2Rldi9wdGMnIGRldmljZS4gKi8KKyN1bmRlZiBIQVZFX0RFVl9QVFNfQU5EX1BUQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGVuZGhvc3RlbnQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRU5ESE9TVEVOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYEZJUFNfbW9kZV9zZXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRklQU19NT0RFX1NFVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSAnZ2V0YWRkcmluZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQUREUklORk8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjb250ZXh0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVENPTlRFWFQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lMicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FMgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG5hbWVpbmZvJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVE5BTUVJTkZPCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFJMSU1JVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdycC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0dSUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGlidXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQlVUSUxfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfTkVURklMVEVSX0lQVjRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3NjaGVkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfU0NIRURfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvY2FsdGltZV9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0xPQ0FMVElNRV9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSAnbXNnaGRyLm1zZ19jb250cm9sJyBzdHJ1Y3R1cmUuICovCisjdW5kZWYgSEFWRV9NU0dIRFJfTVNHX0NPTlRST0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVucHR5JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX09QRU5QVFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPGVuZ2luZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX09TU0xfRU5HSU5FX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPG9jc3AuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9PU1NMX09DU1BfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBpcGUyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BJUEUyCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9sbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QT0xMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1BPTExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdGhyZWFkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUFRIUkVBRF9ICisKKy8qIEhhdmUgUFRIUkVBRF9QUklPX0lOSEVSSVQuICovCisjdW5kZWYgSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWRfc2lnbWFzaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QVEhSRUFEX1NJR01BU0sKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdHkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QVFlfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGdyb3VwcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRHUk9VUFMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRzaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUU0lECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU05QUklOVEYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUk9QVFNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IGFkZHJpbmZvJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9BRERSSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiBgbXNnX2NvbnRyb2wnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgbXNnaGRyJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9NU0dIRFJfTVNHX0NPTlRST0wKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBzb2NrYWRkcl91bicuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfVU4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjb25mJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NZU0NPTkYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXN0ZW1kL3NkLWRhZW1vbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU1RFTURfU0RfREFFTU9OX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsaW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfRklMSU9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19JT0NUTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUE9MTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNjYWxsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NZU0NBTExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19VSU9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19VTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGNwZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1RDUERfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVjb250ZXh0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVUNPTlRFWFRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VUSUxfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9WU05QUklOVEYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0NCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9XQUlUNAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXRwaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfV0FJVFBJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRwdHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfX0dFVFBUWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fbWFrZWNvbnRleHRfdjInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfX19NQUtFQ09OVEVYVF9WMgorCisvKiBIb3N0IGRlc2NyaXB0aW9uICovCisjdW5kZWYgSE9TVAorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgorICAgKi8KKyN1bmRlZiBMVF9PQkpESVIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9OQU1FCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1NUUklORworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9VUkwKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KKyAgIHlvdXIgc3lzdGVtLiAqLworI3VuZGVmIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFCisKKy8qIFJhbmRvbSBmaWxlIHBhdGggKi8KKyN1bmRlZiBSQU5ET01fRklMRQorCisvKiBTU0wgZGlyZWN0b3J5ICovCisjdW5kZWYgU1NMRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSB0byBlbmFibGUgT3BlblNTTCBGSVBTIHN1cHBvcnQgKi8KKyN1bmRlZiBVU0VfRklQUworCisvKiBEZWZpbmUgdG8gMSB0byBzZWxlY3QgRk9SSyBtb2RlICovCisjdW5kZWYgVVNFX0ZPUksKKworLyogRGVmaW5lIHRvIDEgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCAqLworI3VuZGVmIFVTRV9JUHY2CisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSBUQ1Agd3JhcHBlcnMgc3VwcG9ydCAqLworI3VuZGVmIFVTRV9MSUJXUkFQCisKKy8qIERlZmluZSB0byAxIHRvIHNlbGVjdCBQVEhSRUFEIG1vZGUgKi8KKyN1bmRlZiBVU0VfUFRIUkVBRAorCisvKiBEZWZpbmUgdG8gMSB0byBlbmFibGUgc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbiAqLworI3VuZGVmIFVTRV9TWVNURU1ECisKKy8qIERlZmluZSB0byAxIHRvIHNlbGVjdCBVQ09OVEVYVCBtb2RlICovCisjdW5kZWYgVVNFX1VDT05URVhUCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIFVzZSBHTlUgc291cmNlICovCisjdW5kZWYgX0dOVV9TT1VSQ0UKKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50MzJfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKyN1bmRlZiBfVUlOVDMyX1QKKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50NjRfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKyN1bmRlZiBfVUlOVDY0X1QKKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50OF90IHR5cGVkZWYgZnJvbSA8c3lzL3N5bmNoLmg+LAorICAgPHB0aHJlYWQuaD4sIG9yIDxzZW1hcGhvcmUuaD4gaXMgbm90IHVzZWQuIElmIHRoZSB0eXBlZGVmIHdlcmUgYWxsb3dlZCwgdGhlCisgICAjZGVmaW5lIGJlbG93IHdvdWxkIGNhdXNlIGEgc3ludGF4IGVycm9yLiAqLworI3VuZGVmIF9VSU5UOF9UCisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAqLworI3VuZGVmIGdpZF90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAxNiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI3VuZGVmIGludDE2X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGEgc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgaW50MzJfdAorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgNjQgYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKyN1bmRlZiBpbnQ2NF90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA4IGJpdHMgaWYgc3VjaAorICAgYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgaW50OF90CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworLyogVHlwZSBvZiBzb2NrbGVuX3QgKi8KKyN1bmRlZiBzb2NrbGVuX3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNzaXplX3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICovCisjdW5kZWYgdWlkX3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDE2IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDE2X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDMyX3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDY0IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDY0X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDggYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKyN1bmRlZiB1aW50OF90CmRpZmYgLS1naXQgYS9zcmMvY3Jvbi5jIGIvc3JjL2Nyb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE2NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Nyb24uYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqICAgc3R1bm5lbCAgICAgICBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICogICBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gc3R1bm5lbC4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisgKgorICogICBJbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXIgb2Ygc3R1bm5lbAorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yCisgKiAgIGxpYnJhcmllcyB0aGF0IGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIExHUEwgYW5kIHdpdGggY29kZSBpbmNsdWRlZAorICogICBpbiB0aGUgc3RhbmRhcmQgcmVsZWFzZSBvZiBPcGVuU1NMIHVuZGVyIHRoZSBPcGVuU1NMIExpY2Vuc2UgKG9yCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQorICogICBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgZm9yCisgKiAgIHN0dW5uZWwgYW5kIHRoZSBsaWNlbnNlcyBvZiB0aGUgb3RoZXIgY29kZSBjb25jZXJuZWQuCisgKgorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgorCisjaWZkZWYgVVNFX1BUSFJFQUQKK05PRVhQT1JUIHZvaWQgKmNyb25fdGhyZWFkKHZvaWQgKmFyZyk7CisjZW5kaWYKKyNpZmRlZiBVU0VfV0lOMzIKK05PRVhQT1JUIHZvaWQgY3Jvbl90aHJlYWQodm9pZCAqYXJnKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BUSFJFQUQpIHx8IGRlZmluZWQoVVNFX1dJTjMyKQorTk9FWFBPUlQgdm9pZCBjcm9uX3dvcmtlcih2b2lkKTsKK05PRVhQT1JUIHZvaWQgY3Jvbl9kaF9wYXJhbSh2b2lkKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfUFRIUkVBRCkKKworaW50IGNyb25faW5pdCgpIHsKKyAgICBwdGhyZWFkX3QgdGhyZWFkOworICAgIHB0aHJlYWRfYXR0cl90IHB0aF9hdHRyOworI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX1NJR01BU0spICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKyAgICBzaWdzZXRfdCBuZXdfc2V0LCBvbGRfc2V0OworI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9TSUdNQVNLICYmICFfX0FQUExFX18qLworCisjaWYgZGVmaW5lZChIQVZFX1BUSFJFQURfU0lHTUFTSykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorICAgIHNpZ2ZpbGxzZXQoJm5ld19zZXQpOworICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm5ld19zZXQsICZvbGRfc2V0KTsgLyogYmxvY2sgc2lnbmFscyAqLworI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9TSUdNQVNLICYmICFfX0FQUExFX18qLworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZwdGhfYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZwdGhfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworICAgIGlmKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZwdGhfYXR0ciwgY3Jvbl90aHJlYWQsIE5VTEwpKQorICAgICAgICBpb2Vycm9yKCJwdGhyZWFkX2NyZWF0ZSIpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZwdGhfYXR0cik7CisjaWYgZGVmaW5lZChIQVZFX1BUSFJFQURfU0lHTUFTSykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm9sZF9zZXQsIE5VTEwpOyAvKiB1bmJsb2NrIHNpZ25hbHMgKi8KKyNlbmRpZiAvKiBIQVZFX1BUSFJFQURfU0lHTUFTSyAmJiAhX19BUFBMRV9fKi8KKyAgICByZXR1cm4gMDsKK30KKworTk9FWFBPUlQgdm9pZCAqY3Jvbl90aHJlYWQodm9pZCAqYXJnKSB7CisjaWZkZWYgU0NIRURfQkFUQ0gKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisjZW5kaWYKKworICAgICh2b2lkKWFyZzsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICB0bHNfYWxsb2MoTlVMTCwgTlVMTCwgImNyb24iKTsKKyNpZmRlZiBTQ0hFRF9CQVRDSAorICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5PTA7CisgICAgaWYocHRocmVhZF9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigpLCBTQ0hFRF9CQVRDSCwgJnBhcmFtKSkKKyAgICAgICAgaW9lcnJvcigicHRocmVhZF9nZXRzY2hlZHBhcmFtIik7CisjZW5kaWYKKyAgICBjcm9uX3dvcmtlcigpOworICAgIHJldHVybiBOVUxMOyAvKiBpdCBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQgKi8KK30KKworI2VsaWYgZGVmaW5lZChVU0VfV0lOMzIpCisKK2ludCBjcm9uX2luaXQoKSB7CisgICAgaWYoKGxvbmcpX2JlZ2ludGhyZWFkKGNyb25fdGhyZWFkLCAwLCBOVUxMKT09LTEpCisgICAgICAgIGlvZXJyb3IoIl9iZWdpbnRocmVhZCIpOworICAgIHJldHVybiAwOworfQorCitOT0VYUE9SVCB2b2lkIGNyb25fdGhyZWFkKHZvaWQgKmFyZykgeworICAgICh2b2lkKWFyZzsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICB0bHNfYWxsb2MoTlVMTCwgTlVMTCwgImNyb24iKTsKKyAgICBpZighU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfTE9XRVNUKSkKKyAgICAgICAgaW9lcnJvcigiU2V0VGhyZWFkUHJpb3JpdHkiKTsKKyAgICBjcm9uX3dvcmtlcigpOworICAgIF9lbmR0aHJlYWQoKTsgLyogaXQgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkICovCit9CisKKyNlbHNlIC8qICFkZWZpbmVkKFVTRV9QVEhSRUFEKSAmJiAhZGVmaW5lZChVU0VfV0lOMzIpICovCisKK2ludCBjcm9uX2luaXQoKSB7CisgICAgLyogbm90IGltcGxlbWVudGVkIGZvciBub3cgKi8KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIHJ1biB0aGUgY3JvbiBqb2IgZXZlcnkgMjQgaG91cnMgKi8KKyNkZWZpbmUgQ1JPTl9QRVJJT0QgKDI0KjYwKjYwKQorCisjaWYgZGVmaW5lZChVU0VfUFRIUkVBRCkgfHwgZGVmaW5lZChVU0VfV0lOMzIpCisKK05PRVhQT1JUIHZvaWQgY3Jvbl93b3JrZXIodm9pZCkgeworICAgIHRpbWVfdCBub3csIHRoZW47CisgICAgaW50IGRlbGF5OworCisgICAgc19sb2coTE9HX0RFQlVHLCAiQ3JvbiBzdGFydGVkIik7CisgICAgc2xlZXAoNjApOyAvKiBhbGxvdyB0aGUgb3RoZXIgc2VydmljZXMgdG8gc3RhcnQgd2l0aCBpZGxlIENQVSAqLworICAgIHRpbWUoJnRoZW4pOworICAgIGZvcig7OykgeworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkV4ZWN1dGluZyBjcm9uIGpvYnMiKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorICAgICAgICBjcm9uX2RoX3BhcmFtKCk7CisjZW5kaWYgLyogT1BFTlNTTF9OT19ESCAqLworICAgICAgICB0aW1lKCZub3cpOworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkNyb24gam9icyBjb21wbGV0ZWQgaW4gJWQgc2Vjb25kcyIsIChpbnQpKG5vdy10aGVuKSk7CisgICAgICAgIHRoZW4rPUNST05fUEVSSU9EOworICAgICAgICBpZih0aGVuPm5vdykgeworICAgICAgICAgICAgZGVsYXk9KGludCkodGhlbi1ub3cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX05PVElDRSwgIkNyb24gYmFja2xvZyBjbGVhcmVkIChwb3NzaWJsZSBoaWJlcm5hdGlvbikiKTsKKyAgICAgICAgICAgIGRlbGF5PUNST05fUEVSSU9ELShpbnQpKG5vdy10aGVuKSVDUk9OX1BFUklPRDsKKyAgICAgICAgICAgIHRoZW49bm93K2RlbGF5OworICAgICAgICB9CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIldhaXRpbmcgJWQgc2Vjb25kcyIsIGRlbGF5KTsKKyAgICAgICAgZG8geyAvKiByZXRyeSBzbGVlcCgpIGlmIGl0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAqLworICAgICAgICAgICAgc2xlZXAoKHVuc2lnbmVkKWRlbGF5KTsKKyAgICAgICAgICAgIHRpbWUoJm5vdyk7CisgICAgICAgICAgICBkZWxheT0oaW50KSh0aGVuLW5vdyk7CisgICAgICAgIH0gd2hpbGUoZGVsYXk+MCk7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiUmVvcGVuaW5nIGxvZyBmaWxlIik7CisgICAgICAgIHNpZ25hbF9wb3N0KFNJR05BTF9SRU9QRU5fTE9HKTsKKyAgICB9Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorTk9FWFBPUlQgdm9pZCBjcm9uX2RoX3BhcmFtKHZvaWQpIHsKKyAgICBTRVJWSUNFX09QVElPTlMgKm9wdDsKKyAgICBESCAqZGg7CisKKyAgICBpZighZGhfbmVlZGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiVXBkYXRpbmcgREggcGFyYW1ldGVycyIpOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MDA5MDgwMGZMCisgICAgLyogZ2VuZXJhdGUgMjA0OC1iaXQgREggcGFyYW1ldGVycyAqLworICAgIGRoPURIX25ldygpOworICAgIGlmKCFkaCkgeworICAgICAgICBzc2xlcnJvcigiREhfbmV3Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIURIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoZGgsIDIwNDgsIDIsIE5VTEwpKSB7CisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgICBzc2xlcnJvcigiREhfZ2VuZXJhdGVfcGFyYW1ldGVyc19leCIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2Vsc2UgLyogT3BlblNTTCBvbGRlciB0aGFuIDAuOS44ICovCisgICAgZGg9REhfZ2VuZXJhdGVfcGFyYW1ldGVycygyMDQ4LCAyLCBOVUxMLCBOVUxMKTsKKyAgICBpZighZGgpIHsKKyAgICAgICAgc3NsZXJyb3IoIkRIX2dlbmVyYXRlX3BhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLyogdXBkYXRlIGdsb2JhbCBkaF9wYXJhbXMgZm9yIGZ1dHVyZSBjb25maWd1cmF0aW9uIHJlbG9hZHMgKi8KKyAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfREgpOyAvKiBpdCBvbmx5IG5lZWRzIGFuIHJ3bG9jayBoZXJlICovCisgICAgREhfZnJlZShkaF9wYXJhbXMpOworICAgIGRoX3BhcmFtcz1kaDsKKyAgICBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKENSSVRfREgpOworCisgICAgLyogc2V0IGZvciBhbGwgc2VjdGlvbnMgdGhhdCByZXF1aXJlIGl0ICovCisgICAgZm9yKG9wdD1zZXJ2aWNlX29wdGlvbnMubmV4dDsgb3B0OyBvcHQ9b3B0LT5uZXh0KQorICAgICAgICBpZihvcHQtPm9wdGlvbi5kaF9uZWVkZWQpCisgICAgICAgICAgICBTU0xfQ1RYX3NldF90bXBfZGgob3B0LT5jdHgsIGRoKTsKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiREggcGFyYW1ldGVycyB1cGRhdGVkIik7Cit9CisjZW5kaWYgLyogT1BFTlNTTF9OT19ESCAqLworCisjZW5kaWYgLyogVVNFX1BUSFJFQUQgfHwgVVNFX1dJTjMyICovCisKKy8qIGVuZCBvZiBjcm9uLmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9jdHguYyBiL3NyYy9jdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY1M2JjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2N0eC5jCkBAIC0wLDAgKzEsOTAwIEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorREggKmRoX3BhcmFtcz1OVUxMOworaW50IGRoX25lZWRlZD0wOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyAqLworCisvKiBTTkkgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK05PRVhQT1JUIGludCBzZXJ2ZXJuYW1lX2NiKFNTTCAqLCBpbnQgKiwgdm9pZCAqKTsKK05PRVhQT1JUIGludCBtYXRjaGVzX3dpbGRjYXJkKGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgorCisvKiBESC9FQ0RIIGluaXRpYWxpemF0aW9uICovCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKK05PRVhQT1JUIGludCBkaF9pbml0KFNFUlZJQ0VfT1BUSU9OUyAqKTsKK05PRVhQT1JUIERIICpkaF9yZWFkKGNoYXIgKik7CisjZW5kaWYgLyogT1BFTlNTTF9OT19ESCAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKK05PRVhQT1JUIGludCBlY2RoX2luaXQoU0VSVklDRV9PUFRJT05TICopOworI2VuZGlmIC8qIFVTRV9FQ0RIICovCisKKy8qIGluaXRpYWxpemUgYXV0aGVudGljYXRpb24gKi8KK05PRVhQT1JUIGludCBhdXRoX2luaXQoU0VSVklDRV9PUFRJT05TICopOworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworTk9FWFBPUlQgdW5zaWduZWQgcHNrX2NsaWVudF9jYWxsYmFjayhTU0wgKiwgY29uc3QgY2hhciAqLAorICAgIGNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQpOworTk9FWFBPUlQgdW5zaWduZWQgcHNrX3NlcnZlcl9jYWxsYmFjayhTU0wgKiwgY29uc3QgY2hhciAqLAorICAgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQpOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fUFNLKSAqLworTk9FWFBPUlQgaW50IGxvYWRfY2VydChTRVJWSUNFX09QVElPTlMgKik7CitOT0VYUE9SVCBpbnQgbG9hZF9rZXlfZmlsZShTRVJWSUNFX09QVElPTlMgKik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitOT0VYUE9SVCBpbnQgbG9hZF9rZXlfZW5naW5lKFNFUlZJQ0VfT1BUSU9OUyAqKTsKKyNlbmRpZgorTk9FWFBPUlQgaW50IHBhc3N3b3JkX2NiKGNoYXIgKiwgaW50LCBpbnQsIHZvaWQgKik7CisKKy8qIHNlc3Npb24gY2FjaGUgY2FsbGJhY2tzICovCitOT0VYUE9SVCBpbnQgc2Vzc19uZXdfY2IoU1NMICosIFNTTF9TRVNTSU9OICopOworTk9FWFBPUlQgU1NMX1NFU1NJT04gKnNlc3NfZ2V0X2NiKFNTTCAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgaW50ICopOworTk9FWFBPUlQgdm9pZCBzZXNzX3JlbW92ZV9jYihTU0xfQ1RYICosIFNTTF9TRVNTSU9OICopOworCisvKiBzZXNzaW9uZCBpbnRlcmZhY2UgKi8KK05PRVhQT1JUIHZvaWQgY2FjaGVfdHJhbnNmZXIoU1NMX0NUWCAqLCBjb25zdCB1X2NoYXIsIGNvbnN0IGxvbmcsCisgICAgY29uc3QgdV9jaGFyICosIGNvbnN0IHNpemVfdCwKKyAgICBjb25zdCB1X2NoYXIgKiwgY29uc3Qgc2l6ZV90LAorICAgIHVuc2lnbmVkIGNoYXIgKiosIHNpemVfdCAqKTsKKworLyogaW5mbyBjYWxsYmFja3MgKi8KK05PRVhQT1JUIHZvaWQgaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKiwgaW50LCBpbnQpOworCitOT0VYUE9SVCB2b2lkIHNzbGVycm9yX3F1ZXVlKHZvaWQpOworTk9FWFBPUlQgdm9pZCBzc2xlcnJvcl9sb2codW5zaWduZWQgbG9uZywgY2hhciAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZSBzZWN0aW9uLT5jdHggKi8KKworaW50IGNvbnRleHRfaW5pdChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsgLyogaW5pdCBTU0wgY29udGV4dCAqLworICAgIC8qIGNyZWF0ZSBTU0wgY29udGV4dCAqLworICAgIGlmKHNlY3Rpb24tPm9wdGlvbi5jbGllbnQpCisgICAgICAgIHNlY3Rpb24tPmN0eD1TU0xfQ1RYX25ldyhzZWN0aW9uLT5jbGllbnRfbWV0aG9kKTsKKyAgICBlbHNlIC8qIHNlcnZlciBtb2RlICovCisgICAgICAgIHNlY3Rpb24tPmN0eD1TU0xfQ1RYX25ldyhzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kKTsKKyAgICBpZighc2VjdGlvbi0+Y3R4KSB7CisgICAgICAgIHNzbGVycm9yKCJTU0xfQ1RYX25ldyIpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIFNTTF9DVFhfc2V0X2V4X2RhdGEoc2VjdGlvbi0+Y3R4LCBpbmRleF9vcHQsIHNlY3Rpb24pOyAvKiBmb3IgY2FsbGJhY2tzICovCisKKyAgICAvKiBsb2FkIGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleSB0byBiZSB2ZXJpZmllZCBieSB0aGUgcGVlciBzZXJ2ZXIgKi8KKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgJiYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgwMDkwODA5ZkwKKyAgICAvKiBTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9lbmdpbmUoKSB3YXMgaW50cm9kdWNlZCBpbiBPcGVuU1NMIDAuOS44aSAqLworICAgIGlmKHNlY3Rpb24tPm9wdGlvbi5jbGllbnQgJiYgc2VjdGlvbi0+ZW5naW5lKSB7CisgICAgICAgIGlmKFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2VuZ2luZShzZWN0aW9uLT5jdHgsIHNlY3Rpb24tPmVuZ2luZSkpCisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkNsaWVudCBjZXJ0aWZpY2F0ZSBlbmdpbmUgKCVzKSBlbmFibGVkIiwKKyAgICAgICAgICAgICAgICBFTkdJTkVfZ2V0X2lkKHNlY3Rpb24tPmVuZ2luZSkpOworICAgICAgICBlbHNlIC8qIG5vIGNsaWVudCBjZXJ0aWZpY2F0ZSBmdW5jdGlvbmFsaXR5IGluIHRoaXMgZW5naW5lICovCisgICAgICAgICAgICBzc2xlcnJvcigiU1NMX0NUWF9zZXRfY2xpZW50X2NlcnRfZW5naW5lIik7IC8qIGlnbm9yZSBlcnJvciAqLworICAgIH0KKyNlbmRpZgorICAgIGlmKGF1dGhfaW5pdChzZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworCisgICAgLyogaW5pdGlhbGl6ZSB2ZXJpZmljYXRpb24gb2YgdGhlIHBlZXIgc2VydmVyIGNlcnRpZmljYXRlICovCisgICAgaWYodmVyaWZ5X2luaXQoc2VjdGlvbikpCisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKworICAgIC8qIGluaXRpYWxpemUgREgvRUNESCBzZXJ2ZXIgbW9kZSAqLworICAgIGlmKCFzZWN0aW9uLT5vcHRpb24uY2xpZW50KSB7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisgICAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZyhzZWN0aW9uLT5jdHgsIHNlY3Rpb24pOworICAgICAgICBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayhzZWN0aW9uLT5jdHgsIHNlcnZlcm5hbWVfY2IpOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyAgICAgICAgZGhfaW5pdChzZWN0aW9uKTsgLyogaWdub3JlIHRoZSByZXN1bHQgKGVycm9ycyBhcmUgbm90IGNyaXRpY2FsKSAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisgICAgICAgIGVjZGhfaW5pdChzZWN0aW9uKTsgLyogaWdub3JlIHRoZSByZXN1bHQgKGVycm9ycyBhcmUgbm90IGNyaXRpY2FsKSAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUNESCAqLworICAgIH0KKworICAgIC8qIHNldHVwIHNlc3Npb24gY2FjaGUgKi8KKyAgICBpZighc2VjdGlvbi0+b3B0aW9uLmNsaWVudCkgeworICAgICAgICB1bnNpZ25lZCBzZXJ2bmFtZV9sZW49KHVuc2lnbmVkKXN0cmxlbihzZWN0aW9uLT5zZXJ2bmFtZSk7CisgICAgICAgIGlmKHNlcnZuYW1lX2xlbj5TU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCkKKyAgICAgICAgICAgIHNlcnZuYW1lX2xlbj1TU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsKKyAgICAgICAgaWYoIVNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzZWN0aW9uLT5jdHgsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilzZWN0aW9uLT5zZXJ2bmFtZSwgc2Vydm5hbWVfbGVuKSkgeworICAgICAgICAgICAgc3NsZXJyb3IoIlNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCIpOworICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgICAgICB9CisgICAgfQorI2lmZGVmIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFCisgICAgLyogdGhlIGRlZmF1bHQgY2FjaGUgbW9kZSBpcyBqdXN0IFNTTF9TRVNTX0NBQ0hFX1NFUlZFUiAqLworICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShzZWN0aW9uLT5jdHgsCisgICAgICAgIFNTTF9TRVNTX0NBQ0hFX1NFUlZFUnxTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSk7CisjZW5kaWYKKyAgICBTU0xfQ1RYX3Nlc3Nfc2V0X2NhY2hlX3NpemUoc2VjdGlvbi0+Y3R4LCBzZWN0aW9uLT5zZXNzaW9uX3NpemUpOworICAgIFNTTF9DVFhfc2V0X3RpbWVvdXQoc2VjdGlvbi0+Y3R4LCBzZWN0aW9uLT5zZXNzaW9uX3RpbWVvdXQpOworICAgIGlmKHNlY3Rpb24tPm9wdGlvbi5zZXNzaW9uZCkgeworICAgICAgICBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihzZWN0aW9uLT5jdHgsIHNlc3NfbmV3X2NiKTsKKyAgICAgICAgU1NMX0NUWF9zZXNzX3NldF9nZXRfY2Ioc2VjdGlvbi0+Y3R4LCBzZXNzX2dldF9jYik7CisgICAgICAgIFNTTF9DVFhfc2Vzc19zZXRfcmVtb3ZlX2NiKHNlY3Rpb24tPmN0eCwgc2Vzc19yZW1vdmVfY2IpOworICAgIH0KKworICAgIC8qIHNldCBpbmZvIGNhbGxiYWNrICovCisgICAgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhzZWN0aW9uLT5jdHgsIGluZm9fY2FsbGJhY2spOworCisgICAgLyogY2lwaGVycywgb3B0aW9ucywgbW9kZSAqLworICAgIGlmKHNlY3Rpb24tPmNpcGhlcl9saXN0KQorICAgICAgICBpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3Qoc2VjdGlvbi0+Y3R4LCBzZWN0aW9uLT5jaXBoZXJfbGlzdCkpIHsKKyAgICAgICAgICAgIHNzbGVycm9yKCJTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdCIpOworICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgICAgICB9CisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzZWN0aW9uLT5jdHgsIHNlY3Rpb24tPnNzbF9vcHRpb25zX3NldCk7CisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgwMDkwODBkZkwKKyAgICBTU0xfQ1RYX2NsZWFyX29wdGlvbnMoc2VjdGlvbi0+Y3R4LCBzZWN0aW9uLT5zc2xfb3B0aW9uc19jbGVhcik7CisgICAgc19sb2coTE9HX0RFQlVHLCAiU1NMIG9wdGlvbnM6IDB4JTA4bFggKCsweCUwOGxYLCAtMHglMDhsWCkiLAorICAgICAgICBTU0xfQ1RYX2dldF9vcHRpb25zKHNlY3Rpb24tPmN0eCksCisgICAgICAgIHNlY3Rpb24tPnNzbF9vcHRpb25zX3NldCwgc2VjdGlvbi0+c3NsX29wdGlvbnNfY2xlYXIpOworI2Vsc2UgLyogT3BlblNTTCBvbGRlciB0aGFuIDAuOS44bSAqLworICAgIHNfbG9nKExPR19ERUJVRywgIlNTTCBvcHRpb25zOiAweCUwOGxYICgrMHglMDhsWCkiLAorICAgICAgICBTU0xfQ1RYX2dldF9vcHRpb25zKHNlY3Rpb24tPmN0eCksCisgICAgICAgIHNlY3Rpb24tPnNzbF9vcHRpb25zX3NldCk7CisjZW5kaWYgLyogT3BlblNTTCAwLjkuOG0gb3IgbGF0ZXIgKi8KKyNpZmRlZiBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMKKyAgICBTU0xfQ1RYX3NldF9tb2RlKHNlY3Rpb24tPmN0eCwKKyAgICAgICAgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgfAorICAgICAgICBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUiB8CisgICAgICAgIFNTTF9NT0RFX1JFTEVBU0VfQlVGRkVSUyk7CisjZWxzZQorICAgIFNTTF9DVFhfc2V0X21vZGUoc2VjdGlvbi0+Y3R4LAorICAgICAgICBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSB8CisgICAgICAgIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSKTsKKyNlbmRpZgorICAgIHJldHVybiAwOyAvKiBPSyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTkkgY2FsbGJhY2sgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCitOT0VYUE9SVCBpbnQgc2VydmVybmFtZV9jYihTU0wgKnNzbCwgaW50ICphZCwgdm9pZCAqYXJnKSB7CisgICAgU0VSVklDRV9PUFRJT05TICpzZWN0aW9uPShTRVJWSUNFX09QVElPTlMgKilhcmc7CisgICAgY29uc3QgY2hhciAqc2VydmVybmFtZT1TU0xfZ2V0X3NlcnZlcm5hbWUoc3NsLCBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKTsKKyAgICBTRVJWRVJOQU1FX0xJU1QgKmxpc3Q7CisgICAgQ0xJICpjOworI2lmZGVmIFVTRV9MSUJXUkFQCisgICAgY2hhciAqYWNjZXB0ZWRfYWRkcmVzczsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUCAqLworCisgICAgLyogbGVhdmUgdGhlIGFsZXJ0IHR5cGUgYXQgU1NMX0FEX1VOUkVDT0dOSVpFRF9OQU1FICovCisgICAgKHZvaWQpYWQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgaWYoIXNlY3Rpb24tPnNlcnZlcm5hbWVfbGlzdF9oZWFkKSB7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNOSTogbm8gdmlydHVhbCBzZXJ2aWNlcyBkZWZpbmVkIik7CisgICAgICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKKyAgICB9CisgICAgaWYoIXNlcnZlcm5hbWUpIHsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIlNOSTogbm8gc2VydmVybmFtZSByZWNlaXZlZCIpOworICAgICAgICByZXR1cm4gU1NMX1RMU0VYVF9FUlJfTk9BQ0s7CisgICAgfQorICAgIHNfbG9nKExPR19JTkZPLCAiU05JOiByZXF1ZXN0ZWQgc2VydmVybmFtZTogJXMiLCBzZXJ2ZXJuYW1lKTsKKworICAgIGZvcihsaXN0PXNlY3Rpb24tPnNlcnZlcm5hbWVfbGlzdF9oZWFkOyBsaXN0OyBsaXN0PWxpc3QtPm5leHQpCisgICAgICAgIGlmKG1hdGNoZXNfd2lsZGNhcmQoKGNoYXIgKilzZXJ2ZXJuYW1lLCBsaXN0LT5zZXJ2ZXJuYW1lKSkgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU05JOiBtYXRjaGVkIHBhdHRlcm46ICVzIiwgbGlzdC0+c2VydmVybmFtZSk7CisgICAgICAgICAgICBjPVNTTF9nZXRfZXhfZGF0YShzc2wsIGluZGV4X2NsaSk7CisgICAgICAgICAgICBjLT5vcHQ9bGlzdC0+b3B0OworICAgICAgICAgICAgU1NMX3NldF9TU0xfQ1RYKHNzbCwgYy0+b3B0LT5jdHgpOworICAgICAgICAgICAgU1NMX3NldF92ZXJpZnkoc3NsLCBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShjLT5vcHQtPmN0eCksCisgICAgICAgICAgICAgICAgU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGMtPm9wdC0+Y3R4KSk7CisgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiU05JOiBzd2l0Y2hlZCB0byBzZXJ2aWNlIFslc10iLAorICAgICAgICAgICAgICAgIGMtPm9wdC0+c2Vydm5hbWUpOworI2lmZGVmIFVTRV9MSUJXUkFQCisgICAgICAgICAgICBhY2NlcHRlZF9hZGRyZXNzPXNfbnRvcCgmYy0+cGVlcl9hZGRyLCBjLT5wZWVyX2FkZHJfbGVuKTsKKyAgICAgICAgICAgIGxpYndyYXBfYXV0aChjLCBhY2NlcHRlZF9hZGRyZXNzKTsgLyogcmV0cnkgb24gYSBzZXJ2aWNlIHN3aXRjaCAqLworICAgICAgICAgICAgc3RyX2ZyZWUoYWNjZXB0ZWRfYWRkcmVzcyk7CisjZW5kaWYgLyogVVNFX0xJQldSQVAgKi8KKyAgICAgICAgICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKKyAgICAgICAgfQorICAgIHNfbG9nKExPR19FUlIsICJTTkk6IG5vIHBhdHRlcm4gbWF0Y2hlZCBzZXJ2ZXJuYW1lOiAlcyIsIHNlcnZlcm5hbWUpOworICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDsKK30KKy8qIFRMU0VYVCBjYWxsYmFjayByZXR1cm4gY29kZXM6CisgKiAgLSBTU0xfVExTRVhUX0VSUl9PSworICogIC0gU1NMX1RMU0VYVF9FUlJfQUxFUlRfV0FSTklORworICogIC0gU1NMX1RMU0VYVF9FUlJfQUxFUlRfRkFUQUwKKyAqICAtIFNTTF9UTFNFWFRfRVJSX05PQUNLICovCisKK05PRVhQT1JUIGludCBtYXRjaGVzX3dpbGRjYXJkKGNoYXIgKnNlcnZlcm5hbWUsIGNoYXIgKnBhdHRlcm4pIHsKKyAgICBzc2l6ZV90IGRpZmY7CisKKyAgICBpZighc2VydmVybmFtZSB8fCAhcGF0dGVybikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoKnBhdHRlcm49PScqJykgeyAvKiB3aWxkY2FyZCBjb21wYXJpc29uICovCisgICAgICAgIGRpZmY9KHNzaXplX3Qpc3RybGVuKHNlcnZlcm5hbWUpLShzc2l6ZV90KXN0cmxlbigrK3BhdHRlcm4pOworICAgICAgICBpZihkaWZmPDApIC8qIHBhdHRlcm4gbG9uZ2VyIHRoYW4gc2VydmVybmFtZSAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHNlcnZlcm5hbWUrPWRpZmY7CisgICAgfQorICAgIHJldHVybiAhc3RyY2FzZWNtcChzZXJ2ZXJuYW1lLCBwYXR0ZXJuKTsKK30KKworI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERIIGluaXRpYWxpemF0aW9uICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCitOT0VYUE9SVCBpbnQgZGhfaW5pdChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsKKyAgICBESCAqZGg9TlVMTDsKKworICAgIHNfbG9nKExPR19ERUJVRywgIkRIIGluaXRpYWxpemF0aW9uIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgaWYoIXNlY3Rpb24tPmVuZ2luZSkgLyogY2VydCBpcyBhIGZpbGUgYW5kIG5vdCBhbiBpZGVudGlmaWVyICovCisjZW5kaWYKKyAgICAgICAgZGg9ZGhfcmVhZChzZWN0aW9uLT5jZXJ0KTsKKyAgICBpZihkaCkgeworICAgICAgICBTU0xfQ1RYX3NldF90bXBfZGgoc2VjdGlvbi0+Y3R4LCBkaCk7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiJWQtYml0IERIIHBhcmFtZXRlcnMgbG9hZGVkIiwgOCpESF9zaXplKGRoKSk7CisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgICByZXR1cm4gMDsgLyogT0sgKi8KKyAgICB9CisgICAgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihDUklUX0RIKTsgLyogaXQgb25seSBuZWVkcyBhbiByd2xvY2sgaGVyZSAqLworICAgIFNTTF9DVFhfc2V0X3RtcF9kaChzZWN0aW9uLT5jdHgsIGRoX3BhcmFtcyk7CisgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0RIKTsKKyAgICBkaF9uZWVkZWQ9MTsgLyogZ2VuZXJhdGUgdGVtcG9yYXJ5IERIIHBhcmFtZXRlcnMgaW4gY3JvbiAqLworICAgIHNlY3Rpb24tPm9wdGlvbi5kaF9uZWVkZWQ9MTsgLyogdXBkYXRlIHRoaXMgY29udGV4dCAqLworICAgIHNfbG9nKExPR19JTkZPLCAiVXNpbmcgZHluYW1pYyBESCBwYXJhbWV0ZXJzIik7CisgICAgcmV0dXJuIDA7IC8qIE9LICovCit9CisKK05PRVhQT1JUIERIICpkaF9yZWFkKGNoYXIgKmNlcnQpIHsKKyAgICBESCAqZGg7CisgICAgQklPICpiaW87CisKKyAgICBpZighY2VydCkgeworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJObyBjZXJ0aWZpY2F0ZSBhdmFpbGFibGUgdG8gbG9hZCBESCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBGQUlMRUQgKi8KKyAgICB9CisgICAgYmlvPUJJT19uZXdfZmlsZShjZXJ0LCAiciIpOworICAgIGlmKCFiaW8pIHsKKyAgICAgICAgc3NsZXJyb3IoIkJJT19uZXdfZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogRkFJTEVEICovCisgICAgfQorICAgIGRoPVBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEJJT19mcmVlKGJpbyk7CisgICAgaWYoIWRoKSB7CisgICAgICAgIHdoaWxlKEVSUl9nZXRfZXJyb3IoKSkKKyAgICAgICAgICAgIDsgLyogT3BlblNTTCBlcnJvciBxdWV1ZSBjbGVhbnVwICovCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkNvdWxkIG5vdCBsb2FkIERIIHBhcmFtZXRlcnMgZnJvbSAlcyIsIGNlcnQpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogRkFJTEVEICovCisgICAgfQorICAgIHNfbG9nKExPR19ERUJVRywgIlVzaW5nIERIIHBhcmFtZXRlcnMgZnJvbSAlcyIsIGNlcnQpOworICAgIHJldHVybiBkaDsKK30KKworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUNESCBpbml0aWFsaXphdGlvbiAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorTk9FWFBPUlQgaW50IGVjZGhfaW5pdChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsKKyAgICBFQ19LRVkgKmVjZGg7CisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJFQ0RIIGluaXRpYWxpemF0aW9uIik7CisgICAgZWNkaD1FQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoc2VjdGlvbi0+Y3VydmUpOworICAgIGlmKCFlY2RoKSB7CisgICAgICAgIHNzbGVycm9yKCJFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUiKTsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkNhbm5vdCBjcmVhdGUgY3VydmUgJXMiLAorICAgICAgICAgICAgT0JKX25pZDJsbihzZWN0aW9uLT5jdXJ2ZSkpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIFNTTF9DVFhfc2V0X3RtcF9lY2RoKHNlY3Rpb24tPmN0eCwgZWNkaCk7CisgICAgRUNfS0VZX2ZyZWUoZWNkaCk7CisgICAgc19sb2coTE9HX0RFQlVHLCAiRUNESCBpbml0aWFsaXplZCB3aXRoIGN1cnZlICVzIiwKKyAgICAgICAgT0JKX25pZDJsbihzZWN0aW9uLT5jdXJ2ZSkpOworICAgIHJldHVybiAwOyAvKiBPSyAqLworfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUNESCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXplIGF1dGhlbnRpY2F0aW9uICovCisKK05PRVhQT1JUIGludCBhdXRoX2luaXQoU0VSVklDRV9PUFRJT05TICpzZWN0aW9uKSB7CisgICAgaW50IHJlc3VsdDsKKworICAgIHJlc3VsdD1sb2FkX2NlcnQoc2VjdGlvbik7CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisgICAgaWYoc2VjdGlvbi0+cHNrX2tleXMpIHsKKyAgICAgICAgaWYoc2VjdGlvbi0+b3B0aW9uLmNsaWVudCkKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soc2VjdGlvbi0+Y3R4LCBwc2tfY2xpZW50X2NhbGxiYWNrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1NMX0NUWF9zZXRfcHNrX3NlcnZlcl9jYWxsYmFjayhzZWN0aW9uLT5jdHgsIHBza19zZXJ2ZXJfY2FsbGJhY2spOworICAgICAgICByZXN1bHQ9MDsKKyAgICB9CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19QU0spICovCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCitOT0VYUE9SVCB1bnNpZ25lZCBwc2tfY2xpZW50X2NhbGxiYWNrKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAorICAgIGNoYXIgKmlkZW50aXR5LCB1bnNpZ25lZCBtYXhfaWRlbnRpdHlfbGVuLAorICAgIHVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgbWF4X3Bza19sZW4pIHsKKyAgICBDTEkgKmM7CisgICAgc2l6ZV90IGlkZW50aXR5X2xlbjsKKworICAgICh2b2lkKWhpbnQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgYz1TU0xfZ2V0X2V4X2RhdGEoc3NsLCBpbmRleF9jbGkpOworICAgIGlmKCFjLT5vcHQtPnBza19zZWxlY3RlZCkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiSU5URVJOQUwgRVJST1I6IE5vIFBTSyBpZGVudGl0eSBzZWxlY3RlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogdGhlIHNvdXJjZSBzZWVtcyB0byBoYXZlIGl0cyBidWZmZXIgbGFyZ2UgZW5vdWdoIGZvcgorICAgICAqIHRoZSB0cmFpbGluZyBudWxsIGNoYXJhY3RlciwgYnV0IHRoZSBtYW51YWwgcGFnZSBzYXlzCisgICAgICogbm90aGluZyBhYm91dCBpdCAtLSBsZXRzIHBsYXkgc2FmZSAqLworICAgIGlkZW50aXR5X2xlbj1zdHJsZW4oYy0+b3B0LT5wc2tfc2VsZWN0ZWQtPmlkZW50aXR5KSsxOworICAgIGlmKGlkZW50aXR5X2xlbj5tYXhfaWRlbnRpdHlfbGVuKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJQU0sgaWRlbnRpdHkgdG9vIGxvbmcgKCVsdT4lZCBieXRlcykiLAorICAgICAgICAgICAgKGxvbmcgdW5zaWduZWQpaWRlbnRpdHlfbGVuLCBtYXhfcHNrX2xlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZihjLT5vcHQtPnBza19zZWxlY3RlZC0+a2V5X2xlbj5tYXhfcHNrX2xlbikgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiUFNLIHRvbyBsb25nICglbHU+JWQgYnl0ZXMpIiwKKyAgICAgICAgICAgIChsb25nIHVuc2lnbmVkKWMtPm9wdC0+cHNrX3NlbGVjdGVkLT5rZXlfbGVuLCBtYXhfcHNrX2xlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdHJjcHkoaWRlbnRpdHksIGMtPm9wdC0+cHNrX3NlbGVjdGVkLT5pZGVudGl0eSk7CisgICAgbWVtY3B5KHBzaywgYy0+b3B0LT5wc2tfc2VsZWN0ZWQtPmtleV92YWwsIGMtPm9wdC0+cHNrX3NlbGVjdGVkLT5rZXlfbGVuKTsKKyAgICBzX2xvZyhMT0dfSU5GTywgIlBTSyBjbGllbnQgY29uZmlndXJlZCBmb3IgaWRlbnRpdHkgXCIlc1wiIiwgaWRlbnRpdHkpOworICAgIHJldHVybiAodW5zaWduZWQpKGMtPm9wdC0+cHNrX3NlbGVjdGVkLT5rZXlfbGVuKTsKK30KKworTk9FWFBPUlQgdW5zaWduZWQgcHNrX3NlcnZlcl9jYWxsYmFjayhTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisgICAgdW5zaWduZWQgY2hhciAqcHNrLCB1bnNpZ25lZCBtYXhfcHNrX2xlbikgeworICAgIENMSSAqYzsKKyAgICBQU0tfS0VZUyAqZm91bmQ7CisgICAgc2l6ZV90IGxlbjsKKworICAgIGM9U1NMX2dldF9leF9kYXRhKHNzbCwgaW5kZXhfY2xpKTsKKyAgICBmb3VuZD1wc2tfZmluZCgmYy0+b3B0LT5wc2tfc29ydGVkLCBpZGVudGl0eSk7CisgICAgaWYoZm91bmQpIHsKKyAgICAgICAgbGVuPWZvdW5kLT5rZXlfbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJObyBrZXkgZm91bmQgZm9yIFBTSyBpZGVudGl0eSBcIiVzXCIiLCBpZGVudGl0eSk7CisgICAgICAgIGxlbj0wOworICAgIH0KKyAgICBpZihsZW4+bWF4X3Bza19sZW4pIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlBTSyB0b28gbG9uZyAoJWx1PiVkIGJ5dGVzKSIsCisgICAgICAgICAgICAobG9uZyB1bnNpZ25lZClsZW4sIG1heF9wc2tfbGVuKTsKKyAgICAgICAgbGVuPTA7CisgICAgfQorICAgIGlmKGxlbikgeworICAgICAgICBtZW1jcHkocHNrLCBmb3VuZC0+a2V5X3ZhbCwgbGVuKTsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIktleSBjb25maWd1cmVkIGZvciBQU0sgaWRlbnRpdHkgXCIlc1wiIiwgaWRlbnRpdHkpOworICAgIH0gZWxzZSB7IC8qIGJsb2NrIGlkZW50aXR5IHByb2JlcyBpZiBwb3NzaWJsZSAqLworICAgICAgICBpZihtYXhfcHNrX2xlbj49MzIgJiYgUkFORF9ieXRlcyhwc2ssIDMyKT4wKSB7CisgICAgICAgICAgICBsZW49MzI7IC8qIDI1NiByYW5kb20gYml0cyAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkNvbmZpZ3VyZWQgcmFuZG9tIFBTSyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIlJlamVjdGluZyB3aXRoIHVua25vd25fcHNrX2lkZW50aXR5IGFsZXJ0Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICh1bnNpZ25lZClsZW47Cit9CisKK05PRVhQT1JUIGludCBwc2tfY29tcGFyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgICBQU0tfS0VZUyAqeD0qKFBTS19LRVlTICoqKWEsICp5PSooUFNLX0tFWVMgKiopYjsKKworI2lmIDAKKyAgICBzX2xvZyhMT0dfREVCVUcsICJQU0sgY21wOiAlcyAlcyIsIHgtPmlkZW50aXR5LCB5LT5pZGVudGl0eSk7CisjZW5kaWYKKyAgICByZXR1cm4gc3RyY21wKHgtPmlkZW50aXR5LCB5LT5pZGVudGl0eSk7Cit9CisKK3ZvaWQgcHNrX3NvcnQoUFNLX1RBQkxFICp0YWJsZSwgUFNLX0tFWVMgKmhlYWQpIHsKKyAgICBQU0tfS0VZUyAqY3VycjsKKyAgICBzaXplX3QgaTsKKworICAgIHRhYmxlLT5udW09MDsKKyAgICBmb3IoY3Vycj1oZWFkOyBjdXJyOyBjdXJyPWN1cnItPm5leHQpCisgICAgICAgICsrdGFibGUtPm51bTsKKyAgICBzX2xvZyhMT0dfSU5GTywgIlBTSyBpZGVudGl0aWVzOiAlbHUgcmV0cmlldmVkIiwKKyAgICAgICAgKGxvbmcgdW5zaWduZWQpdGFibGUtPm51bSk7CisgICAgdGFibGUtPnZhbD1zdHJfYWxsb2ModGFibGUtPm51bSpzaXplb2YoUFNLX0tFWVMgKikpOworICAgIGZvcihjdXJyPWhlYWQsIGk9MDsgaTx0YWJsZS0+bnVtOyArK2kpIHsKKyAgICAgICAgdGFibGUtPnZhbFtpXT1jdXJyOworICAgICAgICBjdXJyPWN1cnItPm5leHQ7CisgICAgfQorICAgIHFzb3J0KHRhYmxlLT52YWwsIHRhYmxlLT5udW0sIHNpemVvZihQU0tfS0VZUyAqKSwgcHNrX2NvbXBhcik7CisjaWYgMAorICAgIGZvcihpPTA7IGk8dGFibGUtPm51bTsgKytpKQorICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJQU0sgdGFibGU6ICVzIiwgdGFibGUtPnZhbFtpXS0+aWRlbnRpdHkpOworI2VuZGlmCit9CisKK1BTS19LRVlTICpwc2tfZmluZChjb25zdCBQU0tfVEFCTEUgKnRhYmxlLCBjb25zdCBjaGFyICppZGVudGl0eSkgeworICAgIFBTS19LRVlTIGtleSwgKnB0cj0ma2V5LCAqKnJldDsKKworICAgIGtleS5pZGVudGl0eT0oY2hhciAqKWlkZW50aXR5OworICAgIHJldD1ic2VhcmNoKCZwdHIsCisgICAgICAgIHRhYmxlLT52YWwsIHRhYmxlLT5udW0sIHNpemVvZihQU0tfS0VZUyAqKSwgcHNrX2NvbXBhcik7CisgICAgcmV0dXJuIHJldCA/ICpyZXQgOiBOVUxMOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19QU0spICovCisKK3N0YXRpYyBpbnQgY2FjaGVfaW5pdGlhbGl6ZWQ9MDsKKworTk9FWFBPUlQgaW50IGxvYWRfY2VydChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsKKyAgICAvKiBsb2FkIHRoZSBjZXJ0aWZpY2F0ZSAqLworICAgIGlmKHNlY3Rpb24tPmNlcnQpIHsKKyAgICAgICAgc19sb2coTE9HX0lORk8sICJMb2FkaW5nIGNlcnRpZmljYXRlIGZyb20gZmlsZTogJXMiLCBzZWN0aW9uLT5jZXJ0KTsKKyAgICAgICAgaWYoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc2VjdGlvbi0+Y3R4LCBzZWN0aW9uLT5jZXJ0KSkgeworICAgICAgICAgICAgc3NsZXJyb3IoIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUiKTsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGxvYWQgdGhlIHByaXZhdGUga2V5ICovCisgICAgaWYoIXNlY3Rpb24tPmtleSkgeworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJObyBwcml2YXRlIGtleSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIE9LICovCisgICAgfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgIGlmKHNlY3Rpb24tPmVuZ2luZSkgeworICAgICAgICBpZihsb2FkX2tleV9lbmdpbmUoc2VjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmKGxvYWRfa2V5X2ZpbGUoc2VjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorCisgICAgLyogdmFsaWRhdGUgdGhlIHByaXZhdGUga2V5ICovCisgICAgaWYoIVNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoc2VjdGlvbi0+Y3R4KSkgeworICAgICAgICBzc2xlcnJvcigiUHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIik7CisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICB9CisgICAgc19sb2coTE9HX0RFQlVHLCAiUHJpdmF0ZSBrZXkgY2hlY2sgc3VjY2VlZGVkIik7CisgICAgcmV0dXJuIDA7IC8qIE9LICovCit9CisKK05PRVhQT1JUIGludCBsb2FkX2tleV9maWxlKFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbikgeworICAgIGludCBpLCByZWFzb247CisgICAgVUlfREFUQSB1aV9kYXRhOworCisgICAgc19sb2coTE9HX0lORk8sICJMb2FkaW5nIGtleSBmcm9tIGZpbGU6ICVzIiwgc2VjdGlvbi0+a2V5KTsKKyAgICBpZihmaWxlX3Blcm1pc3Npb25zKHNlY3Rpb24tPmtleSkpCisgICAgICAgIHJldHVybiAxOworCisgICAgdWlfZGF0YS5zZWN0aW9uPXNlY3Rpb247IC8qIHNldHVwIGN1cnJlbnQgc2VjdGlvbiBmb3IgY2FsbGJhY2tzICovCisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc2VjdGlvbi0+Y3R4LCBwYXNzd29yZF9jYik7CisKKyAgICBmb3IoaT0wOyBpPD0zOyBpKyspIHsKKyAgICAgICAgaWYoIWkgJiYgIWNhY2hlX2luaXRpYWxpemVkKQorICAgICAgICAgICAgY29udGludWU7IC8qIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZSAqLworICAgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzZWN0aW9uLT5jdHgsCisgICAgICAgICAgICBpID8gJnVpX2RhdGEgOiBOVUxMKTsgLyogdHJ5IHRoZSBjYWNoZWQgcGFzc3dvcmQgZmlyc3QgKi8KKyAgICAgICAgaWYoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNlY3Rpb24tPmN0eCwgc2VjdGlvbi0+a2V5LAorICAgICAgICAgICAgICAgIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJlYXNvbj1FUlJfR0VUX1JFQVNPTihFUlJfcGVla19lcnJvcigpKTsKKyAgICAgICAgaWYoaTw9MiAmJiByZWFzb249PUVWUF9SX0JBRF9ERUNSWVBUKSB7CisgICAgICAgICAgICBzc2xlcnJvcl9xdWV1ZSgpOyAvKiBkdW1wIHRoZSBlcnJvciBxdWV1ZSAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIldyb25nIHBhc3MgcGhyYXNlOiByZXRyeWluZyIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3NsZXJyb3IoIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSIpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIHJldHVybiAwOyAvKiBPSyAqLworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitOT0VYUE9SVCBpbnQgbG9hZF9rZXlfZW5naW5lKFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbikgeworICAgIGludCBpLCByZWFzb247CisgICAgVUlfREFUQSB1aV9kYXRhOworICAgIEVWUF9QS0VZICpwa2V5OworICAgIFVJX01FVEhPRCAqdWlfbWV0aG9kOworCisgICAgc19sb2coTE9HX0lORk8sICJMb2FkaW5nIGtleSBmcm9tIGVuZ2luZTogJXMiLCBzZWN0aW9uLT5rZXkpOworCisgICAgdWlfZGF0YS5zZWN0aW9uPXNlY3Rpb247IC8qIHNldHVwIGN1cnJlbnQgc2VjdGlvbiBmb3IgY2FsbGJhY2tzICovCisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc2VjdGlvbi0+Y3R4LCBwYXNzd29yZF9jYik7CisKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICB1aV9tZXRob2Q9VUlfY3JlYXRlX21ldGhvZCgic3R1bm5lbCBXSU4zMiBVSSIpOworICAgIFVJX21ldGhvZF9zZXRfcmVhZGVyKHVpX21ldGhvZCwgcGluX2NiKTsKKyNlbHNlIC8qIFVTRV9XSU4zMiAqLworICAgIHVpX21ldGhvZD1VSV9PcGVuU1NMKCk7CisgICAgLyogd29ya2Fyb3VuZCBmb3IgYnJva2VuIGVuZ2luZXMgKi8KKyAgICAvKiB1aV9kYXRhLnNlY3Rpb249TlVMTDsgKi8KKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKyAgICBmb3IoaT0xOyBpPD0zOyBpKyspIHsKKyAgICAgICAgcGtleT1FTkdJTkVfbG9hZF9wcml2YXRlX2tleShzZWN0aW9uLT5lbmdpbmUsIHNlY3Rpb24tPmtleSwKKyAgICAgICAgICAgIHVpX21ldGhvZCwgJnVpX2RhdGEpOworICAgICAgICBpZighcGtleSkgeworICAgICAgICAgICAgcmVhc29uPUVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2Vycm9yKCkpOworICAgICAgICAgICAgaWYoaTw9MiAmJiAocmVhc29uPT03IHx8IHJlYXNvbj09MTYwKSkgeyAvKiB3cm9uZyBQSU4gKi8KKyAgICAgICAgICAgICAgICBzc2xlcnJvcl9xdWV1ZSgpOyAvKiBkdW1wIHRoZSBlcnJvciBxdWV1ZSAqLworICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJXcm9uZyBQSU46IHJldHJ5aW5nIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2xlcnJvcigiRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkiKTsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBpZihTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KHNlY3Rpb24tPmN0eCwgcGtleSkpCisgICAgICAgICAgICBicmVhazsgLyogc3VjY2VzcyAqLworICAgICAgICBzc2xlcnJvcigiU1NMX0NUWF91c2VfUHJpdmF0ZUtleSIpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIHJldHVybiAwOyAvKiBPSyAqLworfQorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fRU5HSU5FKSAqLworCitOT0VYUE9SVCBpbnQgcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICBzdGF0aWMgY2hhciBjYWNoZVtQRU1fQlVGU0laRV07CisgICAgaW50IGxlbjsKKworICAgIGlmKHNpemU+UEVNX0JVRlNJWkUpCisgICAgICAgIHNpemU9UEVNX0JVRlNJWkU7CisKKyAgICBpZih1c2VyZGF0YSkgeyAvKiBwcm9tcHQgdGhlIHVzZXIgKi8KKyNpZmRlZiBVU0VfV0lOMzIKKyAgICAgICAgbGVuPXBhc3N3ZF9jYihidWYsIHNpemUsIHJ3ZmxhZywgdXNlcmRhdGEpOworI2Vsc2UKKyAgICAgICAgbGVuPVBFTV9kZWZfY2FsbGJhY2soYnVmLCBzaXplLCByd2ZsYWcsIE5VTEwpOworI2VuZGlmCisgICAgICAgIG1lbWNweShjYWNoZSwgYnVmLCAoc2l6ZV90KXNpemUpOyAvKiBzYXZlIGluIGNhY2hlICovCisgICAgICAgIGNhY2hlX2luaXRpYWxpemVkPTE7CisgICAgfSBlbHNlIHsgLyogdHJ5IHRoZSBjYWNoZWQgdmFsdWUgKi8KKyAgICAgICAgc3RybmNweShidWYsIGNhY2hlLCAoc2l6ZV90KXNpemUpOworICAgICAgICBidWZbc2l6ZS0xXT0nXDAnOworICAgICAgICBsZW49KGludClzdHJsZW4oYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc2Vzc2lvbiBjYWNoZSBjYWxsYmFja3MgKi8KKworI2RlZmluZSBDQUNIRV9DTURfTkVXICAgICAweDAwCisjZGVmaW5lIENBQ0hFX0NNRF9HRVQgICAgIDB4MDEKKyNkZWZpbmUgQ0FDSEVfQ01EX1JFTU9WRSAgMHgwMgorI2RlZmluZSBDQUNIRV9SRVNQX0VSUiAgICAweDgwCisjZGVmaW5lIENBQ0hFX1JFU1BfT0sgICAgIDB4ODEKKworTk9FWFBPUlQgaW50IHNlc3NfbmV3X2NiKFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqc2VzcykgeworICAgIHVuc2lnbmVkIGNoYXIgKnZhbCwgKnZhbF90bXA7CisgICAgc3NpemVfdCB2YWxfbGVuOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlc3Npb25faWQ7CisgICAgdW5zaWduZWQgaW50IHNlc3Npb25faWRfbGVuZ3RoOworCisgICAgdmFsX2xlbj1pMmRfU1NMX1NFU1NJT04oc2VzcywgTlVMTCk7CisgICAgdmFsX3RtcD12YWw9c3RyX2FsbG9jKChzaXplX3QpdmFsX2xlbik7CisgICAgaTJkX1NTTF9TRVNTSU9OKHNlc3MsICZ2YWxfdG1wKTsKKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MDA5MDgwMGZMCisgICAgc2Vzc2lvbl9pZD1TU0xfU0VTU0lPTl9nZXRfaWQoc2VzcywgJnNlc3Npb25faWRfbGVuZ3RoKTsKKyNlbHNlCisgICAgc2Vzc2lvbl9pZD0oY29uc3QgdW5zaWduZWQgY2hhciAqKXNlc3MtPnNlc3Npb25faWQ7CisgICAgc2Vzc2lvbl9pZF9sZW5ndGg9c2Vzcy0+c2Vzc2lvbl9pZF9sZW5ndGg7CisjZW5kaWYKKyAgICBjYWNoZV90cmFuc2ZlcihTU0xfZ2V0X1NTTF9DVFgoc3NsKSwgQ0FDSEVfQ01EX05FVywKKyAgICAgICAgU1NMX1NFU1NJT05fZ2V0X3RpbWVvdXQoc2VzcyksCisgICAgICAgIHNlc3Npb25faWQsIHNlc3Npb25faWRfbGVuZ3RoLCB2YWwsIChzaXplX3QpdmFsX2xlbiwgTlVMTCwgTlVMTCk7CisgICAgc3RyX2ZyZWUodmFsKTsKKyAgICByZXR1cm4gMTsgLyogbGVhdmUgdGhlIHNlc3Npb24gaW4gbG9jYWwgY2FjaGUgZm9yIHJldXNlICovCit9CisKK05PRVhQT1JUIFNTTF9TRVNTSU9OICpzZXNzX2dldF9jYihTU0wgKnNzbCwKKyAgICAgICAgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwgaW50ICpkb19jb3B5KSB7CisgICAgdW5zaWduZWQgY2hhciAqdmFsLCAqdmFsX3RtcD1OVUxMOworICAgIHNzaXplX3QgdmFsX2xlbj0wOworICAgIFNTTF9TRVNTSU9OICpzZXNzOworCisgICAgKmRvX2NvcHkgPSAwOyAvKiBhbGxvdyB0aGUgc2Vzc2lvbiB0byBiZSBmcmVlZCBhdXRtYXRpY2FsbHkgKi8KKyAgICBjYWNoZV90cmFuc2ZlcihTU0xfZ2V0X1NTTF9DVFgoc3NsKSwgQ0FDSEVfQ01EX0dFVCwgMCwKKyAgICAgICAga2V5LCAoc2l6ZV90KWtleV9sZW4sIE5VTEwsIDAsICZ2YWwsIChzaXplX3QgKikmdmFsX2xlbik7CisgICAgaWYoIXZhbCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsX3RtcD12YWw7CisgICAgc2Vzcz1kMmlfU1NMX1NFU1NJT04oTlVMTCwKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDAwOTA4MDBmTAorICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKikKKyNlbmRpZiAvKiBPcGVuU1NMIHZlcnNpb24gPj0gMC44LjAgKi8KKyAgICAgICAgJnZhbF90bXAsIHZhbF9sZW4pOworICAgIHN0cl9mcmVlKHZhbCk7CisgICAgcmV0dXJuIHNlc3M7Cit9CisKK05PRVhQT1JUIHZvaWQgc2Vzc19yZW1vdmVfY2IoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqc2VzcykgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlc3Npb25faWQ7CisgICAgdW5zaWduZWQgaW50IHNlc3Npb25faWRfbGVuZ3RoOworCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgwMDkwODAwZkwKKyAgICBzZXNzaW9uX2lkPVNTTF9TRVNTSU9OX2dldF9pZChzZXNzLCAmc2Vzc2lvbl9pZF9sZW5ndGgpOworI2Vsc2UKKyAgICBzZXNzaW9uX2lkPShjb25zdCB1bnNpZ25lZCBjaGFyICopc2Vzcy0+c2Vzc2lvbl9pZDsKKyAgICBzZXNzaW9uX2lkX2xlbmd0aD1zZXNzLT5zZXNzaW9uX2lkX2xlbmd0aDsKKyNlbmRpZgorICAgIGNhY2hlX3RyYW5zZmVyKGN0eCwgQ0FDSEVfQ01EX1JFTU9WRSwgMCwKKyAgICAgICAgc2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZF9sZW5ndGgsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworfQorCisjZGVmaW5lIE1BWF9WQUxfTEVOIDUxMgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVfY2hhciB2ZXJzaW9uLCB0eXBlOworICAgIHVfc2hvcnQgdGltZW91dDsKKyAgICB1X2NoYXIga2V5W1NTTF9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIXTsKKyAgICB1X2NoYXIgdmFsW01BWF9WQUxfTEVOXTsKK30gQ0FDSEVfUEFDS0VUOworCitOT0VYUE9SVCB2b2lkIGNhY2hlX3RyYW5zZmVyKFNTTF9DVFggKmN0eCwgY29uc3QgdV9jaGFyIHR5cGUsCisgICAgICAgIGNvbnN0IGxvbmcgdGltZW91dCwKKyAgICAgICAgY29uc3QgdV9jaGFyICprZXksIGNvbnN0IHNpemVfdCBrZXlfbGVuLAorICAgICAgICBjb25zdCB1X2NoYXIgKnZhbCwgY29uc3Qgc2l6ZV90IHZhbF9sZW4sCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKipyZXQsIHNpemVfdCAqcmV0X2xlbikgeworICAgIGNoYXIgc2Vzc2lvbl9pZF90eHRbMipTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCsxXTsKKyAgICBjb25zdCBjaGFyIGhleFsxNl09IjAxMjM0NTY3ODlBQkNERUYiOworICAgIGNvbnN0IGNoYXIgKnR5cGVfZGVzY3JpcHRpb25bXT17Im5ldyIsICJnZXQiLCAicmVtb3ZlIn07CisgICAgdW5zaWduZWQgaTsKKyAgICBTT0NLRVQgczsKKyAgICBzc2l6ZV90IGxlbjsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0OworICAgIENBQ0hFX1BBQ0tFVCAqcGFja2V0OworICAgIFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbjsKKworICAgIGlmKHJldCkgLyogc2V0IGVycm9yIGFzIHRoZSBkZWZhdWx0IHJlc3VsdCBpZiByZXF1aXJlZCAqLworICAgICAgICAqcmV0PU5VTEw7CisKKyAgICAvKiBsb2cgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gKi8KKyAgICBmb3IoaT0wOyBpPGtleV9sZW4gJiYgaTxTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsgKytpKSB7CisgICAgICAgIHNlc3Npb25faWRfdHh0WzIqaV09aGV4W2tleVtpXT4+NF07CisgICAgICAgIHNlc3Npb25faWRfdHh0WzIqaSsxXT1oZXhba2V5W2ldJjB4MGZdOworICAgIH0KKyAgICBzZXNzaW9uX2lkX3R4dFsyKmldPSdcMCc7CisgICAgc19sb2coTE9HX0lORk8sCisgICAgICAgICJjYWNoZV90cmFuc2ZlcjogcmVxdWVzdD0lcywgdGltZW91dD0lbGQsIGlkPSVzLCBsZW5ndGg9JWx1IiwKKyAgICAgICAgdHlwZV9kZXNjcmlwdGlvblt0eXBlXSwgdGltZW91dCwgc2Vzc2lvbl9pZF90eHQsIChsb25nIHVuc2lnbmVkKXZhbF9sZW4pOworCisgICAgLyogYWxsb2NhdGUgVURQIHBhY2tldCBidWZmZXIgKi8KKyAgICBpZihrZXlfbGVuPlNTTF9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJjYWNoZV90cmFuc2Zlcjogc2Vzc2lvbiBpZCB0b28gYmlnICglbHUgYnl0ZXMpIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWtleV9sZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHZhbF9sZW4+TUFYX1ZBTF9MRU4pIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgImNhY2hlX3RyYW5zZmVyOiBlbmNvZGVkIHNlc3Npb24gdG9vIGJpZyAoJWx1IGJ5dGVzKSIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZylrZXlfbGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWNrZXQ9c3RyX2FsbG9jKHNpemVvZihDQUNIRV9QQUNLRVQpKTsKKworICAgIC8qIHNldHVwIHBhY2tldCAqLworICAgIHBhY2tldC0+dmVyc2lvbj0xOworICAgIHBhY2tldC0+dHlwZT10eXBlOworICAgIHBhY2tldC0+dGltZW91dD1odG9ucygodV9zaG9ydCkodGltZW91dDw2NDgwMD90aW1lb3V0OjY0ODAwKSk7LyogMTggaG91cnMgKi8KKyAgICBtZW1jcHkocGFja2V0LT5rZXksIGtleSwga2V5X2xlbik7CisgICAgbWVtY3B5KHBhY2tldC0+dmFsLCB2YWwsIHZhbF9sZW4pOworCisgICAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgICBzPXNfc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDAsIDAsICJjYWNoZV90cmFuc2Zlcjogc29ja2V0Iik7CisgICAgaWYocz09SU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgICAgc3RyX2ZyZWUocGFja2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJldHJpZXZlIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gc3RydWN0dXJlIG9mIHRoaXMgY3R4ICovCisgICAgc2VjdGlvbj1TU0xfQ1RYX2dldF9leF9kYXRhKGN0eCwgaW5kZXhfb3B0KTsKKyAgICBpZihzZW5kdG8ocywgKHZvaWQgKilwYWNrZXQsCisjaWZkZWYgVVNFX1dJTjMyCisgICAgICAgICAgICAoaW50KQorI2VuZGlmCisgICAgICAgICAgICAoc2l6ZW9mKENBQ0hFX1BBQ0tFVCktTUFYX1ZBTF9MRU4rdmFsX2xlbiksCisgICAgICAgICAgICAwLCAmc2VjdGlvbi0+c2Vzc2lvbmRfYWRkci5zYSwKKyAgICAgICAgICAgIGFkZHJfbGVuKCZzZWN0aW9uLT5zZXNzaW9uZF9hZGRyKSk8MCkgeworICAgICAgICBzb2NrZXJyb3IoImNhY2hlX3RyYW5zZmVyOiBzZW5kdG8iKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQocyk7CisgICAgICAgIHN0cl9mcmVlKHBhY2tldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZighcmV0IHx8ICFyZXRfbGVuKSB7IC8qIG5vIHJlc3BvbnNlIGlzIHJlcXVpcmVkICovCisgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICBzdHJfZnJlZShwYWNrZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogc2V0IHJlY3Zmcm9tIHRpbWVvdXQgdG8gMjAwbXMgKi8KKyAgICB0LnR2X3NlYz0wOworICAgIHQudHZfdXNlYz0yMDA7CisgICAgaWYoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgKHZvaWQgKikmdCwgc2l6ZW9mIHQpPDApIHsKKyAgICAgICAgc29ja2Vycm9yKCJjYWNoZV90cmFuc2Zlcjogc2V0c29ja29wdCBTT19SQ1ZUSU1FTyIpOworICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgc3RyX2ZyZWUocGFja2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJldHJpZXZlIHJlc3BvbnNlICovCisgICAgbGVuPXJlY3YocywgKHZvaWQgKilwYWNrZXQsIHNpemVvZihDQUNIRV9QQUNLRVQpLCAwKTsKKyAgICBjbG9zZXNvY2tldChzKTsKKyAgICBpZihsZW48MCkgeworICAgICAgICBpZihnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKT09U19FV09VTERCTE9DSyB8fAorICAgICAgICAgICAgICAgIGdldF9sYXN0X3NvY2tldF9lcnJvcigpPT1TX0VBR0FJTikKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiY2FjaGVfdHJhbnNmZXI6IHJlY3YgdGltZW91dCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2NrZXJyb3IoImNhY2hlX3RyYW5zZmVyOiByZWN2Iik7CisgICAgICAgIHN0cl9mcmVlKHBhY2tldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBwYXJzZSByZXN1bHRzICovCisgICAgaWYobGVuPChpbnQpc2l6ZW9mKENBQ0hFX1BBQ0tFVCktTUFYX1ZBTF9MRU4gfHwgLyogdG9vIHNob3J0ICovCisgICAgICAgICAgICBwYWNrZXQtPnZlcnNpb24hPTEgfHwgLyogd3JvbmcgdmVyc2lvbiAqLworICAgICAgICAgICAgc2FmZV9tZW1jbXAocGFja2V0LT5rZXksIGtleSwga2V5X2xlbikpIHsgLyogd3Jvbmcgc2Vzc2lvbiBpZCAqLworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJjYWNoZV90cmFuc2ZlcjogbWFsZm9ybWVkIHBhY2tldCByZWNlaXZlZCIpOworICAgICAgICBzdHJfZnJlZShwYWNrZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHBhY2tldC0+dHlwZSE9Q0FDSEVfUkVTUF9PSykgeworICAgICAgICBzX2xvZyhMT0dfSU5GTywgImNhY2hlX3RyYW5zZmVyOiBzZXNzaW9uIG5vdCBmb3VuZCIpOworICAgICAgICBzdHJfZnJlZShwYWNrZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICpyZXRfbGVuPShzaXplX3QpbGVuLShzaXplb2YoQ0FDSEVfUEFDS0VUKS1NQVhfVkFMX0xFTik7CisgICAgKnJldD1zdHJfYWxsb2MoKnJldF9sZW4pOworICAgIHNfbG9nKExPR19JTkZPLCAiY2FjaGVfdHJhbnNmZXI6IHNlc3Npb24gZm91bmQiKTsKKyAgICBtZW1jcHkoKnJldCwgcGFja2V0LT52YWwsICpyZXRfbGVuKTsKKyAgICBzdHJfZnJlZShwYWNrZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbmZvcm1hdGlvbmFsIGNhbGxiYWNrICovCisKK05PRVhQT1JUIHZvaWQgaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKnNzbCwgaW50IHdoZXJlLCBpbnQgcmV0KSB7CisgICAgQ0xJICpjOworICAgIFNTTF9DVFggKmN0eDsKKworICAgIGM9U1NMX2dldF9leF9kYXRhKChTU0wgKilzc2wsIGluZGV4X2NsaSk7CisgICAgaWYoYykgeworICAgICAgICBpZigod2hlcmUmU1NMX0NCX0hBTkRTSEFLRV9ET05FKQorICAgICAgICAgICAgICAgICYmIGMtPnJlbmVnX3N0YXRlPT1SRU5FR19JTklUKSB7CisgICAgICAgICAgICAvKiBmaXJzdCAoaW5pdGlhbCkgaGFuZHNoYWtlIHdhcyBjb21wbGV0ZWQsIHJlbWVtYmVyIHRoaXMsCisgICAgICAgICAgICAgKiBzbyB0aGF0IGZ1cnRoZXIgcmVuZWdvdGlhdGlvbiBhdHRlbXB0cyBjYW4gYmUgZGV0ZWN0ZWQgKi8KKyAgICAgICAgICAgIGMtPnJlbmVnX3N0YXRlPVJFTkVHX0VTVEFCTElTSEVEOworICAgICAgICB9IGVsc2UgaWYoKHdoZXJlJlNTTF9DQl9BQ0NFUFRfTE9PUCkKKyAgICAgICAgICAgICAgICAmJiBjLT5yZW5lZ19zdGF0ZT09UkVORUdfRVNUQUJMSVNIRUQpIHsKKyAgICAgICAgICAgIGludCBzdGF0ZT1TU0xfZ2V0X3N0YXRlKChTU0wgKilzc2wpOworCisgICAgICAgICAgICBpZihzdGF0ZT09U1NMM19TVF9TUl9DTE5UX0hFTExPX0EKKyAgICAgICAgICAgICAgICAgICAgfHwgc3RhdGU9PVNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQSkgeworICAgICAgICAgICAgICAgIC8qIGNsaWVudCBoZWxsbyByZWNlaXZlZCBhZnRlciBpbml0aWFsIGhhbmRzaGFrZSwKKyAgICAgICAgICAgICAgICAgKiB0aGlzIG1lYW5zIHJlbmVnb3RpYXRpb24gLT4gbWFyayBpdCAqLworICAgICAgICAgICAgICAgIGMtPnJlbmVnX3N0YXRlPVJFTkVHX0RFVEVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMtPm9wdC0+bG9nX2xldmVsPExPR19ERUJVRykgLyogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uICovCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2hlcmUgJiBTU0xfQ0JfTE9PUCkgeworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTU0wgc3RhdGUgKCVzKTogJXMiLAorICAgICAgICAgICAgd2hlcmUgJiBTU0xfU1RfQ09OTkVDVCA/ICJjb25uZWN0IiA6CisgICAgICAgICAgICB3aGVyZSAmIFNTTF9TVF9BQ0NFUFQgPyAiYWNjZXB0IiA6CisgICAgICAgICAgICAidW5kZWZpbmVkIiwgU1NMX3N0YXRlX3N0cmluZ19sb25nKHNzbCkpOworICAgIH0gZWxzZSBpZih3aGVyZSAmIFNTTF9DQl9BTEVSVCkgeworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTU0wgYWxlcnQgKCVzKTogJXM6ICVzIiwKKyAgICAgICAgICAgIHdoZXJlICYgU1NMX0NCX1JFQUQgPyAicmVhZCIgOiAid3JpdGUiLAorICAgICAgICAgICAgU1NMX2FsZXJ0X3R5cGVfc3RyaW5nX2xvbmcocmV0KSwKKyAgICAgICAgICAgIFNTTF9hbGVydF9kZXNjX3N0cmluZ19sb25nKHJldCkpOworICAgIH0gZWxzZSBpZih3aGVyZT09U1NMX0NCX0hBTkRTSEFLRV9ET05FKSB7CisgICAgICAgIGN0eD1TU0xfZ2V0X1NTTF9DVFgoKFNTTCAqKXNzbCk7CisgICAgICAgIGlmKGMtPm9wdC0+b3B0aW9uLmNsaWVudCkgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBjbGllbnQgY29ubmVjdChzKSByZXF1ZXN0ZWQiLAorICAgICAgICAgICAgICAgIFNTTF9DVFhfc2Vzc19jb25uZWN0KGN0eCkpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBjbGllbnQgY29ubmVjdChzKSBzdWNjZWVkZWQiLAorICAgICAgICAgICAgICAgIFNTTF9DVFhfc2Vzc19jb25uZWN0X2dvb2QoY3R4KSk7CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICIlNmxkIGNsaWVudCByZW5lZ290aWF0aW9uKHMpIHJlcXVlc3RlZCIsCisgICAgICAgICAgICAgICAgU1NMX0NUWF9zZXNzX2Nvbm5lY3RfcmVuZWdvdGlhdGUoY3R4KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICIlNmxkIHNlcnZlciBhY2NlcHQocykgcmVxdWVzdGVkIiwKKyAgICAgICAgICAgICAgICBTU0xfQ1RYX3Nlc3NfYWNjZXB0KGN0eCkpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBzZXJ2ZXIgYWNjZXB0KHMpIHN1Y2NlZWRlZCIsCisgICAgICAgICAgICAgICAgU1NMX0NUWF9zZXNzX2FjY2VwdF9nb29kKGN0eCkpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBzZXJ2ZXIgcmVuZWdvdGlhdGlvbihzKSByZXF1ZXN0ZWQiLAorICAgICAgICAgICAgICAgIFNTTF9DVFhfc2Vzc19hY2NlcHRfcmVuZWdvdGlhdGUoY3R4KSk7CisgICAgICAgIH0KKyAgICAgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBzb3VyY2UgaXQgbm90IG9ubHkgaW5jbHVkZXMgaW50ZXJuYWwKKyAgICAgICAgICAgYW5kIGV4dGVybmFsIHNlc3Npb24gY2FjaGVzLCBidXQgYWxzbyBzZXNzaW9uIHRpY2tldHMgKi8KKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBzZXNzaW9uIHJldXNlKHMpIiwKKyAgICAgICAgICAgIFNTTF9DVFhfc2Vzc19oaXRzKGN0eCkpOworICAgICAgICBpZighYy0+b3B0LT5vcHRpb24uY2xpZW50KSB7IC8qIHNlcnZlciBzZXNzaW9uIGNhY2hlIHN0YXRzICovCisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICIlNmxkIGludGVybmFsIHNlc3Npb24gY2FjaGUgaXRlbShzKSIsCisgICAgICAgICAgICAgICAgU1NMX0NUWF9zZXNzX251bWJlcihjdHgpKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIiU2bGQgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZSBmaWxsLXVwKHMpIiwKKyAgICAgICAgICAgICAgICBTU0xfQ1RYX3Nlc3NfY2FjaGVfZnVsbChjdHgpKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIiU2bGQgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZSBtaXNzKGVzKSIsCisgICAgICAgICAgICAgICAgU1NMX0NUWF9zZXNzX21pc3NlcyhjdHgpKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIiU2bGQgZXh0ZXJuYWwgc2Vzc2lvbiBjYWNoZSBoaXQocykiLAorICAgICAgICAgICAgICAgIFNTTF9DVFhfc2Vzc19jYl9oaXRzKGN0eCkpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiJTZsZCBleHBpcmVkIHNlc3Npb24ocykgcmV0cmlldmVkIiwKKyAgICAgICAgICAgICAgICBTU0xfQ1RYX3Nlc3NfdGltZW91dHMoY3R4KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNTTCBlcnJvciByZXBvcnRpbmcgKi8KKwordm9pZCBzc2xlcnJvcihjaGFyICp0eHQpIHsgLyogT3BlblNTTCBlcnJvciBoYW5kbGVyICovCisgICAgdW5zaWduZWQgbG9uZyBlcnI7CisKKyAgICBlcnI9RVJSX2dldF9lcnJvcigpOworICAgIGlmKGVycikgeworICAgICAgICBzc2xlcnJvcl9xdWV1ZSgpOworICAgICAgICBzc2xlcnJvcl9sb2coZXJyLCB0eHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICIlczogUGVlciBzdWRkZW5seSBkaXNjb25uZWN0ZWQiLCB0eHQpOworICAgIH0KK30KKworTk9FWFBPUlQgdm9pZCBzc2xlcnJvcl9xdWV1ZSh2b2lkKSB7IC8qIHJlY3Vyc2l2ZSBkdW1wIG9mIHRoZSBlcnJvciBxdWV1ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgZXJyOworCisgICAgZXJyPUVSUl9nZXRfZXJyb3IoKTsKKyAgICBpZihlcnIpIHsKKyAgICAgICAgc3NsZXJyb3JfcXVldWUoKTsKKyAgICAgICAgc3NsZXJyb3JfbG9nKGVyciwgImVycm9yIHF1ZXVlIik7CisgICAgfQorfQorCitOT0VYUE9SVCB2b2lkIHNzbGVycm9yX2xvZyh1bnNpZ25lZCBsb25nIGVyciwgY2hhciAqdHh0KSB7CisgICAgY2hhciAqZXJyb3Jfc3RyaW5nOworCisgICAgZXJyb3Jfc3RyaW5nPXN0cl9hbGxvYygyNTYpOworICAgIEVSUl9lcnJvcl9zdHJpbmdfbihlcnIsIGVycm9yX3N0cmluZywgMjU2KTsKKyAgICBzX2xvZyhMT0dfRVJSLCAiJXM6ICVsWDogJXMiLCB0eHQsIGVyciwgZXJyb3Jfc3RyaW5nKTsKKyAgICBzdHJfZnJlZShlcnJvcl9zdHJpbmcpOworfQorCisvKiBlbmQgb2YgY3R4LmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9kaHBhcmFtLmMgYi9zcmMvZGhwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGhwYXJhbS5jCkBAIC0wLDAgKzEsNDUgQEAKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2RlZmluZSBETl9uZXcgREhfbmV3CisjaWZuZGVmIEhFQURFUl9ESF9ICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCitESCAqZ2V0X2RoMjA0OCgpCisJeworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMjA0OF9wW109eworCQkweEY4LDB4NDEsMHhBRSwweEM4LDB4OTIsMHhBRiwweEM2LDB4RDQsMHg4QiwweEMyLDB4MDYsMHgwNCwKKwkJMHg4MywweDU3LDB4MDgsMHg4MCwweEQ2LDB4QzMsMHhBNywweDhBLDB4RkQsMHg4RSwweENGLDB4QUMsCisJCTB4OEYsMHg4QSwweDQzLDB4MjAsMHgwNSwweDJCLDB4RDEsMHg3MCwweDAxLDB4RDAsMHg5RiwweDdCLAorCQkweDQ0LDB4OTIsMHhCNSwweDY0LDB4QTcsMHhFOSwweEYxLDB4MUUsMHhCQywweDlFLDB4NTEsMHg4NywKKwkJMHhEQiwweDY2LDB4QTYsMHgwQSwweEQ2LDB4RjQsMHhCRCwweEJELDB4REYsMHg1MCwweEY2LDB4QkEsCisJCTB4NUQsMHhCMywweDlDLDB4MkYsMHgzRiwweDQxLDB4RUIsMHhERCwweEVFLDB4RTEsMHg3QiwweEFELAorCQkweDk5LDB4NUQsMHhBNiwweDY5LDB4QzYsMHgyRiwweDVBLDB4MkYsMHg0NywweDVFLDB4NDksMHg0OCwKKwkJMHhBNCwweDg3LDB4QTQsMHg2NSwweDEyLDB4OTMsMHhCOSwweEEzLDB4MDksMHgwNCwweDAxLDB4QTAsCisJCTB4RDAsMHhGQiwweDBFLDB4NDcsMHg3RiwweDhDLDB4NUMsMHg3NCwweDUwLDB4RUEsMHhGQiwweEZELAorCQkweDM5LDB4RDQsMHgwMCwweDMwLDB4MEEsMHhERSwweDdFLDB4QjcsMHhCRSwweDVFLDB4MzAsMHgwNiwKKwkJMHg1QSwweEFDLDB4QzIsMHg3OSwweEMzLDB4M0EsMHhGQywweDcyLDB4QzIsMHgxNSwweDdBLDB4QkUsCisJCTB4NDksMHhCRSwweDM2LDB4N0EsMHhFRCwweDM4LDB4ODMsMHgzRiwweDQ0LDB4QUIsMHgyNiwweDgxLAorCQkweDg5LDB4RUYsMHg1OCwweERGLDB4NTUsMHgxNCwweEQ1LDB4NDIsMHhCNCwweDU3LDB4RDYsMHgwMSwKKwkJMHhFMiwweDlDLDB4MkQsMHg3QiwweEMxLDB4REEsMHhCOSwweDEwLDB4OEMsMHg1QSwweEY3LDB4OTgsCisJCTB4RTIsMHgwMCwweDhGLDB4QTgsMHgyMiwweDZDLDB4NjAsMHg5MCwweDM1LDB4NkEsMHg3NCwweDI5LAorCQkweDdCLDB4RTAsMHhGOSwweDQ2LDB4RjMsMHg3OSwweDlDLDB4N0EsMHgzMCwweDYyLDB4MTYsMHg5RCwKKwkJMHg0MiwweEJELDB4RDIsMHg1RSwweDE3LDB4NDksMHg3MSwweEM1LDB4QjAsMHg1MSwweENBLDB4QUMsCisJCTB4NTMsMHhDMiwweEM1LDB4NTksMHg5RSwweDAyLDB4QTcsMHhDQiwweDgyLDB4QTcsMHg5OCwweDMzLAorCQkweDJELDB4ODksMHhDNCwweDg5LDB4NDYsMHg4NiwweEFGLDB4MUMsMHhEQywweEI4LDB4NTIsMHhEMSwKKwkJMHgwNiwweDJELDB4OTQsMHg5OSwweDY3LDB4NzYsMHhGNSwweEU1LDB4QTMsMHg1RCwweDg3LDB4NUYsCisJCTB4RDEsMHg3NywweDNBLDB4RUEsMHgxNywweDA1LDB4QzksMHg4NywweDlGLDB4MjQsMHg4MiwweEJELAorCQkweERCLDB4MTUsMHgxQywweEJCLAorCQl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMjA0OF9nW109eworCQkweDAyLAorCQl9OworCURIICpkaDsKKworCWlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkaC0+cD1CTl9iaW4yYm4oZGgyMDQ4X3Asc2l6ZW9mKGRoMjA0OF9wKSxOVUxMKTsKKwlkaC0+Zz1CTl9iaW4yYm4oZGgyMDQ4X2csc2l6ZW9mKGRoMjA0OF9nKSxOVUxMKTsKKwlpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKwkJeyBESF9mcmVlKGRoKTsgcmV0dXJuKE5VTEwpOyB9CisJcmV0dXJuKGRoKTsKKwl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19ESCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Vudi5jIGIvc3JjL2Vudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGE5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW52LmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICAgc3R1bm5lbCAgICAgICBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICogICBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gc3R1bm5lbC4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisgKgorICogICBJbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXIgb2Ygc3R1bm5lbAorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yCisgKiAgIGxpYnJhcmllcyB0aGF0IGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIExHUEwgYW5kIHdpdGggY29kZSBpbmNsdWRlZAorICogICBpbiB0aGUgc3RhbmRhcmQgcmVsZWFzZSBvZiBPcGVuU1NMIHVuZGVyIHRoZSBPcGVuU1NMIExpY2Vuc2UgKG9yCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQorICogICBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgZm9yCisgKiAgIHN0dW5uZWwgYW5kIHRoZSBsaWNlbnNlcyBvZiB0aGUgb3RoZXIgY29kZSBjb25jZXJuZWQuCisgKgorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisvKiBnZXRwZWVybmFtZSgpIGNhbid0IGJlIGRlY2xhcmVkIGluIHRoZSBmb2xsb3dpbmcgaW5jbHVkZXMgKi8KKyNkZWZpbmUgZ2V0cGVlcm5hbWUgbm9fZ2V0cGVlcm5hbWUKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IC8qIGZvciBBRl9JTkVUICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAgLyogZm9yIGluZXRfYWRkcigpICovCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBmb3IgZ2V0ZW52KCkgKi8KKyNpZmRlZiBfX0JFT1NfXworI2luY2x1ZGUgPGJlL2JvbmUvYXJwYS9pbmV0Lmg+IC8qIGZvciBBRl9JTkVUICovCisjaW5jbHVkZSA8YmUvYm9uZS9zeXMvc29ja2V0Lmg+IC8qIGZvciBBRl9JTkVUICovCisjZWxzZQorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gLyogZm9yIEFGX0lORVQgKi8KKyNlbmRpZgorI3VuZGVmIGdldHBlZXJuYW1lCisKK2ludCBnZXRwZWVybmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyX2luICpuYW1lLCBpbnQgKmxlbikgeworICAgIGNoYXIgKnZhbHVlOworCisgICAgKHZvaWQpczsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClsZW47IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgbmFtZS0+c2luX2ZhbWlseT1BRl9JTkVUOworICAgIGlmKCh2YWx1ZT1nZXRlbnYoIlJFTU9URV9IT1NUIikpKQorICAgICAgICBuYW1lLT5zaW5fYWRkci5zX2FkZHI9aW5ldF9hZGRyKHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIG5hbWUtPnNpbl9hZGRyLnNfYWRkcj1odG9ubChJTkFERFJfQU5ZKTsKKyAgICBpZigodmFsdWU9Z2V0ZW52KCJSRU1PVEVfUE9SVCIpKSkKKyAgICAgICAgbmFtZS0+c2luX3BvcnQ9aHRvbnMoKHVpbnQxNl90KWF0b2kodmFsdWUpKTsKKyAgICBlbHNlCisgICAgICAgIG5hbWUtPnNpbl9wb3J0PWh0b25zKDApOyAvKiBkeW5hbWljIHBvcnQgYWxsb2NhdGlvbiAqLworICAgIHJldHVybiAwOworfQorCisvKiBlbmQgb2YgZW52LmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9lcnJvci5pY28gYi9zcmMvZXJyb3IuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWJlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXJyb3IuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9ldmMubWFrIGIvc3JjL2V2Yy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmZDdkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ldmMubWFrCkBAIC0wLDAgKzEsMTY3IEBACisjIHdjZS5tYWsgZm9yIHN0dW5uZWwuZXhlIGJ5IE1pY2hhbCBUcm9qbmFyYSAyMDA2LTIwMTIKKyMgd2l0aCBoZWxwIG9mIFBpZXJyZSBEZWxhYWdlIDxkZWxhYWdlLnBpZXJyZUBmcmVlLmZyPgorIyBwZGVsYWFnZSAyMDE0MDYxMCA6IGFkZGVkIFVOSUNPREUgb3B0aW9uYWwgRkxBRywgYWx3YXlzIEFDVElWRSBvbiBXQ0UgYmVjYXVzZSBvZiBwb29yIEFOU0kgc3VwcG9ydAorIyBwZGVsYWFnZSAyMDE0MDYxMCA6IGFkZGVkIF9XSU4zMl9XQ0UgZmxhZyBmb3IgUkMgY29tcGlsYXRpb24sIHRvIHByZXByb2Nlc3Mgb3V0ICJIRUxQIiB1bnN1cHBvcnRlZCBtZW51IGZsYWcgb24gV0NFCisjIHBkZWxhYWdlIDIwMTQwNjEwIDogd3MyIGxpYiBpcyByZXF1aXJlZCB0byBnZXQgV1NBR2V0TGFzdEVycm9yIHJvdXRpbmUgKGFic2VudCBmcm9tIHdpbnNvY2sgbGliKQorIyBwZGVsYWFnZSAyMDE0MDYxMCA6IC9EeDg2IGZsYWcgcmVxdWlyZWQgZm9yIFg4Ni9FbXVsYXRvciB0YXJnZXRzLCB0byBnZXQgcHJvcGVyIGRlZmluaXRpb24gZm9yIEludGVybG9ja2VkRXhjaGFuZ2UKKyMgcGRlbGFhZ2UgMjAxNDA2MTAgOiAvTVQgZmxhZyBpcyBOT04tU0VOU0UgZm9yIFg4Ni1XQ0UgcGxhdGZvcm1zLCBpdCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFg4Ni1XMzItRGVza3RvcC4KKyMgICAgICAgICAgICAgICAgICAgICBmb3IgWDg2LVdDRSB0YXJnZXRzLCBhbHRob3VnaCBjb21waWxlciAiY2wuZXhlIiBpcyBSRUFMTFkgdGhlIHNhbWUgYXMgZGVza3RvcCBXMzIgVlM2IEMrKyBjb21waWxlciwKKyMgICAgICAgICAgICAgICAgICAgICB0aGUgTVQgZmxhZ3MgcmVsYXRpbmcgdG8gTElCQ01UIGlzIHVzZWxlc3MgQkVDQVVTRSBMSUJDTVQgZG9lcyBOT1QgZXhpc3Qgb24gV0NFLiBObyBtc3ZjcnQgb24gV0NFIGVpdGhlci4uLgorCisjIHBkZWxhYWdlIDIwMTQwNjEwIDogIE5vdGUgb24gL01DIGZsYWcgCisjIEZvciBvdGhlciB0YXJnZXRzIHRoYW4gWDg2L0VtdWxhdG9yLCAvTUMgZmxhZyBpcyByZWR1bmRhbnQgd2l0aCAiL25vZGVmYXVsdGxpYiBjb3JlZGxsLmxpYiBjb3JlbGliYy5saWIiIExEIGxpYiBsaXN0LgorIyBGb3IgPDwgWDg2IC8gRW11bGF0b3IgPj4gdGFyZ2V0LCBhcyB0aGUgY2wuZXhlIGNvbXBpbGVyIElTIHRoZSBTQU1FIGFzIHRoZSBzdGFuZGFyZCBWUzYuMCBDKysgY29tcGlsZXIgZm9yIERlc2t0b3AgUGVudGl1bSBwcm9jZXNzb3IsIAorIyAvTUMgZmxhZyBpcyBpbiBmYWN0IE5PVCBleGlzdGluZywgdGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgbGlua2luZyB3aXRoIGNvcmUgbGlicyBieSB1c2luZyA6IAorIyAvTk9ERUZBVUxUTElCIGNvcmVkbGwubGliIGNvcmVsaWJjLmxpYiwKKyMgc29tZXRoaW5nIHRoYXQgaXMgY29ycmVjdCBmb3IgYW55IFdDRSB0YXJnZXQsIFg4NiBhbmQgb3RoZXIsIGFuZCBsZWFkaW5nIC9NQyBmbGFnIHRvIGJlIHVzZWxlc3MgQUxTTyBmb3Igb3RoZXIgdGFyZ2V0IHRoYW4gWDg2LgorCisKKyMKKyMgREVGQVVMVExJQiBtYW5hZ2VtZW50OiBvbmx5IDIgYXJlIG5lY2Vzc2FyeQorIyBkZWZhdWx0bGliUywgYXMgZ2l2ZW4gZm9yIENMeHh4IGluIHRoZSBNUyBkb2MsIEFSRSBXUk9ORworCisjICEhISEhISEhISEhISEhCisjIENVU1RPTUlaRSBUSElTIGFjY29yZGluZyB0byB5b3VyIHdjZWNvbXBhdCBhbmQgb3BlbnNzbCBkaXJlY3RvcmllcworIyAhISEhISEhISEhISEhIQorCisjIE1vZGlmeSB0aGlzIHRvIHBvaW50IHRvIHlvdXIgYWN0dWFsIG9wZW5zc2wgY29tcGlsZSBkaXJlY3RvcnkKKyMgKFlvdSBkaWQgYWxyZWFkeSBjb21waWxlIG9wZW5zc2wsIGRpZG4ndCB5b3U/Pz8pCitTU0xESVI9QzpcVXNlcnNccGRlbGFhZ2VcRHZ0c1xDb250cmliXG9wZW5zc2wKKworIyBOb3RlIHRoYXQgd2UgY3VycmVudGx5IHVzZSBhIG11bHRpLXRhcmdldCBjdXN0b21pemVkIHZlcnNpb24gb2YgbGVnYWN5IEVzc2VtZXIvd2NlY29tcGF0IGxpYgorQ09NUEFURElSPUM6XFVzZXJzXHBkZWxhYWdlXER2dHNcQ29udHJpYlx3Y2Vjb21wYXRcdjEyXHBhdGNoZWQzZW11CisKK1dDRVZFUj00MjAKKworIyAhISEhISEhISEhISEhISEhISEKKyMgRU5EIENVU1RPTUlaQVRJT04KKyMgISEhISEhISEhISEhISEhISEhCisKKyFJRiAiJChUQVJHRVRDUFUpIj09Ilg4NiIKK1dDRVRBUkdFVENQVT1fWDg2XworTERUQVJHRVRDUFU9WDg2CisjcGRlbGFhZ2UgMjAxNDA2MjEgL0R4ODYgZm9yIGlubGluZSBkZWZzIG9mIEludGVybG9ja2VkRXhjaGFuZ2UgaW5saW5lIGluIHdpbmJhc2UuaDsgbm8gbW9yZSAvTVQKK01PUkVDRkxBR1M9L0R4ODYKKworIyBUT0RPOiBjb250aW51ZSBsaXN0IGZvciBvdGhlciB0YXJnZXRzIDogc2VlIHdjZWNvbXBhdC93Y2VkZWZzLm1hayBmb3IgYSBnb29kIHJlZi4KKyMgc2VlIGFsc28gb3BlbnNzbC91dGlsL3BsL3ZjLTMyLnBsLCBhbHNvIGxpbmsgLz8KKyMgZm9yIExEVEFSR0VUQ1BVOiAvTUFDSElORTp7QU0zM3xBUk18SUE2NHxNMzJSfE1JUFN8TUlQUzE2fE1JUFNGUFV8TUlQU0ZQVTE2fE1JUFNSNDFYWHxTSDN8U0gzRFNQfFNINHxTSDV8VEhVTUJ8WDg2fQorIyBzZWUgd2NlL2luY2x1ZGUvd2lubnQuaCBmb3Igb3RoZXIgInRhcmdldCBhcmNoaXRlY3R1cmUiIGZsYWcKKworIUVMU0VJRiAiJChUQVJHRVRDUFUpIj09ImVtdWxhdG9yIgorV0NFVEFSR0VUQ1BVPV9YODZfCitMRFRBUkdFVENQVT1YODYKKyNwZGVsYWFnZSAyMDE0MDYyMSAvRHg4NiBmb3IgaW5saW5lIGRlZnMgb2YgSW50ZXJsb2NrZWRFeGNoYW5nZSBpbmxpbmUgaW4gd2luYmFzZS5oOyBubyBtb3JlIC9NVAorTU9SRUNGTEFHUz0vRHg4NgorCishRUxTRUlGICIkKFRBUkdFVENQVSkiPT0iTUlQUzE2IiB8fCAiJChUQVJHRVRDUFUpIj09Ik1JUFNJSSIgfHwgIiQoVEFSR0VUQ1BVKSI9PSJNSVBTSUlfRlAiIHx8ICIkKFRBUkdFVENQVSkiPT0iTUlQU0lWIiB8fCAiJChUQVJHRVRDUFUpIj09Ik1JUFNJVl9GUCIKK1dDRVRBUkdFVENQVT1fTUlQU18KK0xEVEFSR0VUQ1BVPU1JUFMKKyNwZGVsYWFnZSAyMDE0MDYyMSAgbm8gbW9yZSAvTUMgcmVxdWlyZWQKK01PUkVDRkxBR1M9L0RNSVBTCisKKyFFTFNFSUYgIiQoVEFSR0VUQ1BVKSI9PSJTSDMiIHx8ICIkKFRBUkdFVENQVSkiPT0iU0g0IgorV0NFVEFSR0VUQ1BVPVNIeAorTERUQVJHRVRDUFU9JChUQVJHRVRDUFUpCisjcGRlbGFhZ2UgMjAxNDA2MjEgIG5vIG1vcmUgL01DIHJlcXVpcmVkCitNT1JFQ0ZMQUdTPQorCishRUxTRQorIyBkZWZhdWx0IGlzIEFSTSAhCisjICFJRiAiJChUQVJHRVRDUFUpIj09IkFSTVY0IiB8fCAiJChUQVJHRVRDUFUpIj09IkFSTVY0SSIgfHwgIiQoVEFSR0VUQ1BVKSI9PSJBUk1WNFQiCisjIHRoZSBmb2xsb3dpbmcgZmxhZyBpcyByZXF1aXJlZCBieSAoZWcpIHdpbm50LmgsIGFuZCBpcyBkaWZmZXJlbnQgZnJvbSB0YXJnZXRjcHUgKGFybVY0KQorV0NFVEFSR0VUQ1BVPUFSTQorTERUQVJHRVRDUFU9QVJNCisjcGRlbGFhZ2UgMjAxNDA2MjEgIG5vIG1vcmUgL01DIHJlcXVpcmVkCitNT1JFQ0ZMQUdTPQorIUVORElGCisKKyMgY2V1dGlsc2RpciBwcm9iYWJseSB1c2VsZXNzIChuYiA6IHdlcmUgdG9vbHMgZnJvbSBlc3NlbWVyOyBidXQgbXMgZGVsaXZlcnMgYSBjZWNvcHkgYW55d2F5LCBzZWUgbXMgZGxkIHNpdGUpCitDRVVUSUxTRElSPS4uXC4uXGNldXRpbHMKKyMgImNlOiIgaXMgbm90IGEgY29ycmVjdCBsb2NhdGlvbiAsIGJ1dCB3ZSBuZXZlciAibWFrZSBpbnN0YWxsIgorRFNURElSPWNlOlxzdHVubmVsCisjIHVzZSBNUyBlbnYgdmFycywgYXMgaW4gd2NlY29tcGF0IGFuZCBvcGVuc3NsIG1ha2VmaWxlcworU0RLRElSPSQoU0RLUk9PVClcJChPU1ZFUlNJT04pXCQoUExBVEZPUk0pCitJTkNMVURFUz0tSSQoU1NMRElSKVxpbmMzMiAtSSQoQ09NUEFURElSKVxpbmNsdWRlIC1JIiQoU0RLRElSKVxpbmNsdWRlXCQoVEFSR0VUQ1BVKSIKKyMgZm9yIFg4NiBhbmQgb3RoZXIgaXQgYXBwZWFycyB0aGF0IC9NQyBvciAvTUwgZmxhZ3MgYXJlIGFic3VyZCwKKyMgd2UgYWx3YXlzIGhhdmUgdG8gb3ZlcnJpZGUgcnVudGltZSBsaWIgbGlzdCB0byBjb3JlZGxsIGFuZCBjb3JlbGliYworI0xJQlM9L05PREVGQVVMVExJQiB3aW5zb2NrLmxpYiB3Y2Vjb21wYXRleC5saWIgbGliZWF5MzIubGliIHNzbGVheTMyLmxpYiBjb3JlZGxsLmxpYiBjb3JlbGliYy5saWIKK0xJQlM9L05PREVGQVVMVExJQiB3czIubGliICAgICAgd2NlY29tcGF0ZXgubGliIGxpYmVheTMyLmxpYiBzc2xlYXkzMi5saWIgY29yZWRsbC5saWIgY29yZWxpYmMubGliCisKK0RFRklORVM9L0RIT1NUPVwiJChUQVJHRVRDUFUpLVdDRS1lVkMtJChXQ0VWRVIpXCIKKyMgcGRlbGFhZ2UgMjAxNDA2MTAgYWRkZWQgdW5pY29kZSBmbGFnIDogQUxXQVlTIEFDVElWRSBvbiBXQ0UsIGJlY2F1c2Ugb2YgcG9vciBBTlNJIHN1cHBvcnQgYnkgdGhlIE1TIFNESworVU5JQ09ERUZMQUdTPS9EVU5JQ09ERSAtRF9VTklDT0RFCisjIC9PMSAvT2kgbW9yZSBjb3JyZWN0IHZzIE1TIGRvYworQ0ZMQUdTPS9ub2xvZ28gJChNT1JFQ0ZMQUdTKSAvTzEgL09pIC9XMyAvV1ggL0dGIC9HeSAkKERFRklORVMpIC9EJChXQ0VUQVJHRVRDUFUpIC9EJChUQVJHRVRDUFUpIC9EVU5ERVJfQ0U9JChXQ0VWRVIpIC9EX1dJTjMyX1dDRT0kKFdDRVZFUikgJChVTklDT0RFRkxBR1MpICQoSU5DTFVERVMpCisjIHBkZWxhYWdlIDIwMTQwNjEwIDogUkMgY29tcGlsYXRpb24gcmVxdWlyZXMgRF9XSU4zMl9XQ0UgZmxhZyB0byBjb21tZW50IG91dCB1bnN1cHBvcnRlZCAiSEVMUCIgZmxhZyBpbiBtZW51IGRlZmluaXRpb24sIGluIHJlc291cmNlcy5yYyBmaWxlCitSRkxBR1M9JChERUZJTkVTKSAvRF9XSU4zMl9XQ0U9JChXQ0VWRVIpICQoSU5DTFVERVMpCisKKyMgTERGTEFHUzogc2luY2Ugb3BlbnNzbCA+PiAwOThhIChlZyAwOThoKSBvdXQzMmRsbCBpcyBvdXQzMmRsbF90YXJnZXRDUFUgZm9yIFdDRQorIyBkZWxhYWdlIGFkZGVkICQoVEFSR0VUQ1BVKSBpbiBsZWdhY3kgRXNzZW1lci93Y2Vjb21wYXQgbGlicGF0aAorIyB0byBlYXNlIG11bHRpdGFyZ2V0IGNvbXBpbGF0aW9uIHdpdGhvdXQgcmVjb21waWxpbmcgZXZlcnl0aGluZworIyB0aGlzIGN1c3RvbWl6ZWQgdmVyc2lvbiBpcyBhdmFpbGFibGUgb246CisjIGh0dHA6Ly9kZWxhYWdlLnBpZXJyZS5mcmVlLmZyL2NvbnRyaWIvd2NlY29tcGF0L3djZWNvbXBhdDEyX3BhdGNoZWQuemlwCisKK0xERkxBR1M9L25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3NjZSwzLjAwIC9tYWNoaW5lOiQoTERUQVJHRVRDUFUpIC9saWJwYXRoOiIkKFNES0RJUilcbGliXCQoVEFSR0VUQ1BVKSIgL2xpYnBhdGg6IiQoQ09NUEFURElSKVxsaWJcJChUQVJHRVRDUFUpIiAvbGlicGF0aDoiJChTU0xESVIpXG91dDMyZGxsXyQoVEFSR0VUQ1BVKSIKKworIyBNdWx0aS10YXJnZXQgc3VwcG9ydCBmb3Igc3R1bm5lbAorCitTUkM9Li5cc3JjCitPQkpST09UPS4uXG9iagorT0JKPSQoT0JKUk9PVClcJChUQVJHRVRDUFUpCitCSU5ST09UPS4uXGJpbgorQklOPSQoQklOUk9PVClcJChUQVJHRVRDUFUpCisKK09CSlM9JChPQkopXHN0dW5uZWwub2JqICQoT0JKKVxzc2wub2JqICQoT0JKKVxjdHgub2JqICQoT0JKKVx2ZXJpZnkub2JqIFwKKwkkKE9CSilcZmlsZS5vYmogJChPQkopXGNsaWVudC5vYmogJChPQkopXHByb3RvY29sLm9iaiAkKE9CSilcc3RocmVhZHMub2JqIFwKKwkkKE9CSilcbG9nLm9iaiAkKE9CSilcb3B0aW9ucy5vYmogJChPQkopXG5ldHdvcmsub2JqICQoT0JKKVxyZXNvbHZlci5vYmogXAorCSQoT0JKKVxzdHIub2JqICQoT0JKKVx0bHMub2JqICQoT0JKKVxmZC5vYmogJChPQkopXGRocGFyYW0ub2JqIFwKKwkkKE9CSilcY3Jvbi5vYmoKKworR1VJT0JKUz0kKE9CSilcdWlfd2luX2d1aS5vYmogJChPQkopXHJlc291cmNlcy5yZXMKK0NMSU9CSlM9JChPQkopXHVpX3dpbl9jbGkub2JqCisKK3skKFNSQylcfS5jeyQoT0JKKVx9Lm9iajoKKwkkKENDKSAkKENGTEFHUykgLUZvJEAgLWMgJDwKKworeyQoU1JDKVx9LmNwcHskKE9CSilcfS5vYmo6CisJJChDQykgJChDRkxBR1MpIC1GbyRAIC1jICQ8CisJCit7JChTUkMpXH0ucmN7JChPQkopXH0ucmVzOgorCSQoUkMpICQoUkZMQUdTKSAtZm8kQCAtciAkPAorCithbGw6IG1ha2VkaXJzICQoQklOKVxzdHVubmVsLmV4ZSAkKEJJTilcdHN0dW5uZWwuZXhlCisKK21ha2VkaXJzOgorCS1AIElGIE5PVCBFWElTVCAkKE9CSlJPT1QpIG1rZGlyICQoT0JKUk9PVCkgPk5VTCAyPiYxCisJLUAgSUYgTk9UIEVYSVNUICQoT0JKKSBta2RpciAkKE9CSikgPk5VTCAyPiYxCisJLUAgSUYgTk9UIEVYSVNUICQoQklOUk9PVCkgbWtkaXIgJChCSU5ST09UKSA+TlVMIDI+JjEKKwktQCBJRiBOT1QgRVhJU1QgJChCSU4pIG1rZGlyICQoQklOKSA+TlVMIDI+JjEKKworJChCSU4pXHN0dW5uZWwuZXhlOiQoT0JKUykgJChHVUlPQkpTKQorCWxpbmsgJChMREZMQUdTKSAgL291dDokKEJJTilcc3R1bm5lbC5leGUgJChMSUJTKSBjb21tY3RybC5saWIgJCoqCisKKyQoQklOKVx0c3R1bm5lbC5leGU6JChPQkpTKSAkKENMSU9CSlMpCisJbGluayAkKExERkxBR1MpICAvb3V0OiQoQklOKVx0c3R1bm5lbC5leGUgJChMSUJTKSAkKioKKworJChPQkopXHJlc291cmNlcy5yZXM6ICQoU1JDKVxyZXNvdXJjZXMucmMgJChTUkMpXHJlc291cmNlcy5oICQoU1JDKVx2ZXJzaW9uLmgKKyQoT0JKKVx1aV93aW5fZ3VpLm9iajogJChTUkMpXHVpX3dpbl9ndWkuYyAkKFNSQylcdmVyc2lvbi5oCiskKE9CSilcc3R1bm5lbC5vYmo6ICQoU1JDKVxzdHVubmVsLmMgJChTUkMpXHZlcnNpb24uaAorCisjIG5vdyBsaXN0IG9mIG9wZW5zc2wgZGxsIGhhcyBtb3JlIGZpbGVzLAorIyBidXQgd2UgZG8gbm90IHVzZSAibWFrZSBpbnN0YWxsIiBmb3Igc3R1bm5lbAorIyBjZXV0aWxzIGNvbWUgZnJvbSBlc3NlbWVyL3djZWNvbXBhdCB3ZWJzaXRlCisjIHNvbWUgdG9vbHMgY2FuIGJlIGZvdW5kIGF0IE1TIHdlYnNpdGUKKyMgVE9ETzogdXBkYXRlIGFsbCB0aGlzIGNldXRpbHMgc3R1ZmYsIG9yIHN1cHByZXNzIGl0CisKK2luc3RhbGw6IHN0dW5uZWwuZXhlIHRzdHVubmVsLmV4ZQorCSQoQ0VVVElMU0RJUilcY2Vta2RpciAkKERTVERJUikgfHwgZWNobyBEaXJlY3RvcnkgZXhpc3RzPworCSQoQ0VVVElMU0RJUilcY2Vjb3B5IHN0dW5uZWwuZXhlICQoRFNURElSKQorCSQoQ0VVVElMU0RJUilcY2Vjb3B5IHRzdHVubmVsLmV4ZSAkKERTVERJUikKKwkkKENFVVRJTFNESVIpXGNlY29weSAkKFNTTERJUilcb3V0MzJkbGxfJChUQVJHRVRDUFUpXGxpYmVheTMyLmRsbCAkKERTVERJUikKKwkkKENFVVRJTFNESVIpXGNlY29weSAkKFNTTERJUilcb3V0MzJkbGxfJChUQVJHRVRDUFUpXHNzbGVheTMyLmRsbCAkKERTVERJUikKKworY2xlYW46CisJLUAgSUYgTk9UICIkKFRBUkdFVENQVSkiPT0iIiBkZWwgJChPQkpTKSAkKEdVSU9CSlMpICQoQ0xJT0JKUykgJChCSU4pXHN0dW5uZWwuZXhlICQoQklOKVx0c3R1bm5lbC5leGUgPk5VTCAyPiYxCisJLUAgSUYgTk9UICIkKFRBUkdFVENQVSkiPT0iIiBybWRpciAkKE9CSikgPk5VTCAyPiYxCisJLUAgSUYgTk9UICIkKFRBUkdFVENQVSkiPT0iIiBybWRpciAkKEJJTikgPk5VTCAyPiYxCmRpZmYgLS1naXQgYS9zcmMvZmQuYyBiL3NyYy9mZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDIwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmQuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqICAgc3R1bm5lbCAgICAgICBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICogICBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gc3R1bm5lbC4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisgKgorICogICBJbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXIgb2Ygc3R1bm5lbAorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yCisgKiAgIGxpYnJhcmllcyB0aGF0IGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIExHUEwgYW5kIHdpdGggY29kZSBpbmNsdWRlZAorICogICBpbiB0aGUgc3RhbmRhcmQgcmVsZWFzZSBvZiBPcGVuU1NMIHVuZGVyIHRoZSBPcGVuU1NMIExpY2Vuc2UgKG9yCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQorICogICBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgZm9yCisgKiAgIHN0dW5uZWwgYW5kIHRoZSBsaWNlbnNlcyBvZiB0aGUgb3RoZXIgY29kZSBjb25jZXJuZWQuCisgKgorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgorCisjaWYgZGVmaW5lZCBIQVZFX1BJUEUyICYmIGRlZmluZWQgSEFWRV9BQ0NFUFQ0CisjZGVmaW5lIFVTRV9ORVdfTElOVVhfQVBJIDEKKyNlbmRpZgorCisvKiB0cnkgdG8gdXNlIG5vbi1QT1NJWCBPX05ERUxBWSBvbiBvYnNvbGV0ZSBCU0Qgc3lzdGVtcyAqLworI2lmICFkZWZpbmVkIE9fTk9OQkxPQ0sgJiYgZGVmaW5lZCBPX05ERUxBWQorI2RlZmluZSBPX05PTkJMT0NLIE9fTkRFTEFZCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyAqLworCitOT0VYUE9SVCBTT0NLRVQgc2V0dXBfZmQoU09DS0VULCBpbnQsIGNoYXIgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGludGVybmFsIGxpbWl0IG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KKworI2lmbmRlZiBVU0VfRk9SSworCitzdGF0aWMgU09DS0VUIG1heF9mZHM7CisKK3ZvaWQgZ2V0X2xpbWl0cyh2b2lkKSB7IC8qIHNldCBtYXhfZmRzIGFuZCBtYXhfY2xpZW50cyAqLworICAgIC8qIHN0YXJ0IHdpdGggY3VycmVudCB1bGltaXQgKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1lTQ09ORikKKyAgICBlcnJubz0wOworICAgIG1heF9mZHM9KFNPQ0tFVClzeXNjb25mKF9TQ19PUEVOX01BWCk7CisgICAgaWYoZXJybm8pCisgICAgICAgIGlvZXJyb3IoInN5c2NvbmYiKTsKKyAgICBpZihtYXhfZmRzPDApCisgICAgICAgIG1heF9mZHM9MDsgLyogdW5saW1pdGVkICovCisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUkxJTUlUKQorICAgIHN0cnVjdCBybGltaXQgcmxpbTsKKworICAgIGlmKGdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxpbSk8MCkgeworICAgICAgICBpb2Vycm9yKCJnZXRybGltaXQiKTsKKyAgICAgICAgbWF4X2Zkcz0wOyAvKiB1bmxpbWl0ZWQgKi8KKyAgICB9IGVsc2UKKyAgICAgICAgbWF4X2Zkcz1ybGltLnJsaW1fY3VyIT1STElNX0lORklOSVRZID8gcmxpbS5ybGltX2N1ciA6IDA7CisjZWxzZQorICAgIG1heF9mZHM9MDsgLyogdW5saW1pdGVkICovCisjZW5kaWYgLyogSEFWRV9TWVNDT05GIHx8IEhBVkVfR0VUUkxJTUlUICovCisKKyNpZiAhZGVmaW5lZChVU0VfV0lOMzIpICYmICFkZWZpbmVkKFVTRV9QT0xMKSAmJiAhZGVmaW5lZChfX0lOTk9URUtfTElCQ19fKQorICAgIC8qIGFwcGx5IEZEX1NFVFNJWkUgaWYgc2VsZWN0KCkgaXMgdXNlZCBvbiBVbml4ICovCisgICAgaWYoIW1heF9mZHMgfHwgbWF4X2Zkcz5GRF9TRVRTSVpFKQorICAgICAgICBtYXhfZmRzPUZEX1NFVFNJWkU7IC8qIHN0YXJ0IHdpdGggc2VsZWN0KCkgbGltaXQgKi8KKyNlbmRpZiAvKiBzZWxlY3QoKSBvbiBVbml4ICovCisKKyAgICAvKiBzdHVubmVsIG5lZWRzIGF0IGxlYXN0IDE2IGZpbGUgZGVzcmlwdG9ycyAqLworICAgIGlmKG1heF9mZHMgJiYgbWF4X2ZkczwxNikKKyAgICAgICAgbWF4X2Zkcz0xNjsKKworICAgIGlmKG1heF9mZHMpIHsKKyAgICAgICAgbWF4X2NsaWVudHM9KGxvbmcpKG1heF9mZHM+PTI1NiA/IG1heF9mZHMqMTI1LzI1NiA6IChtYXhfZmRzLTYpLzIpOworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJDbGllbnRzIGFsbG93ZWQ9JWxkIiwgbWF4X2NsaWVudHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1heF9jbGllbnRzPTA7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIk5vIGxpbWl0IGRldGVjdGVkIGZvciB0aGUgbnVtYmVyIG9mIGNsaWVudHMiKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBmaWxlIGRlc2NyaXB0b3IgdmFsaWRhdGlvbiAqLworCitTT0NLRVQgc19zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgaW50IG5vbmJsb2NrLCBjaGFyICptc2cpIHsKKyAgICBTT0NLRVQgZmQ7CisKKyNpZmRlZiBVU0VfTkVXX0xJTlVYX0FQSQorICAgIGlmKG5vbmJsb2NrKQorICAgICAgICB0eXBlfD1TT0NLX05PTkJMT0NLOworICAgIHR5cGV8PVNPQ0tfQ0xPRVhFQzsKKyNlbmRpZgorI2lmZGVmIFVTRV9XSU4zMgorICAgIC8qIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk5MzExOSAqLworICAgIC8qIENyZWF0ZVByb2Nlc3MoKSBuZWVkcyBhIG5vbi1vdmVybGFwcGVkIGhhbmRsZSAqLworICAgIGZkPVdTQVNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sLCBOVUxMLCAwLCAwKTsKKyNlbHNlIC8qIFVTRV9XSU4zMiAqLworICAgIGZkPXNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKyAgICByZXR1cm4gc2V0dXBfZmQoZmQsIG5vbmJsb2NrLCBtc2cpOworfQorCitTT0NLRVQgc19hY2NlcHQoU09DS0VUIHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4sCisgICAgICAgIGludCBub25ibG9jaywgY2hhciAqbXNnKSB7CisgICAgU09DS0VUIGZkOworCisjaWZkZWYgVVNFX05FV19MSU5VWF9BUEkKKyAgICBpZihub25ibG9jaykKKyAgICAgICAgZmQ9YWNjZXB0NChzb2NrZmQsIGFkZHIsIGFkZHJsZW4sIFNPQ0tfTk9OQkxPQ0t8U09DS19DTE9FWEVDKTsKKyAgICBlbHNlCisgICAgICAgIGZkPWFjY2VwdDQoc29ja2ZkLCBhZGRyLCBhZGRybGVuLCBTT0NLX0NMT0VYRUMpOworI2Vsc2UKKyAgICBmZD1hY2NlcHQoc29ja2ZkLCBhZGRyLCBhZGRybGVuKTsKKyNlbmRpZgorICAgIHJldHVybiBzZXR1cF9mZChmZCwgbm9uYmxvY2ssIG1zZyk7Cit9CisKKyNpZm5kZWYgVVNFX1dJTjMyCisKK2ludCBzX3NvY2tldHBhaXIoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgU09DS0VUIHN2WzJdLAorICAgICAgICBpbnQgbm9uYmxvY2ssIGNoYXIgKm1zZykgeworI2lmZGVmIFVTRV9ORVdfTElOVVhfQVBJCisgICAgaWYobm9uYmxvY2spCisgICAgICAgIHR5cGV8PVNPQ0tfTk9OQkxPQ0s7CisgICAgdHlwZXw9U09DS19DTE9FWEVDOworI2VuZGlmCisgICAgaWYoc29ja2V0cGFpcihkb21haW4sIHR5cGUsIHByb3RvY29sLCBzdik8MCkgeworICAgICAgICBpb2Vycm9yKG1zZyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoc2V0dXBfZmQoc3ZbMF0sIG5vbmJsb2NrLCBtc2cpPDApIHsKKyAgICAgICAgY2xvc2Vzb2NrZXQoc3ZbMV0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKHNldHVwX2ZkKHN2WzFdLCBub25ibG9jaywgbXNnKTwwKSB7CisgICAgICAgIGNsb3Nlc29ja2V0KHN2WzBdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IHNfcGlwZShpbnQgcGlwZWZkWzJdLCBpbnQgbm9uYmxvY2ssIGNoYXIgKm1zZykgeworICAgIGludCByZXR2YWw7CisKKyNpZmRlZiBVU0VfTkVXX0xJTlVYX0FQSQorICAgIGlmKG5vbmJsb2NrKQorICAgICAgICByZXR2YWw9cGlwZTIocGlwZWZkLCBPX05PTkJMT0NLfE9fQ0xPRVhFQyk7CisgICAgZWxzZQorICAgICAgICByZXR2YWw9cGlwZTIocGlwZWZkLCBPX0NMT0VYRUMpOworI2Vsc2UKKyAgICByZXR2YWw9cGlwZShwaXBlZmQpOworI2VuZGlmCisgICAgaWYocmV0dmFsPDApIHsKKyAgICAgICAgaW9lcnJvcihtc2cpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKHNldHVwX2ZkKHBpcGVmZFswXSwgbm9uYmxvY2ssIG1zZyk8MCkgeworICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKHNldHVwX2ZkKHBpcGVmZFsxXSwgbm9uYmxvY2ssIG1zZyk8MCkgeworICAgICAgICBjbG9zZShwaXBlZmRbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVVNFX1dJTjMyICovCisKK05PRVhQT1JUIFNPQ0tFVCBzZXR1cF9mZChTT0NLRVQgZmQsIGludCBub25ibG9jaywgY2hhciAqbXNnKSB7CisjaWYgIWRlZmluZWQgVVNFX05FV19MSU5VWF9BUEkgJiYgZGVmaW5lZCBGRF9DTE9FWEVDCisgICAgaW50IGVycjsKKyNlbmRpZgorCisgICAgaWYoZmQ9PUlOVkFMSURfU09DS0VUKSB7CisgICAgICAgIHNvY2tlcnJvcihtc2cpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorI2lmbmRlZiBVU0VfRk9SSworICAgIGlmKG1heF9mZHMgJiYgZmQ+PW1heF9mZHMpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIiVzOiBGRD0lZCBvdXQgb2YgcmFuZ2UgKG1heCAlZCkiLAorICAgICAgICAgICAgbXNnLCAoaW50KWZkLCAoaW50KW1heF9mZHMpOworICAgICAgICBjbG9zZXNvY2tldChmZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX1NPQ0tFVDsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFVTRV9ORVdfTElOVVhfQVBJCisgICAgKHZvaWQpbm9uYmxvY2s7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisjZWxzZSAvKiBzZXQgT19OT05CTE9DSyBhbmQgRl9TRVRGRCAqLworICAgIHNldF9ub25ibG9jayhmZCwgKHVuc2lnbmVkIGxvbmcpbm9uYmxvY2spOworI2lmZGVmIEZEX0NMT0VYRUMKKyAgICBkbyB7CisgICAgICAgIGVycj1mY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisgICAgfSB3aGlsZShlcnI8MCAmJiBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKT09U19FSU5UUik7CisgICAgaWYoZXJyPDApCisgICAgICAgIHNvY2tlcnJvcigiZmNudGwgU0VURkQiKTsgLyogbm9uLWNyaXRpY2FsICovCisjZW5kaWYgLyogRkRfQ0xPRVhFQyAqLworI2VuZGlmIC8qIFVTRV9ORVdfTElOVVhfQVBJICovCisKKyNpZmRlZiBERUJVR19GRF9BTExPQworICAgIHNfbG9nKExPR19ERUJVRywgIiVzOiBGRD0lZCBhbGxvY2F0ZWQgKCVzYmxvY2tpbmcgbW9kZSkiLAorICAgICAgICBtc2csIGZkLCBub25ibG9jaz8ibm9uLSI6IiIpOworI2VuZGlmIC8qIERFQlVHX0ZEX0FMTE9DICovCisKKyAgICByZXR1cm4gZmQ7Cit9CisKK3ZvaWQgc2V0X25vbmJsb2NrKFNPQ0tFVCBmZCwgdW5zaWduZWQgbG9uZyBub25ibG9jaykgeworI2lmIGRlZmluZWQgRl9HRVRGTCAmJiBkZWZpbmVkIEZfU0VURkwgJiYgZGVmaW5lZCBPX05PTkJMT0NLICYmICFkZWZpbmVkIF9fSU5OT1RFS19MSUJDX18KKyAgICBpbnQgZXJyLCBmbGFnczsKKworICAgIGRvIHsKKyAgICAgICAgZmxhZ3M9ZmNudGwoZmQsIEZfR0VURkwsIDApOworICAgIH0gd2hpbGUoZmxhZ3M8MCAmJiBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKT09U19FSU5UUik7CisgICAgaWYoZmxhZ3M8MCkgeworICAgICAgICBzb2NrZXJyb3IoImZjbnRsIEdFVEZMIik7IC8qIG5vbi1jcml0aWNhbCAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKG5vbmJsb2NrKQorICAgICAgICBmbGFnc3w9T19OT05CTE9DSzsKKyAgICBlbHNlCisgICAgICAgIGZsYWdzJj1+T19OT05CTE9DSzsKKyAgICBkbyB7CisgICAgICAgIGVycj1mY250bChmZCwgRl9TRVRGTCwgZmxhZ3MpOworICAgIH0gd2hpbGUoZXJyPDAgJiYgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk9PVNfRUlOVFIpOworICAgIGlmKGVycjwwKQorICAgICAgICBzb2NrZXJyb3IoImZjbnRsIFNFVEZMIik7IC8qIG5vbi1jcml0aWNhbCAqLworI2Vsc2UgLyogV0lOMzIgb3Igc2ltaWxhciAqLworICAgIGlmKGlvY3Rsc29ja2V0KGZkLCAobG9uZylGSU9OQklPLCAmbm9uYmxvY2spPDApCisgICAgICAgIHNvY2tlcnJvcigiaW9jdGxzb2NrZXQiKTsgLyogbm9uLWNyaXRpY2FsICovCisjaWYgMAorICAgIGVsc2UKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU29ja2V0ICVkIHNldCB0byAlcyBtb2RlIiwKKyAgICAgICAgICAgIGZkLCBub25ibG9jayA/ICJub24tYmxvY2tpbmciIDogImJsb2NraW5nIik7CisjZW5kaWYKKyNlbmRpZgorfQorCisvKiBlbmQgb2YgZmQuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2ZpbGUuYyBiL3NyYy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwODlmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9maWxlLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworI2lmZGVmIFVTRV9XSU4zMgorCitESVNLX0ZJTEUgKmZpbGVfb3BlbihjaGFyICpuYW1lLCBGSUxFX01PREUgbW9kZSkgeworICAgIERJU0tfRklMRSAqZGY7CisgICAgTFBUU1RSIHRuYW1lOworICAgIEhBTkRMRSBmaDsKKyAgICBEV09SRCBkZXNpcmVkX2FjY2VzcywgY3JlYXRpb25fZGlzcG9zaXRpb247CisKKyAgICAvKiBvcGVuIGZpbGUgKi8KKyAgICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgRklMRV9NT0RFX1JFQUQ6CisgICAgICAgIGRlc2lyZWRfYWNjZXNzPUdFTkVSSUNfUkVBRDsKKyAgICAgICAgY3JlYXRpb25fZGlzcG9zaXRpb249T1BFTl9FWElTVElORzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUxFX01PREVfQVBQRU5EOgorICAgICAgICAgICAgLyogcmVwb3J0ZWRseSBtb3JlIGNvbXBhdGlibGUgdGhhbiBGSUxFX0FQUEVORF9EQVRBICovCisgICAgICAgIGRlc2lyZWRfYWNjZXNzPUdFTkVSSUNfV1JJVEU7CisgICAgICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uPU9QRU5fQUxXQVlTOyAvKiBrZWVwIHRoZSBkYXRhICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRklMRV9NT0RFX09WRVJXUklURToKKyAgICAgICAgZGVzaXJlZF9hY2Nlc3M9R0VORVJJQ19XUklURTsKKyAgICAgICAgY3JlYXRpb25fZGlzcG9zaXRpb249Q1JFQVRFX0FMV0FZUzsgLyogcmVtb3ZlIHRoZSBkYXRhICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8qIGludmFsaWQgbW9kZSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG5hbWU9c3RyMnRzdHIobmFtZSk7CisgICAgZmg9Q3JlYXRlRmlsZSh0bmFtZSwgZGVzaXJlZF9hY2Nlc3MsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKyAgICAgICAgY3JlYXRpb25fZGlzcG9zaXRpb24sIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgKEhBTkRMRSlOVUxMKTsKKyAgICBzdHJfZnJlZSh0bmFtZSk7IC8qIHN0cl9mcmVlKCkgb3ZlcndyaXRlcyBHZXRMYXN0RXJyb3IoKSB2YWx1ZSAqLworICAgIGlmKGZoPT1JTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYobW9kZT09RklMRV9NT0RFX0FQUEVORCkgLyogd29ya2Fyb3VuZCBmb3IgRklMRV9BUFBFTkRfREFUQSAqLworICAgICAgICBTZXRGaWxlUG9pbnRlcihmaCwgMCwgTlVMTCwgRklMRV9FTkQpOworCisgICAgLyogc2V0dXAgZGYgc3RydWN0dXJlICovCisgICAgZGY9c3RyX2FsbG9jKHNpemVvZiBkZik7CisgICAgZGYtPmZoPWZoOworICAgIHJldHVybiBkZjsKK30KKworI2Vsc2UgLyogVVNFX1dJTjMyICovCisKK0RJU0tfRklMRSAqZmlsZV9mZG9wZW4oaW50IGZkKSB7CisgICAgRElTS19GSUxFICpkZjsKKworICAgIGRmPXN0cl9hbGxvYyhzaXplb2YoRElTS19GSUxFKSk7CisgICAgZGYtPmZkPWZkOworICAgIHJldHVybiBkZjsKK30KKworRElTS19GSUxFICpmaWxlX29wZW4oY2hhciAqbmFtZSwgRklMRV9NT0RFIG1vZGUpIHsKKyAgICBESVNLX0ZJTEUgKmRmOworICAgIGludCBmZCwgZmxhZ3M7CisKKyAgICAvKiBvcGVuIGZpbGUgKi8KKyAgICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgRklMRV9NT0RFX1JFQUQ6CisgICAgICAgIGZsYWdzPU9fUkRPTkxZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZJTEVfTU9ERV9BUFBFTkQ6CisgICAgICAgIGZsYWdzPU9fQ1JFQVR8T19XUk9OTFl8T19BUFBFTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRklMRV9NT0RFX09WRVJXUklURToKKyAgICAgICAgZmxhZ3M9T19DUkVBVHxPX1dST05MWXxPX1RSVU5DOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvKiBpbnZhbGlkIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2lmZGVmIE9fTk9OQkxPQ0sKKyAgICBmbGFnc3w9T19OT05CTE9DSzsKKyNlbGlmIGRlZmluZWQgT19OREVMQVkKKyAgICBmbGFnc3w9T19OREVMQVk7CisjZW5kaWYKKyNpZmRlZiBPX0NMT0VYRUMKKyAgICBmbGFnc3w9T19DTE9FWEVDOworI2VuZGlmIC8qIE9fQ0xPRVhFQyAqLworICAgIGZkPW9wZW4obmFtZSwgZmxhZ3MsIDA2NDApOworICAgIGlmKGZkPT1JTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBzZXR1cCBkZiBzdHJ1Y3R1cmUgKi8KKyAgICBkZj1zdHJfYWxsb2Moc2l6ZW9mIGRmKTsKKyAgICBkZi0+ZmQ9ZmQ7CisgICAgcmV0dXJuIGRmOworfQorCisjZW5kaWYgLyogVVNFX1dJTjMyICovCisKK3ZvaWQgZmlsZV9jbG9zZShESVNLX0ZJTEUgKmRmKSB7CisgICAgaWYoIWRmKSAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybjsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBDbG9zZUhhbmRsZShkZi0+ZmgpOworI2Vsc2UgLyogVVNFX1dJTjMyICovCisgICAgaWYoZGYtPmZkPjIpIC8qIG5ldmVyIGNsb3NlIHN0ZGluL3N0ZG91dC9zdGRlciAqLworICAgICAgICBjbG9zZShkZi0+ZmQpOworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworICAgIHN0cl9mcmVlKGRmKTsKK30KKworc3NpemVfdCBmaWxlX2dldGxpbmUoRElTS19GSUxFICpkZiwgY2hhciAqbGluZSwgaW50IGxlbikgeworICAgIC8qIHRoaXMgdmVyc2lvbiBpcyByZWFsbHkgc2xvdywgYnV0IHBlcmZvcm1hbmNlIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSAqLworICAgIC8qIChubyBidWZmZXJpbmcgaXMgaW1wbGVtZW50ZWQpICovCisgICAgc3NpemVfdCBpOworI2lmZGVmIFVTRV9XSU4zMgorICAgIERXT1JEIG51bTsKKyNlbHNlIC8qIFVTRV9XSU4zMiAqLworICAgIHNzaXplX3QgbnVtOworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCisgICAgaWYoIWRmKSAvKiBub3Qgb3BlbmVkICovCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvcihpPTA7IGk8bGVuLTE7IGkrKykgeworI2lmZGVmIFVTRV9XSU4zMgorICAgICAgICBSZWFkRmlsZShkZi0+ZmgsIGxpbmUraSwgMSwgJm51bSwgTlVMTCk7CisjZWxzZSAvKiBVU0VfV0lOMzIgKi8KKyAgICAgICAgbnVtPXJlYWQoZGYtPmZkLCBsaW5lK2ksIDEpOworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworICAgICAgICBpZihudW0hPTEpIHsgLyogRU9GICovCisgICAgICAgICAgICBpZihpKSAvKiBhbnkgcHJldmlvdXNseSByZXRyaWV2ZWQgZGF0YSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZihsaW5lW2ldPT0nXG4nKSAvKiBMRiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKGxpbmVbaV09PSdccicpIC8qIENSICovCisgICAgICAgICAgICAtLWk7IC8qIGlnbm9yZSAtIGl0IG11c3QgYmUgdGhlIGxhc3QgY2hlY2sgKi8KKyAgICB9CisgICAgbGluZVtpXT0nXDAnOworICAgIHJldHVybiBpOworfQorCitzc2l6ZV90IGZpbGVfcHV0bGluZShESVNLX0ZJTEUgKmRmLCBjaGFyICpsaW5lKSB7CisgICAgY2hhciAqYnVmZjsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBEV09SRCBsZW4sIG51bTsKKyNlbHNlIC8qIFVTRV9XSU4zMiAqLworICAgIHNpemVfdCBsZW47CisgICAgc3NpemVfdCBudW07CisjZW5kaWYgLyogVVNFX1dJTjMyICovCisKKyAgICBsZW49c3RybGVuKGxpbmUpOworICAgIGJ1ZmY9c3RyX2FsbG9jKGxlbisyKTsgLyogKzIgZm9yIENSK0xGICovCisgICAgc3RyY3B5KGJ1ZmYsIGxpbmUpOworI2lmZGVmIFVTRV9XSU4zMgorICAgIGJ1ZmZbbGVuKytdPSdccic7IC8qIENSICovCisjZW5kaWYgLyogVVNFX1dJTjMyICovCisgICAgYnVmZltsZW4rK109J1xuJzsgLyogTEYgKi8KKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBXcml0ZUZpbGUoZGYtPmZoLCBidWZmLCBsZW4sICZudW0sIE5VTEwpOworI2Vsc2UgLyogVVNFX1dJTjMyICovCisgICAgLyogbm8gZmlsZSAtPiB3cml0ZSB0byBzdGRlcnIgKi8KKyAgICBudW09d3JpdGUoZGYgPyBkZi0+ZmQgOiAyLCBidWZmLCBsZW4pOworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworICAgIHN0cl9mcmVlKGJ1ZmYpOworICAgIHJldHVybiAoc3NpemVfdCludW07Cit9CisKK2ludCBmaWxlX3Blcm1pc3Npb25zKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkgeworI2lmICFkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoVVNFX09TMikKKyAgICBzdHJ1Y3Qgc3RhdCBzYjsgLyogYnVmZmVyIGZvciBzdGF0ICovCisKKyAgICAvKiBjaGVjayBwZXJtaXNzaW9ucyBvZiB0aGUgcHJpdmF0ZSBrZXkgZmlsZSAqLworICAgIGlmKHN0YXQoZmlsZV9uYW1lLCAmc2IpKSB7CisgICAgICAgIGlvZXJyb3IoZmlsZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgIH0KKyAgICBpZihzYi5zdF9tb2RlICYgNykKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAiSW5zZWN1cmUgZmlsZSBwZXJtaXNzaW9ucyBvbiAlcyIsIGZpbGVfbmFtZSk7CisjZWxzZQorICAgICh2b2lkKWZpbGVfbmFtZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgVVNFX1dJTjMyCisKK0xQVFNUUiBzdHIydHN0cihMUENTVFIgaW4pIHsKKyAgICBMUFRTVFIgb3V0OworI2lmZGVmIFVOSUNPREUKKyAgICBpbnQgbGVuOworCisgICAgbGVuPU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgaW4sIC0xLCBOVUxMLCAwKTsKKyAgICBpZighbGVuKQorICAgICAgICByZXR1cm4gc3RyX3RwcmludGYoVEVYVCgiTXVsdGlCeXRlVG9XaWRlQ2hhcigpIGZhaWxlZCIpKTsKKyAgICBvdXQ9c3RyX2FsbG9jKCgoc2l6ZV90KWxlbisxKSpzaXplb2YoV0NIQVIpKTsKKyAgICBsZW49TXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBpbiwgLTEsIG91dCwgbGVuKTsKKyAgICBpZighbGVuKSB7CisgICAgICAgIHN0cl9mcmVlKG91dCk7CisgICAgICAgIHJldHVybiBzdHJfdHByaW50ZihURVhUKCJNdWx0aUJ5dGVUb1dpZGVDaGFyKCkgZmFpbGVkIikpOworICAgIH0KKyNlbHNlCisgICAgLyogRklYTUU6IGNvbnZlcnQgVVRGLTggdG8gbmF0aXZlIGNvZGVwYWdlICovCisgICAgb3V0PXN0cl9kdXAoaW4pOworI2VuZGlmCisgICAgcmV0dXJuIG91dDsKK30KKworTFBTVFIgdHN0cjJzdHIoTFBDVFNUUiBpbikgeworICAgIExQU1RSIG91dDsKKyNpZmRlZiBVTklDT0RFCisgICAgaW50IGxlbjsKKworICAgIGxlbj1XaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIGluLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgaWYoIWxlbikKKyAgICAgICAgcmV0dXJuIHN0cl9wcmludGYoIldpZGVDaGFyVG9NdWx0aUJ5dGUoKSBmYWlsZWQiKTsKKyAgICBvdXQ9c3RyX2FsbG9jKChzaXplX3QpbGVuKzEpOworICAgIGxlbj1XaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIGluLCAtMSwgb3V0LCBsZW4sIE5VTEwsIE5VTEwpOworICAgIGlmKCFsZW4pIHsKKyAgICAgICAgc3RyX2ZyZWUob3V0KTsKKyAgICAgICAgcmV0dXJuIHN0cl9wcmludGYoIldpZGVDaGFyVG9NdWx0aUJ5dGUoKSBmYWlsZWQiKTsKKyAgICB9CisjZWxzZQorICAgIC8qIEZJWE1FOiBjb252ZXJ0IG5hdGl2ZSBjb2RlcGFnZSB0byBVVEYtOCAqLworICAgIG91dD1zdHJfZHVwKGluKTsKKyNlbmRpZgorICAgIHJldHVybiBvdXQ7Cit9CisKKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKworLyogZW5kIG9mIGZpbGUuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2lkbGUuaWNvIGIvc3JjL2lkbGUuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjgyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaWRsZS5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2xpYndyYXAuYyBiL3NyYy9saWJ3cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmODliMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWJ3cmFwLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworI2lmZGVmIFVTRV9MSUJXUkFQCisKKyNpbmNsdWRlIDx0Y3BkLmg+CisKKyNpZiBkZWZpbmVkKFVTRV9QVEhSRUFEKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorLyogaHR0cDovL3dpa2kub3NkZXYub3JnL0N5Z3dpbl9Jc3N1ZXMjUGFzc2luZ19maWxlX2Rlc2NyaXB0b3JzICovCisjZGVmaW5lIFVTRV9MSUJXUkFQX1BPT0wKKyNlbmRpZiAvKiBVU0VfUFRIUkVBRCAmJiAhX19DWUdXSU5fXyAqLworCitOT0VYUE9SVCBpbnQgY2hlY2soY2hhciAqLCBpbnQpOworCitpbnQgYWxsb3dfc2V2ZXJpdHk9TE9HX05PVElDRSwgZGVueV9zZXZlcml0eT1MT0dfV0FSTklORzsKKworI2lmZGVmIFVTRV9MSUJXUkFQX1BPT0wKKyNkZWZpbmUgU0VSVk5BTUVfTEVOIDI1NgorCitOT0VYUE9SVCBzc2l6ZV90IHJlYWRfZmQoaW50LCB2b2lkICosIHNpemVfdCwgaW50ICopOworTk9FWFBPUlQgc3NpemVfdCB3cml0ZV9mZChpbnQsIHZvaWQgKiwgc2l6ZV90LCBpbnQpOworCit1bnNpZ25lZCBudW1fcHJvY2Vzc2VzPTA7CitzdGF0aWMgaW50ICppcGNfc29ja2V0LCAqYnVzeTsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUF9QT09MICovCisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXJlc3VsdCIKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworaW50IGxpYndyYXBfaW5pdCgpIHsKKyNpZmRlZiBVU0VfTElCV1JBUF9QT09MCisgICAgdW5zaWduZWQgaSwgajsKKyAgICBpbnQgcmZkLCByZXN1bHQ7CisgICAgY2hhciBzZXJ2bmFtZVtTRVJWTkFNRV9MRU5dOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ9MDsKKyAgICBTRVJWSUNFX09QVElPTlMgKm9wdDsKKworICAgIGlmKGluaXRpYWxpemVkKSAvKiBkdXJpbmcgc3RhcnR1cCBvciBwcmV2aW91cyBjb25maWd1cmF0aW9uIGZpbGUgcmVsb2FkICovCisgICAgICAgIHJldHVybiAwOworICAgIGZvcihvcHQ9c2VydmljZV9vcHRpb25zLm5leHQ7IG9wdDsgb3B0PW9wdC0+bmV4dCkKKyAgICAgICAgaWYob3B0LT5vcHRpb24ubGlid3JhcCkgLyogbGlid3JhcCBpcyBlbmFibGVkIGZvciB0aGlzIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmKCFvcHQpIC8qIGRpc2FibGVkIGZvciBhbGwgc2VjdGlvbnMgb3IgaW5ldGQgbW9kZSAobm8gc2VjdGlvbnMpICovCisgICAgICAgIHJldHVybiAwOworCisgICAgbnVtX3Byb2Nlc3Nlcz1MSUJXUkFQX0NMSUVOVFM7CisgICAgaXBjX3NvY2tldD1zdHJfYWxsb2MoMipudW1fcHJvY2Vzc2VzKnNpemVvZihpbnQpKTsKKyAgICBidXN5PXN0cl9hbGxvYyhudW1fcHJvY2Vzc2VzKnNpemVvZihpbnQpKTsKKyAgICBmb3IoaT0wOyBpPG51bV9wcm9jZXNzZXM7ICsraSkgeyAvKiBzcGF3biBhIGNoaWxkICovCisgICAgICAgIGlmKHNfc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgaXBjX3NvY2tldCsyKmksIDAsICJsaWJ3cmFwX2luaXQiKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBzd2l0Y2goZm9yaygpKSB7CisgICAgICAgIGNhc2UgLTE6ICAgIC8qIGVycm9yICovCisgICAgICAgICAgICBpb2Vycm9yKCJmb3JrIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSAgMDogICAgLyogY2hpbGQgKi8KKyAgICAgICAgICAgIHRsc19hbGxvYyhOVUxMLCB1aV90bHMsICJsaWJ3cmFwIik7CisgICAgICAgICAgICBkcm9wX3ByaXZpbGVnZXMoMCk7IC8qIGxpYndyYXAgcHJvY2Vzc2VzIGFyZSBub3QgY2hyb290ZWQgKi8KKyAgICAgICAgICAgIGNsb3NlKDApOyAvKiBzdGRpbiAqLworICAgICAgICAgICAgY2xvc2UoMSk7IC8qIHN0ZG91dCAqLworICAgICAgICAgICAgaWYoIWdsb2JhbF9vcHRpb25zLm9wdGlvbi5mb3JlZ3JvdW5kKSAvKiBmb3IgbG9nZ2luZyBpbiByZWFkX2ZkICovCisgICAgICAgICAgICAgICAgY2xvc2UoMik7IC8qIHN0ZGVyciAqLworICAgICAgICAgICAgZm9yKGo9MDsgajw9aTsgKytqKSAvKiBjbG9zZSBwYXJlbnQtc2lkZSBzb2NrZXRzIGNyZWF0ZWQgc28gZmFyICovCisgICAgICAgICAgICAgICAgY2xvc2UoaXBjX3NvY2tldFsyKmpdKTsKKyAgICAgICAgICAgIHdoaWxlKDEpIHsgLyogbWFpbiBsaWJ3cmFwIGNoaWxkIGxvb3AgKi8KKyAgICAgICAgICAgICAgICBpZihyZWFkX2ZkKGlwY19zb2NrZXRbMippKzFdLCBzZXJ2bmFtZSwgU0VSVk5BTUVfTEVOLCAmcmZkKTw9MCkKKyAgICAgICAgICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0PWNoZWNrKHNlcnZuYW1lLCByZmQpOworICAgICAgICAgICAgICAgIHdyaXRlKGlwY19zb2NrZXRbMippKzFdLCAodWludDhfdCAqKSZyZXN1bHQsIHNpemVvZiByZXN1bHQpOworICAgICAgICAgICAgICAgIGlmKHJmZD49MCkKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UocmZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogICAgLyogcGFyZW50ICovCisgICAgICAgICAgICBjbG9zZShpcGNfc29ja2V0WzIqaSsxXSk7IC8qIGNoaWxkLXNpZGUgc29ja2V0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgaW5pdGlhbGl6ZWQ9MTsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUF9QT09MICovCisgICAgcmV0dXJuIDA7Cit9CisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgLyogX19HTlVDX18gKi8KKwordm9pZCBsaWJ3cmFwX2F1dGgoQ0xJICpjLCBjaGFyICphY2NlcHRlZF9hZGRyZXNzKSB7CisgICAgaW50IHJlc3VsdD0wOyAvKiBkZW55IGJ5IGRlZmF1bHQgKi8KKyNpZmRlZiBVU0VfTElCV1JBUF9QT09MCisgICAgc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIG51bV9idXN5PTAsIHJvdW5kcm9iaW49MDsKKyAgICB1bnNpZ25lZCBteV9wcm9jZXNzOworICAgIGludCByZXR2YWw7CisgICAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtdXRleD1QVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworICAgIHN0YXRpYyBwdGhyZWFkX2NvbmRfdCBjb25kPVBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUF9QT09MICovCisKKyAgICBpZighYy0+b3B0LT5vcHRpb24ubGlid3JhcCkgLyogbGlid3JhcCBpcyBkaXNhYmxlZCBmb3IgdGhpcyBzZXJ2aWNlICovCisgICAgICAgIHJldHVybjsgLyogYWxsb3cgY29ubmVjdGlvbiAqLworI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1VOCisgICAgaWYoYy0+cGVlcl9hZGRyLnNhLnNhX2ZhbWlseT09QUZfVU5JWCkgeworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkxpYndyYXAgaXMgbm90IHN1cHBvcnRlZCBvbiBVbml4IHNvY2tldHMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmZGVmIFVTRV9MSUJXUkFQX1BPT0wKKyAgICBpZihudW1fcHJvY2Vzc2VzKSB7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIldhaXRpbmcgZm9yIGEgbGlid3JhcCBwcm9jZXNzIik7CisKKyAgICAgICAgcmV0dmFsPXB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOworICAgICAgICBpZihyZXR2YWwpIHsKKyAgICAgICAgICAgIGVycm5vPXJldHZhbDsKKyAgICAgICAgICAgIGlvZXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jayIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKG51bV9idXN5PT1udW1fcHJvY2Vzc2VzKSB7IC8qIGFsbCBjaGlsZCBwcm9jZXNzZXMgYXJlIGJ1c3kgKi8KKyAgICAgICAgICAgIHJldHZhbD1wdGhyZWFkX2NvbmRfd2FpdCgmY29uZCwgJm11dGV4KTsKKyAgICAgICAgICAgIGlmKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGVycm5vPXJldHZhbDsKKyAgICAgICAgICAgICAgICBpb2Vycm9yKCJwdGhyZWFkX2NvbmRfd2FpdCIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZShidXN5W3JvdW5kcm9iaW5dKSAvKiBmaW5kIGEgZnJlZSBjaGlsZCBwcm9jZXNzICovCisgICAgICAgICAgICByb3VuZHJvYmluPShyb3VuZHJvYmluKzEpJW51bV9wcm9jZXNzZXM7CisgICAgICAgIG15X3Byb2Nlc3M9cm91bmRyb2JpbjsgLyogdGhlIHByb2Nlc3MgYWxsb2NhdGVkIGJ5IHRoaXMgdGhyZWFkICovCisgICAgICAgICsrbnVtX2J1c3k7IC8qIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIGFsbG9jYXRlZCAqLworICAgICAgICBidXN5W215X3Byb2Nlc3NdPTE7IC8qIG1hcmsgdGhlIGNoaWxkIHByb2Nlc3MgYXMgYnVzeSAqLworICAgICAgICByZXR2YWw9cHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKKyAgICAgICAgaWYocmV0dmFsKSB7CisgICAgICAgICAgICBlcnJubz1yZXR2YWw7CisgICAgICAgICAgICBpb2Vycm9yKCJwdGhyZWFkX211dGV4X3VubG9jayIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiQWNxdWlyZWQgbGlid3JhcCBwcm9jZXNzICMlZCIsIG15X3Byb2Nlc3MpOworICAgICAgICB3cml0ZV9mZChpcGNfc29ja2V0WzIqbXlfcHJvY2Vzc10sIGMtPm9wdC0+c2Vydm5hbWUsCisgICAgICAgICAgICBzdHJsZW4oYy0+b3B0LT5zZXJ2bmFtZSkrMSwgYy0+bG9jYWxfcmZkLmZkKTsKKyAgICAgICAgc19yZWFkKGMsIGlwY19zb2NrZXRbMipteV9wcm9jZXNzXSwKKyAgICAgICAgICAgICh1aW50OF90ICopJnJlc3VsdCwgc2l6ZW9mIHJlc3VsdCk7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlJlbGVhc2luZyBsaWJ3cmFwIHByb2Nlc3MgIyVkIiwgbXlfcHJvY2Vzcyk7CisKKyAgICAgICAgcmV0dmFsPXB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOworICAgICAgICBpZihyZXR2YWwpIHsKKyAgICAgICAgICAgIGVycm5vPXJldHZhbDsKKyAgICAgICAgICAgIGlvZXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jayIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIGJ1c3lbbXlfcHJvY2Vzc109MDsgLyogbWFyayB0aGUgY2hpbGQgcHJvY2VzcyBhcyBmcmVlICovCisgICAgICAgIC0tbnVtX2J1c3k7IC8qIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHJlbGVhc2VkICovCisgICAgICAgIHJldHZhbD1wdGhyZWFkX2NvbmRfc2lnbmFsKCZjb25kKTsgLyogc2lnbmFsIGEgd2FpdGluZyB0aHJlYWQgKi8KKyAgICAgICAgaWYocmV0dmFsKSB7CisgICAgICAgICAgICBlcnJubz1yZXR2YWw7CisgICAgICAgICAgICBpb2Vycm9yKCJwdGhyZWFkX2NvbmRfc2lnbmFsIik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsPXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CisgICAgICAgIGlmKHJldHZhbCkgeworICAgICAgICAgICAgZXJybm89cmV0dmFsOworICAgICAgICAgICAgaW9lcnJvcigicHRocmVhZF9tdXRleF91bmxvY2siKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlJlbGVhc2VkIGxpYndyYXAgcHJvY2VzcyAjJWQiLCBteV9wcm9jZXNzKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfTElCV1JBUF9QT09MICovCisgICAgeyAvKiB1c2Ugb3JpZ2luYWwsIHN5bmNocm9ub3VzIGxpYndyYXAgY2FsbHMgKi8KKyAgICAgICAgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihDUklUX0xJQldSQVApOworICAgICAgICByZXN1bHQ9Y2hlY2soYy0+b3B0LT5zZXJ2bmFtZSwgYy0+bG9jYWxfcmZkLmZkKTsKKyAgICAgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0xJQldSQVApOworICAgIH0KKyAgICBpZighcmVzdWx0KSB7CisgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiU2VydmljZSBbJXNdIFJFRlVTRUQgYnkgbGlid3JhcCBmcm9tICVzIiwKKyAgICAgICAgICAgIGMtPm9wdC0+c2Vydm5hbWUsIGFjY2VwdGVkX2FkZHJlc3MpOworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTZWUgaG9zdHNfYWNjZXNzKDUpIG1hbnVhbCBmb3IgZGV0YWlscyIpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHNfbG9nKExPR19ERUJVRywgIlNlcnZpY2UgWyVzXSBwZXJtaXR0ZWQgYnkgbGlid3JhcCBmcm9tICVzIiwKKyAgICAgICAgYy0+b3B0LT5zZXJ2bmFtZSwgYWNjZXB0ZWRfYWRkcmVzcyk7Cit9CisKK05PRVhQT1JUIGludCBjaGVjayhjaGFyICpuYW1lLCBpbnQgZmQpIHsKKyAgICBzdHJ1Y3QgcmVxdWVzdF9pbmZvIHJlcXVlc3Q7CisKKyAgICByZXF1ZXN0X2luaXQoJnJlcXVlc3QsIFJRX0RBRU1PTiwgbmFtZSwgUlFfRklMRSwgZmQsIDApOworICAgIGZyb21ob3N0KCZyZXF1ZXN0KTsKKyAgICByZXR1cm4gaG9zdHNfYWNjZXNzKCZyZXF1ZXN0KTsKK30KKworI2lmZGVmIFVTRV9MSUJXUkFQX1BPT0wKKworTk9FWFBPUlQgc3NpemVfdCByZWFkX2ZkKFNPQ0tFVCBmZCwgdm9pZCAqcHRyLCBzaXplX3QgbmJ5dGVzLCBTT0NLRVQgKnJlY3ZmZCkgeworICAgIHN0cnVjdCBtc2doZHIgbXNnOworICAgIHN0cnVjdCBpb3ZlYyBpb3ZbMV07CisgICAgc3NpemVfdCBuOworCisjaWZkZWYgSEFWRV9NU0dIRFJfTVNHX0NPTlRST0wKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBjbXNnaGRyIGNtOworICAgICAgICBjaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldOworICAgIH0gY29udHJvbF91bjsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21wdHI7CisKKyAgICBtc2cubXNnX2NvbnRyb2w9Y29udHJvbF91bi5jb250cm9sOworICAgIG1zZy5tc2dfY29udHJvbGxlbj1zaXplb2YgY29udHJvbF91bi5jb250cm9sOworI2Vsc2UKKyAgICBpbnQgbmV3ZmQ7CisKKyAgICBtc2cubXNnX2FjY3JpZ2h0cz0oY2FkZHJfdCkmbmV3ZmQ7CisgICAgbXNnLm1zZ19hY2NyaWdodHNsZW49c2l6ZW9mKGludCk7CisjZW5kaWYKKworICAgIG1zZy5tc2dfbmFtZT1OVUxMOworICAgIG1zZy5tc2dfbmFtZWxlbj0wOworCisgICAgaW92WzBdLmlvdl9iYXNlPXB0cjsKKyAgICBpb3ZbMF0uaW92X2xlbj1uYnl0ZXM7CisgICAgbXNnLm1zZ19pb3Y9aW92OworICAgIG1zZy5tc2dfaW92bGVuPTE7CisKKyAgICAqcmVjdmZkPUlOVkFMSURfU09DS0VUOyAvKiBkZXNjcmlwdG9yIHdhcyBub3QgcGFzc2VkICovCisgICAgbj1yZWN2bXNnKGZkLCAmbXNnLCAwKTsKKyAgICBpZihuPD0wKQorICAgICAgICByZXR1cm4gbjsKKworI2lmZGVmIEhBVkVfTVNHSERSX01TR19DT05UUk9MCisgICAgY21wdHI9Q01TR19GSVJTVEhEUigmbXNnKTsKKyAgICBpZighY21wdHIgfHwgY21wdHItPmNtc2dfbGVuIT1DTVNHX0xFTihzaXplb2YoaW50KSkpCisgICAgICAgIHJldHVybiBuOworICAgIGlmKGNtcHRyLT5jbXNnX2xldmVsIT1TT0xfU09DS0VUKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJjb250cm9sIGxldmVsICE9IFNPTF9TT0NLRVQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZihjbXB0ci0+Y21zZ190eXBlIT1TQ01fUklHSFRTKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJjb250cm9sIHR5cGUgIT0gU0NNX1JJR0hUUyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShyZWN2ZmQsIENNU0dfREFUQShjbXB0ciksIHNpemVvZihpbnQpKTsKKyNlbHNlCisgICAgaWYobXNnLm1zZ19hY2NyaWdodHNsZW49PXNpemVvZihpbnQpKQorICAgICAgICAqcmVjdmZkPW5ld2ZkOworI2VuZGlmCisKKyAgICByZXR1cm4gbjsKK30KKworTk9FWFBPUlQgc3NpemVfdCB3cml0ZV9mZChpbnQgZmQsIHZvaWQgKnB0ciwgc2l6ZV90IG5ieXRlcywgaW50IHNlbmRmZCkgeworICAgIHN0cnVjdCBtc2doZHIgbXNnOworICAgIHN0cnVjdCBpb3ZlYyBpb3ZbMV07CisKKyNpZmRlZiBIQVZFX01TR0hEUl9NU0dfQ09OVFJPTAorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGNtc2doZHIgY207CisgICAgICAgIGNoYXIgY29udHJvbFtDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisgICAgfSBjb250cm9sX3VuOworICAgIHN0cnVjdCBjbXNnaGRyICpjbXB0cjsKKworICAgIG1zZy5tc2dfY29udHJvbD1jb250cm9sX3VuLmNvbnRyb2w7CisgICAgbXNnLm1zZ19jb250cm9sbGVuPXNpemVvZiBjb250cm9sX3VuLmNvbnRyb2w7CisKKyAgICBjbXB0cj1DTVNHX0ZJUlNUSERSKCZtc2cpOworICAgIGNtcHRyLT5jbXNnX2xlbj1DTVNHX0xFTihzaXplb2YoaW50KSk7CisgICAgY21wdHItPmNtc2dfbGV2ZWw9U09MX1NPQ0tFVDsKKyAgICBjbXB0ci0+Y21zZ190eXBlPVNDTV9SSUdIVFM7CisgICAgbWVtY3B5KENNU0dfREFUQShjbXB0ciksICZzZW5kZmQsIHNpemVvZihpbnQpKTsKKyNlbHNlCisgICAgbXNnLm1zZ19hY2NyaWdodHM9KGNhZGRyX3QpJnNlbmRmZDsKKyAgICBtc2cubXNnX2FjY3JpZ2h0c2xlbj1zaXplb2YoaW50KTsKKyNlbmRpZgorCisgICAgbXNnLm1zZ19uYW1lPU5VTEw7CisgICAgbXNnLm1zZ19uYW1lbGVuPTA7CisKKyAgICBpb3ZbMF0uaW92X2Jhc2U9cHRyOworICAgIGlvdlswXS5pb3ZfbGVuPW5ieXRlczsKKyAgICBtc2cubXNnX2lvdj1pb3Y7CisgICAgbXNnLm1zZ19pb3ZsZW49MTsKKworICAgIHJldHVybiBzZW5kbXNnKGZkLCAmbXNnLCAwKTsKK30KKworI2VuZGlmIC8qIFVTRV9MSUJXUkFQX1BPT0wgKi8KKworI2VuZGlmIC8qIFVTRV9MSUJXUkFQICovCisKKy8qIGVuZCBvZiBsaWJ3cmFwLmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9sb2cuYyBiL3NyYy9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZiNWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xvZy5jCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKK05PRVhQT1JUIHZvaWQgbG9nX3Jhdyhjb25zdCBTRVJWSUNFX09QVElPTlMgKiwgY29uc3QgaW50LAorICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworTk9FWFBPUlQgdm9pZCBzYWZlc3RyaW5nKGNoYXIgKik7CisKK3N0YXRpYyBESVNLX0ZJTEUgKm91dGZpbGU9TlVMTDsKK3N0YXRpYyBzdHJ1Y3QgTElTVCB7IC8qIHNpbmdsZS1saW5rZWQgbGlzdCBvZiBsb2cgbGluZXMgKi8KKyAgICBzdHJ1Y3QgTElTVCAqbmV4dDsKKyAgICBTRVJWSUNFX09QVElPTlMgKm9wdDsKKyAgICBpbnQgbGV2ZWw7CisgICAgY2hhciAqc3RhbXAsICppZCwgKnRleHQ7Cit9ICpoZWFkPU5VTEwsICp0YWlsPU5VTEw7CitzdGF0aWMgTE9HX01PREUgbW9kZT1MT0dfTU9ERV9OT05FOworCisjaWYgIWRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChfX3ZtcykKKworc3RhdGljIGludCBzeXNsb2dfb3BlbmVkPTA7CisKK3ZvaWQgc3lzbG9nX29wZW4odm9pZCkgeworICAgIHN5c2xvZ19jbG9zZSgpOworICAgIGlmKGdsb2JhbF9vcHRpb25zLm9wdGlvbi5zeXNsb2cpCisjaWZkZWYgX191bHRyaXhfXworICAgICAgICBvcGVubG9nKHNlcnZpY2Vfb3B0aW9ucy5zZXJ2bmFtZSwgMCk7CisjZWxzZQorICAgICAgICBvcGVubG9nKHNlcnZpY2Vfb3B0aW9ucy5zZXJ2bmFtZSwKKyAgICAgICAgICAgIExPR19DT05TfExPR19OREVMQVksIGdsb2JhbF9vcHRpb25zLmxvZ19mYWNpbGl0eSk7CisjZW5kaWYgLyogX191bHRyaXhfXyAqLworICAgIHN5c2xvZ19vcGVuZWQ9MTsKK30KKwordm9pZCBzeXNsb2dfY2xvc2Uodm9pZCkgeworICAgIGlmKHN5c2xvZ19vcGVuZWQpIHsKKyAgICAgICAgaWYoZ2xvYmFsX29wdGlvbnMub3B0aW9uLnN5c2xvZykKKyAgICAgICAgICAgIGNsb3NlbG9nKCk7CisgICAgICAgIHN5c2xvZ19vcGVuZWQ9MDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChVU0VfV0lOMzIpICYmICFkZWZpbmVkKF9fdm1zKSAqLworCitpbnQgbG9nX29wZW4odm9pZCkgeworICAgIGlmKGdsb2JhbF9vcHRpb25zLm91dHB1dF9maWxlKSB7IC8qICdvdXRwdXQnIG9wdGlvbiBzcGVjaWZpZWQgKi8KKyAgICAgICAgb3V0ZmlsZT1maWxlX29wZW4oZ2xvYmFsX29wdGlvbnMub3V0cHV0X2ZpbGUsCisgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucy5sb2dfZmlsZV9tb2RlKTsKKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgICAgaWYoIW91dGZpbGUpIHsKKyAgICAgICAgICAgIGNoYXIgYXBwZGF0YVtNQVhfUEFUSF0sICpwYXRoOworICAgICAgICAgICAgaWYoU0hHZXRGb2xkZXJQYXRoQShOVUxMLCBDU0lETF9MT0NBTF9BUFBEQVRBfENTSURMX0ZMQUdfQ1JFQVRFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBhcHBkYXRhKT09U19PSykgeworICAgICAgICAgICAgICAgIHBhdGg9c3RyX3ByaW50ZigiJXNcXCVzIiwgYXBwZGF0YSwgZ2xvYmFsX29wdGlvbnMub3V0cHV0X2ZpbGUpOworICAgICAgICAgICAgICAgIG91dGZpbGU9ZmlsZV9vcGVuKHBhdGgsIGdsb2JhbF9vcHRpb25zLmxvZ19maWxlX21vZGUpOworICAgICAgICAgICAgICAgIGlmKG91dGZpbGUpCisgICAgICAgICAgICAgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJMb2dnaW5nIHRvICVzIiwgcGF0aCk7CisgICAgICAgICAgICAgICAgc3RyX2ZyZWUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZighb3V0ZmlsZSkgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkNhbm5vdCBvcGVuIGxvZyBmaWxlOiAlcyIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMub3V0cHV0X2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgbG9nX2ZsdXNoKExPR19NT0RFX0NPTkZJR1VSRUQpOworICAgIHJldHVybiAwOworfQorCit2b2lkIGxvZ19jbG9zZSh2b2lkKSB7CisgICAgbW9kZT1MT0dfTU9ERV9OT05FOworICAgIGlmKG91dGZpbGUpIHsKKyAgICAgICAgZmlsZV9jbG9zZShvdXRmaWxlKTsKKyAgICAgICAgb3V0ZmlsZT1OVUxMOworICAgIH0KK30KKwordm9pZCBsb2dfZmx1c2goTE9HX01PREUgbmV3X21vZGUpIHsKKyAgICBzdHJ1Y3QgTElTVCAqdG1wOworCisgICAgLyogcHJldmVudCBjaGFuZ2luZyBMT0dfTU9ERV9DT05GSUdVUkVEIHRvIExPR19NT0RFX0VSUk9SCisgICAgICogb25jZSBzdGRlcnIgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCAqLworICAgIGlmKG1vZGUhPUxPR19NT0RFX0NPTkZJR1VSRUQpCisgICAgICAgIG1vZGU9bmV3X21vZGU7CisKKyAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfTE9HKTsKKyAgICB3aGlsZShoZWFkKSB7CisgICAgICAgIGxvZ19yYXcoaGVhZC0+b3B0LCBoZWFkLT5sZXZlbCwgaGVhZC0+c3RhbXAsIGhlYWQtPmlkLCBoZWFkLT50ZXh0KTsKKyAgICAgICAgc3RyX2ZyZWUoaGVhZC0+c3RhbXApOworICAgICAgICBzdHJfZnJlZShoZWFkLT5pZCk7CisgICAgICAgIHN0cl9mcmVlKGhlYWQtPnRleHQpOworICAgICAgICB0bXA9aGVhZDsKKyAgICAgICAgaGVhZD1oZWFkLT5uZXh0OworICAgICAgICBzdHJfZnJlZSh0bXApOworICAgIH0KKyAgICBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKENSSVRfTE9HKTsKKyAgICBoZWFkPXRhaWw9TlVMTDsKK30KKwordm9pZCBzX2xvZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjaGFyICp0ZXh0LCAqc3RhbXAsICppZDsKKyAgICBzdHJ1Y3QgTElTVCAqdG1wOworI2lmZGVmIFVTRV9XSU4zMgorICAgIERXT1JEIGxpYmNfZXJyb3I7CisjZWxzZQorICAgIGludCBsaWJjX2Vycm9yOworI2VuZGlmCisgICAgaW50IHNvY2tldF9lcnJvcjsKKyAgICB0aW1lX3QgZ210OworICAgIHN0cnVjdCB0bSAqdGltZXB0cjsKKyNpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpICYmIGRlZmluZWQoX1JFRU5UUkFOVCkKKyAgICBzdHJ1Y3QgdG0gdGltZXN0cnVjdDsKKyNlbmRpZgorICAgIFRMU19EQVRBICp0bHNfZGF0YTsKKworICAgIHRsc19kYXRhPXRsc19nZXQoKTsKKyAgICBpZighdGxzX2RhdGEpIHsKKyAgICAgICAgdGxzX2RhdGE9dGxzX2FsbG9jKE5VTEwsIE5VTEwsICJsb2ciKTsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIklOVEVSTkFMIEVSUk9SOiBVbmluaXRpYWxpemVkIFRMUyBhdCAlcywgbGluZSAlZCIsCisgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOworICAgIH0KKworICAgIC8qIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogc2tpcCB0aGUgdHJpdmlhbCBjYXNlIGVhcmx5ICovCisgICAgaWYobW9kZT09TE9HX01PREVfQ09ORklHVVJFRCAmJiBsZXZlbD50bHNfZGF0YS0+b3B0LT5sb2dfbGV2ZWwpCisgICAgICAgIHJldHVybjsKKworICAgIGxpYmNfZXJyb3I9Z2V0X2xhc3RfZXJyb3IoKTsKKyAgICBzb2NrZXRfZXJyb3I9Z2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk7CisKKyAgICAvKiBmb3JtYXQgdGhlIGlkIHRvIGJlIGxvZ2dlZCAqLworICAgIHRpbWUoJmdtdCk7CisjaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKSAmJiBkZWZpbmVkKF9SRUVOVFJBTlQpCisgICAgdGltZXB0cj1sb2NhbHRpbWVfcigmZ210LCAmdGltZXN0cnVjdCk7CisjZWxzZQorICAgIHRpbWVwdHI9bG9jYWx0aW1lKCZnbXQpOworI2VuZGlmCisgICAgc3RhbXA9c3RyX3ByaW50ZigiJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmQiLAorICAgICAgICB0aW1lcHRyLT50bV95ZWFyKzE5MDAsIHRpbWVwdHItPnRtX21vbisxLCB0aW1lcHRyLT50bV9tZGF5LAorICAgICAgICB0aW1lcHRyLT50bV9ob3VyLCB0aW1lcHRyLT50bV9taW4sIHRpbWVwdHItPnRtX3NlYyk7CisgICAgaWQ9c3RyX3ByaW50ZigiTE9HJWRbJXNdIiwgbGV2ZWwsIHRsc19kYXRhLT5pZCk7CisKKyAgICAvKiBmb3JtYXQgdGhlIHRleHQgdG8gYmUgbG9nZ2VkICovCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgdGV4dD1zdHJfdnByaW50Zihmb3JtYXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIHNhZmVzdHJpbmcodGV4dCk7CisKKyAgICBpZihtb2RlPT1MT0dfTU9ERV9OT05FKSB7IC8qIHNhdmUgdGhlIHRleHQgdG8gbG9nIGl0IGxhdGVyICovCisgICAgICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9MT0cpOworICAgICAgICB0bXA9c3RyX2FsbG9jX2RldGFjaGVkKHNpemVvZihzdHJ1Y3QgTElTVCkpOworICAgICAgICB0bXAtPm5leHQ9TlVMTDsKKyAgICAgICAgdG1wLT5vcHQ9dGxzX2RhdGEtPm9wdDsKKyAgICAgICAgdG1wLT5sZXZlbD1sZXZlbDsKKyAgICAgICAgdG1wLT5zdGFtcD1zdGFtcDsKKyAgICAgICAgc3RyX2RldGFjaCh0bXAtPnN0YW1wKTsKKyAgICAgICAgdG1wLT5pZD1pZDsKKyAgICAgICAgc3RyX2RldGFjaCh0bXAtPmlkKTsKKyAgICAgICAgdG1wLT50ZXh0PXRleHQ7CisgICAgICAgIHN0cl9kZXRhY2godG1wLT50ZXh0KTsKKyAgICAgICAgaWYodGFpbCkKKyAgICAgICAgICAgIHRhaWwtPm5leHQ9dG1wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkPXRtcDsKKyAgICAgICAgdGFpbD10bXA7CisgICAgICAgIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9MT0cpOworICAgIH0gZWxzZSB7IC8qIHJlYWR5IGxvZyB0aGUgdGV4dCBkaXJlY3RseSAqLworICAgICAgICBsb2dfcmF3KHRsc19kYXRhLT5vcHQsIGxldmVsLCBzdGFtcCwgaWQsIHRleHQpOworICAgICAgICBzdHJfZnJlZShzdGFtcCk7CisgICAgICAgIHN0cl9mcmVlKGlkKTsKKyAgICAgICAgc3RyX2ZyZWUodGV4dCk7CisgICAgfQorCisgICAgc2V0X2xhc3RfZXJyb3IobGliY19lcnJvcik7CisgICAgc2V0X2xhc3Rfc29ja2V0X2Vycm9yKHNvY2tldF9lcnJvcik7Cit9CisKK05PRVhQT1JUIHZvaWQgbG9nX3Jhdyhjb25zdCBTRVJWSUNFX09QVElPTlMgKm9wdCwKKyAgICAgICAgY29uc3QgaW50IGxldmVsLCBjb25zdCBjaGFyICpzdGFtcCwKKyAgICAgICAgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnRleHQpIHsKKyAgICBjaGFyICpsaW5lOworCisgICAgLyogYnVpbGQgdGhlIGxpbmUgYW5kIGxvZyBpdCB0byBzeXNsb2cvZmlsZSAqLworICAgIGlmKG1vZGU9PUxPR19NT0RFX0NPTkZJR1VSRUQpIHsgLyogY29uZmlndXJlZCAqLworICAgICAgICBsaW5lPXN0cl9wcmludGYoIiVzICVzOiAlcyIsIHN0YW1wLCBpZCwgdGV4dCk7CisgICAgICAgIGlmKGxldmVsPD1vcHQtPmxvZ19sZXZlbCkgeworI2lmICFkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX192bXMpCisgICAgICAgICAgICBpZihnbG9iYWxfb3B0aW9ucy5vcHRpb24uc3lzbG9nKQorICAgICAgICAgICAgICAgIHN5c2xvZyhsZXZlbCwgIiVzOiAlcyIsIGlkLCB0ZXh0KTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIsIF9fdm1zICovCisgICAgICAgICAgICBpZihvdXRmaWxlKQorICAgICAgICAgICAgICAgIGZpbGVfcHV0bGluZShvdXRmaWxlLCBsaW5lKTsgLyogc2VuZCBsb2cgdG8gZmlsZSAqLworICAgICAgICB9CisgICAgfSBlbHNlIGlmKG1vZGU9PUxPR19NT0RFX0VSUk9SKSB7CisgICAgICAgIGlmKGxldmVsPj0wICYmIGxldmVsPD03KSAvKiBqdXN0IGluIGNhc2UgKi8KKyAgICAgICAgICAgIGxpbmU9c3RyX3ByaW50ZigiWyVjXSAlcyIsICIqKiohOi4gICJbbGV2ZWxdLCB0ZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGluZT1zdHJfcHJpbnRmKCJbP10gJXMiLCB0ZXh0KTsKKyAgICB9IGVsc2UgLyogTE9HX01PREVfSU5GTyAqLworICAgICAgICBsaW5lPXN0cl9kdXAodGV4dCk7IC8qIGRvbid0IGxvZyB0aGUgdGltZSBzdGFtcCBpbiBlcnJvciBtb2RlICovCisKKyAgICAvKiBsb2cgdGhlIGxpbmUgdG8gdGhlIFVJIChHVUksIHN0ZGVyciwgZXRjLikgKi8KKyAgICBpZihtb2RlPT1MT0dfTU9ERV9FUlJPUiB8fAorICAgICAgICAgICAgKG1vZGU9PUxPR19NT0RFX0lORk8gJiYgbGV2ZWw8TE9HX0RFQlVHKSB8fAorI2lmIGRlZmluZWQoVVNFX1dJTjMyKSB8fCBkZWZpbmVkKFVTRV9KTkkpCisgICAgICAgICAgICBsZXZlbDw9b3B0LT5sb2dfbGV2ZWwKKyNlbHNlCisgICAgICAgICAgICAobGV2ZWw8PW9wdC0+bG9nX2xldmVsICYmCisgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucy5vcHRpb24uZm9yZWdyb3VuZCkKKyNlbmRpZgorICAgICAgICAgICAgKQorICAgICAgICB1aV9uZXdfbG9nKGxpbmUpOworCisgICAgc3RyX2ZyZWUobGluZSk7Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZm9ybWF0IgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zvcm1hdC1leHRyYS1hcmdzIgorI2VuZGlmIC8qIF9fR05VQ19fICovCitjaGFyICpsb2dfaWQoQ0xJICpjKSB7CisgICAgc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBzZXE9MDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbXlfc2VxOworICAgIGNvbnN0IGNoYXIgdGFibGVbNjJdPQorICAgICAgICAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOworICAgIHVuc2lnbmVkIGNoYXIgcm5kWzIyXTsKKyAgICBjaGFyICp1bmlxOworICAgIHNpemVfdCBpOworICAgIHVuc2lnbmVkIGxvbmcgdGlkOworCisgICAgc3dpdGNoKGMtPm9wdC0+bG9nX2lkKSB7CisgICAgY2FzZSBMT0dfSURfU0VRRU5USUFMOgorICAgICAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfSUQpOworICAgICAgICBteV9zZXE9c2VxKys7CisgICAgICAgIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9JRCk7CisgICAgICAgIHJldHVybiBzdHJfcHJpbnRmKCIlbGx1IiwgbXlfc2VxKTsKKyAgICBjYXNlIExPR19JRF9VTklRVUU6CisgICAgICAgIGlmKFJBTkRfYnl0ZXMocm5kLCBzaXplb2Ygcm5kKTw9MCkgLyogbG9nMig2Ml4yMik9MTMwLjk5ICovCisgICAgICAgICAgICByZXR1cm4gc3RyX2R1cCgiZXJyb3IiKTsKKyAgICAgICAgZm9yKGk9MDsgaTxzaXplb2Ygcm5kOyArK2kpIHsKKyAgICAgICAgICAgIHJuZFtpXSY9NjM7CisgICAgICAgICAgICB3aGlsZShybmRbaV0+PTYyKSB7CisgICAgICAgICAgICAgICAgaWYoUkFORF9ieXRlcyhybmQraSwgMSk8PTApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJfZHVwKCJlcnJvciIpOworICAgICAgICAgICAgICAgIHJuZFtpXSY9NjM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5pcT1zdHJfYWxsb2Moc2l6ZW9mIHJuZCsxKTsKKyAgICAgICAgZm9yKGk9MDsgaTxzaXplb2Ygcm5kOyArK2kpCisgICAgICAgICAgICB1bmlxW2ldPXRhYmxlW3JuZFtpXV07CisgICAgICAgIHVuaXFbc2l6ZW9mIHJuZF09J1wwJzsKKyAgICAgICAgcmV0dXJuIHVuaXE7CisgICAgY2FzZSBMT0dfSURfVEhSRUFEOgorICAgICAgICB0aWQ9c3R1bm5lbF90aHJlYWRfaWQoKTsKKyAgICAgICAgaWYoIXRpZCkgLyogY3VycmVudGx5IFVTRV9GT1JLICovCisgICAgICAgICAgICB0aWQ9c3R1bm5lbF9wcm9jZXNzX2lkKCk7CisgICAgICAgIHJldHVybiBzdHJfcHJpbnRmKCIlbHUiLCB0aWQpOworICAgIH0KKyAgICByZXR1cm4gc3RyX2R1cCgiZXJyb3IiKTsKK30KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisvKiBjcml0aWNhbCBwcm9ibGVtIGhhbmRsaW5nICovCisvKiBzdHIuYyBmdW5jdGlvbnMgYXJlIG5vdCBzYWZlIHRvIHVzZSBoZXJlICovCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1yZXN1bHQiCisjZW5kaWYgLyogX19HTlVDX18gKi8KK3ZvaWQgZmF0YWxfZGVidWcoY2hhciAqdHh0LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICAgIGNoYXIgbXNnWzgwXTsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBEV09SRCBudW07CisjaWZkZWYgVU5JQ09ERQorICAgIFRDSEFSIHRtc2dbODBdOworI2VuZGlmCisjZW5kaWYgLyogVVNFX1dJTjMyICovCisKKyAgICBzbnByaW50Zihtc2csIHNpemVvZiBtc2csIC8qIHdpdGggbmV3bGluZSAqLworICAgICAgICAiSU5URVJOQUwgRVJST1I6ICVzIGF0ICVzLCBsaW5lICVkXG4iLCB0eHQsIGZpbGUsIGxpbmUpOworCisgICAgaWYob3V0ZmlsZSkgeworI2lmZGVmIFVTRV9XSU4zMgorICAgICAgICBXcml0ZUZpbGUob3V0ZmlsZS0+ZmgsIG1zZywgc3RybGVuKG1zZyksICZudW0sIE5VTEwpOworI2Vsc2UgLyogVVNFX1dJTjMyICovCisgICAgICAgIC8qIG5vIGZpbGUgLT4gd3JpdGUgdG8gc3RkZXJyICovCisgICAgICAgIC8qIG5vIG1lYW5pbmdmdWwgd2F5IGhlcmUgdG8gaGFuZGxlIHRoZSByZXN1bHQgKi8KKyAgICAgICAgd3JpdGUob3V0ZmlsZSA/IG91dGZpbGUtPmZkIDogMiwgbXNnLCBzdHJsZW4obXNnKSk7CisjZW5kaWYgLyogVVNFX1dJTjMyICovCisgICAgfQorCisjaWZuZGVmIFVTRV9XSU4zMgorICAgIGlmKG1vZGUhPUxPR19NT0RFX0NPTkZJR1VSRUQgfHwgZ2xvYmFsX29wdGlvbnMub3B0aW9uLmZvcmVncm91bmQpIHsKKyAgICAgICAgZnB1dHMobXNnLCBzdGRlcnIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICB9CisjZW5kaWYgLyogIVVTRV9XSU4zMiAqLworCisgICAgc25wcmludGYobXNnLCBzaXplb2YgbXNnLCAvKiB3aXRob3V0IG5ld2xpbmUgKi8KKyAgICAgICAgIklOVEVSTkFMIEVSUk9SOiAlcyBhdCAlcywgbGluZSAlZCIsIHR4dCwgZmlsZSwgbGluZSk7CisKKyNpZiAhZGVmaW5lZChVU0VfV0lOMzIpICYmICFkZWZpbmVkKF9fdm1zKQorICAgIGlmKGdsb2JhbF9vcHRpb25zLm9wdGlvbi5zeXNsb2cpCisgICAgICAgIHN5c2xvZyhMT0dfQ1JJVCwgIiVzIiwgbXNnKTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIsIF9fdm1zICovCisKKyNpZmRlZiBVU0VfV0lOMzIKKyNpZmRlZiBVTklDT0RFCisgICAgaWYoTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBtc2csIC0xLCB0bXNnLCA4MCkpCisgICAgICAgIG1lc3NhZ2VfYm94KHRtc2csIE1CX0lDT05FUlJPUik7CisjZWxzZQorICAgIG1lc3NhZ2VfYm94KG1zZywgTUJfSUNPTkVSUk9SKTsKKyNlbmRpZgorI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCisgICAgYWJvcnQoKTsKK30KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCit2b2lkIGlvZXJyb3IoY29uc3QgY2hhciAqdHh0KSB7IC8qIGlucHV0L291dHB1dCBlcnJvciAqLworICAgIGxvZ19lcnJvcihMT0dfRVJSLCAoaW50KWdldF9sYXN0X2Vycm9yKCksIHR4dCk7Cit9CisKK3ZvaWQgc29ja2Vycm9yKGNvbnN0IGNoYXIgKnR4dCkgeyAvKiBzb2NrZXQgZXJyb3IgKi8KKyAgICBsb2dfZXJyb3IoTE9HX0VSUiwgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCksIHR4dCk7Cit9CisKK3ZvaWQgbG9nX2Vycm9yKGludCBsZXZlbCwgaW50IGVycm9yLCBjb25zdCBjaGFyICp0eHQpIHsgLyogZ2VuZXJpYyBlcnJvciAqLworICAgIHNfbG9nKGxldmVsLCAiJXM6ICVzICglZCkiLCB0eHQsIHNfc3RyZXJyb3IoZXJyb3IpLCBlcnJvcik7Cit9CisKK2NoYXIgKnNfc3RyZXJyb3IoaW50IGVycm51bSkgeworICAgIHN3aXRjaChlcnJudW0pIHsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBjYXNlIDEwMDA0OgorICAgICAgICByZXR1cm4gIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIChXU0FFSU5UUikiOworICAgIGNhc2UgMTAwMDk6CisgICAgICAgIHJldHVybiAiQmFkIGZpbGUgbnVtYmVyIChXU0FFQkFERikiOworICAgIGNhc2UgMTAwMTM6CisgICAgICAgIHJldHVybiAiUGVybWlzc2lvbiBkZW5pZWQgKFdTQUVBQ0NFUykiOworICAgIGNhc2UgMTAwMTQ6CisgICAgICAgIHJldHVybiAiQmFkIGFkZHJlc3MgKFdTQUVGQVVMVCkiOworICAgIGNhc2UgMTAwMjI6CisgICAgICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudCAoV1NBRUlOVkFMKSI7CisgICAgY2FzZSAxMDAyNDoKKyAgICAgICAgcmV0dXJuICJUb28gbWFueSBvcGVuIGZpbGVzIChXU0FFTUZJTEUpIjsKKyAgICBjYXNlIDEwMDM1OgorICAgICAgICByZXR1cm4gIk9wZXJhdGlvbiB3b3VsZCBibG9jayAoV1NBRVdPVUxEQkxPQ0spIjsKKyAgICBjYXNlIDEwMDM2OgorICAgICAgICByZXR1cm4gIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MgKFdTQUVJTlBST0dSRVNTKSI7CisgICAgY2FzZSAxMDAzNzoKKyAgICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyAoV1NBRUFMUkVBRFkpIjsKKyAgICBjYXNlIDEwMDM4OgorICAgICAgICByZXR1cm4gIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCAoV1NBRU5PVFNPQ0spIjsKKyAgICBjYXNlIDEwMDM5OgorICAgICAgICByZXR1cm4gIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgKFdTQUVERVNUQUREUlJFUSkiOworICAgIGNhc2UgMTAwNDA6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSB0b28gbG9uZyAoV1NBRU1TR1NJWkUpIjsKKyAgICBjYXNlIDEwMDQxOgorICAgICAgICByZXR1cm4gIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCAoV1NBRVBST1RPVFlQRSkiOworICAgIGNhc2UgMTAwNDI6CisgICAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIG9wdGlvbiAoV1NBRU5PUFJPVE9PUFQpIjsKKyAgICBjYXNlIDEwMDQzOgorICAgICAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQgKFdTQUVQUk9UT05PU1VQUE9SVCkiOworICAgIGNhc2UgMTAwNDQ6CisgICAgICAgIHJldHVybiAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCAoV1NBRVNPQ0tUTk9TVVBQT1JUKSI7CisgICAgY2FzZSAxMDA0NToKKyAgICAgICAgcmV0dXJuICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiBzb2NrZXQgKFdTQUVPUE5PVFNVUFApIjsKKyAgICBjYXNlIDEwMDQ2OgorICAgICAgICByZXR1cm4gIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIChXU0FFUEZOT1NVUFBPUlQpIjsKKyAgICBjYXNlIDEwMDQ3OgorICAgICAgICByZXR1cm4gIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgZmFtaWx5IChXU0FFQUZOT1NVUFBPUlQpIjsKKyAgICBjYXNlIDEwMDQ4OgorICAgICAgICByZXR1cm4gIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgKFdTQUVBRERSSU5VU0UpIjsKKyAgICBjYXNlIDEwMDQ5OgorICAgICAgICByZXR1cm4gIkNhbid0IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyAoV1NBRUFERFJOT1RBVkFJTCkiOworICAgIGNhc2UgMTAwNTA6CisgICAgICAgIHJldHVybiAiTmV0d29yayBpcyBkb3duIChXU0FFTkVURE9XTikiOworICAgIGNhc2UgMTAwNTE6CisgICAgICAgIHJldHVybiAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSAoV1NBRU5FVFVOUkVBQ0gpIjsKKyAgICBjYXNlIDEwMDUyOgorICAgICAgICByZXR1cm4gIk5ldCBkcm9wcGVkIGNvbm5lY3Rpb24gb3IgcmVzZXQgKFdTQUVORVRSRVNFVCkiOworICAgIGNhc2UgMTAwNTM6CisgICAgICAgIHJldHVybiAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQgKFdTQUVDT05OQUJPUlRFRCkiOworICAgIGNhc2UgMTAwNTQ6CisgICAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIChXU0FFQ09OTlJFU0VUKSI7CisgICAgY2FzZSAxMDA1NToKKyAgICAgICAgcmV0dXJuICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIChXU0FFTk9CVUZTKSI7CisgICAgY2FzZSAxMDA1NjoKKyAgICAgICAgcmV0dXJuICJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKFdTQUVJU0NPTk4pIjsKKyAgICBjYXNlIDEwMDU3OgorICAgICAgICByZXR1cm4gIlNvY2tldCBpcyBub3QgY29ubmVjdGVkIChXU0FFTk9UQ09OTikiOworICAgIGNhc2UgMTAwNTg6CisgICAgICAgIHJldHVybiAiQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24gKFdTQUVTSFVURE9XTikiOworICAgIGNhc2UgMTAwNTk6CisgICAgICAgIHJldHVybiAiVG9vIG1hbnkgcmVmZXJlbmNlcywgY2FuJ3Qgc3BsaWNlIChXU0FFVE9PTUFOWVJFRlMpIjsKKyAgICBjYXNlIDEwMDYwOgorICAgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IChXU0FFVElNRURPVVQpIjsKKyAgICBjYXNlIDEwMDYxOgorICAgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gcmVmdXNlZCAoV1NBRUNPTk5SRUZVU0VEKSI7CisgICAgY2FzZSAxMDA2MjoKKyAgICAgICAgcmV0dXJuICJUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3MgKFdTQUVMT09QKSI7CisgICAgY2FzZSAxMDA2MzoKKyAgICAgICAgcmV0dXJuICJGaWxlIG5hbWUgdG9vIGxvbmcgKFdTQUVOQU1FVE9PTE9ORykiOworICAgIGNhc2UgMTAwNjQ6CisgICAgICAgIHJldHVybiAiSG9zdCBpcyBkb3duIChXU0FFSE9TVERPV04pIjsKKyAgICBjYXNlIDEwMDY1OgorICAgICAgICByZXR1cm4gIk5vIFJvdXRlIHRvIEhvc3QgKFdTQUVIT1NUVU5SRUFDSCkiOworICAgIGNhc2UgMTAwNjY6CisgICAgICAgIHJldHVybiAiRGlyZWN0b3J5IG5vdCBlbXB0eSAoV1NBRU5PVEVNUFRZKSI7CisgICAgY2FzZSAxMDA2NzoKKyAgICAgICAgcmV0dXJuICJUb28gbWFueSBwcm9jZXNzZXMgKFdTQUVQUk9DTElNKSI7CisgICAgY2FzZSAxMDA2ODoKKyAgICAgICAgcmV0dXJuICJUb28gbWFueSB1c2VycyAoV1NBRVVTRVJTKSI7CisgICAgY2FzZSAxMDA2OToKKyAgICAgICAgcmV0dXJuICJEaXNjIFF1b3RhIEV4Y2VlZGVkIChXU0FFRFFVT1QpIjsKKyAgICBjYXNlIDEwMDcwOgorICAgICAgICByZXR1cm4gIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSAoV1NBRVNUQUxFKSI7CisgICAgY2FzZSAxMDA5MToKKyAgICAgICAgcmV0dXJuICJOZXR3b3JrIFN1YlN5c3RlbSBpcyB1bmF2YWlsYWJsZSAoV1NBU1lTTk9UUkVBRFkpIjsKKyAgICBjYXNlIDEwMDkyOgorICAgICAgICByZXR1cm4gIldJTlNPQ0sgRExMIFZlcnNpb24gb3V0IG9mIHJhbmdlIChXU0FWRVJOT1RTVVBQT1JURUQpIjsKKyAgICBjYXNlIDEwMDkzOgorICAgICAgICByZXR1cm4gIlN1Y2Nlc3NmdWwgV1NBU1RBUlRVUCBub3QgeWV0IHBlcmZvcm1lZCAoV1NBTk9USU5JVElBTElTRUQpIjsKKyAgICBjYXNlIDEwMDcxOgorICAgICAgICByZXR1cm4gIlRvbyBtYW55IGxldmVscyBvZiByZW1vdGUgaW4gcGF0aCAoV1NBRVJFTU9URSkiOworICAgIGNhc2UgMTEwMDE6CisgICAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQgKFdTQUhPU1RfTk9UX0ZPVU5EKSI7CisgICAgY2FzZSAxMTAwMjoKKyAgICAgICAgcmV0dXJuICJOb24tQXV0aG9yaXRhdGl2ZSBIb3N0IG5vdCBmb3VuZCAoV1NBVFJZX0FHQUlOKSI7CisgICAgY2FzZSAxMTAwMzoKKyAgICAgICAgcmV0dXJuICJOb24tUmVjb3ZlcmFibGUgZXJyb3JzOiBGT1JNRVJSLCBSRUZVU0VELCBOT1RJTVAgKFdTQU5PX1JFQ09WRVJZKSI7CisgICAgY2FzZSAxMTAwNDoKKyAgICAgICAgcmV0dXJuICJWYWxpZCBuYW1lLCBubyBkYXRhIHJlY29yZCBvZiByZXF1ZXN0ZWQgdHlwZSAoV1NBTk9fREFUQSkiOworI2lmIDAKKyAgICBjYXNlIDExMDA0OiAvKiB0eXBpY2FsbHksIG9ubHkgV1NBTk9fREFUQSBpcyByZXBvcnRlZCAqLworICAgICAgICByZXR1cm4gIk5vIGFkZHJlc3MsIGxvb2sgZm9yIE1YIHJlY29yZCAoV1NBTk9fQUREUkVTUykiOworI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZCBVU0VfV0lOMzIgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc3RyZXJyb3IoZXJybnVtKTsKKyAgICB9Cit9CisKKy8qIHJlcGxhY2Ugbm9uLVVURi04IGFuZCBub24tcHJpbnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoICcuJyAqLworTk9FWFBPUlQgdm9pZCBzYWZlc3RyaW5nKGNoYXIgKmMpIHsKKyAgICBmb3IoOyAqYzsgKytjKQorICAgICAgICBpZighKCpjJjB4ODAgfHwgaXNwcmludCgqYykpKQorICAgICAgICAgICAgKmM9Jy4nOworfQorCisvKiBlbmQgb2YgbG9nLmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWtlLmJhdCBiL3NyYy9tYWtlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYxMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21ha2UuYmF0CkBAIC0wLDAgKzEsOCBAQAorQGVjaG8gb2ZmDQorOjogcGRlbGFhZ2UgY29tbWVudGVkIDogbWFrZS5leGUgLWYgbWluZ3cubWFrICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorOjogb24gV2luZG93cywgbWFrZSBpcyBCb3JsYW5kIG1ha2UsIGJ1dCBtaW5ndy5tYWsgaXMgTk9XIG9ubHkgY29tcGF0aWJsZQ0KKzo6IHdpdGggZ251IG1ha2UgKGR1ZSB0byB2YXJpb3VzIGltcHJvdm1lbnRzIEkgbWFkZSwgZm9yIGNvbXBhdGliaWxpdHkgYmV0d2Vlbg0KKzo6IGxpbnV4IGFuZCBXaW5kb3dzIGhvc3QgZW52aXJvbm1lbnRzLg0KKzo6IGFuZCBlY2hvIE9GRiBpcyB0aGUgc2lnbiB3ZSBhcmUgSEVSRSBvbiBXaW5kb3dzLCBpc24ndCBpdD8uLi4NCisNCittaW5ndzMyLW1ha2UuZXhlIC1mIG1pbmd3Lm1hayAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWtlY2UuYmF0IGIvc3JjL21ha2VjZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkZDQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWtlY2UuYmF0CkBAIC0wLDAgKzEsNzMgQEAKK0BlY2hvIG9mZg0KKzo6IGNyZWF0ZWQgYnkgcGRlbGFhZ2Ugb24gMjAxMDA5MjgNCis6OiB1c2FnZSA6IG1ha2VjZSBBUk1WNHxYODZ8Li4uIG90aGVyIGNwdXM6IHNlZSBiYXQgc2NyaXB0cyBpbiBldmMvYmluDQorOjogICAgIGVnICBtYWtlY2UgWDg2LCBtYWtlY2UgWDg2IGNsZWFuDQorOjogICAgIG1ha2VjZSA8PT4gbWFrZWNlIEFSTVY0IGFsbA0KKzo6IE5FVkVSIERPIG1ha2VjZSBjbGVhbiAhIGJ1dCBtYWtlY2UgVEFSR0VUQ1BVIGNsZWFuICENCis6OiBOb3RlIDogYWRhcHQgRVZDL2Jpbi9XQ0U8dGFyZ2V0Pi5iYXQgc2NyaXB0cw0KK1RpdGxlIFdDRSBTVFVOTkVMDQorDQorOjogISEhISEhISEhISEhISENCis6OiBDVVNUT01JWkUgVEhJUyBhY2NvcmRpbmcgdG8geW91ciBFVkMgSU5TVEFMTEVEIEVOVklST05NRU5UDQorOjogISEhISEhISEhISEhISENCisNCitzZXQgT1NWRVJTSU9OPVdDRTQyMA0KK3NldCBQTEFURk9STT1TVEFOREFSRFNESw0KK3NldCBXQ0VST09UPUM6XFByb2dyYW0gRmlsZXNcTVNFVkM0DQorc2V0IFNES1JPT1Q9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU0RLcw0KKw0KKzo6ICEhISEhISEhISEhISEhISEhIQ0KKzo6IEVORCBDVVNUT01JWkFUSU9ODQorOjogISEhISEhISEhISEhISEhISEhDQorDQorOjogRGVmaW5lIFRBUkdFVCBDUFUgDQorOjogLS0tLS0tLS0tLS0tLS0tLS0NCisNCis6OiBkZWZpbmUgIm5ldyIgdGFyZ2V0ICh1c2VmdWwgaWYgb25lIHdhbnRzIHRvIGNvbXBpbGUgZm9yIHZhcmlvdXMgV0NFIHRhcmdldCBDUFVzKQ0KK2lmICIlMSI9PSIiIGVjaG8gIlVTQUdFIDogbWFrZWNlIFRBUkdFVENQVSBvdGhlcl9tYWtlX29wdGlvbnMuLi4iDQoraWYgIiUxIj09IiIgZWNobyAiVEFSR0VUQ1BVPShBUk1WNHxBUk1WNEl8QVJNVjRUfE1JUFMxNnxNSVBTSUl8TUlQU0lJX0ZQfE1JUFNJVnxNSVBTSVZfRlB8U0gzfFNINHxYODYpLCBvdGhlciBjcHU6IHNlZSBiYXQgc2NyaXB0cyBpbiBldmMvYmluIg0KK2lmICIlMSI9PSIiIGVjaG8gIiEhISBkbyBub3QgaGVzaXRhdGUgdG8gYWRhcHQgZXZjLm1hayBmb3IgQ1BVIGFuZC9vciBiZXR0ZXIgY29tcGlsYXRpb24gZmxhZ3MgISEhIg0KK2lmICIlMSI9PSIiIGV4aXQgL0INCisNCis6OiBvbGQgY29kZSB0byBkZWZhdWx0IHRvIEFSTVY0LCBidXQgaXQgaXMgYmV0dGVyIHRoYXQgdXNlcnMgYXJlIFdBUk5FRCB0aGF0IHRoZSBzY3JpcHQgbm93IG5lZWQgYW4gZXhwbGljaXQgdGFyZ2V0IQ0KKzo6aWYgIiUxIj09IiIgc2V0IE5FV1RHVENQVT1BUk1WNA0KKw0KK2lmIE5PVCBERUZJTkVEIFRBUkdFVENQVSBzZXQgVEFSR0VUQ1BVPVhYWFhYDQoraWYgTk9UICIlMSI9PSIiIHNldCBORVdUR1RDUFU9JTENCitpZiBOT1QgIiUxIj09IiIgc2hpZnQNCisNCitlY2hvIFdDRSBUQVJHRVQgQ1BVIGlzICVORVdUR1RDUFUlDQorDQorcmVtIEFkanVzdCBNUyBFVkMgZW52IHZhcnMNCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK3JlbSBDaGVjayBNU2VudiB2YXJzIGFnYWluc3Qgb3VyIHJlZiB2YWx1ZXMNCisNCitzZXQgaXNlbnZvaz0wDQoraWYgIiVORVdUR1RDUFUlIj09IiVUQVJHRVRDUFUlIiAgc2V0IC9BICJpc2Vudm9rKz0xIg0KKw0KK2lmICVpc2Vudm9rJT09MSBlY2hvIFdDRSBFTlZJUk9OTUVOVCBPSw0KK2lmICVpc2Vudm9rJT09MSBnb3RvIGVudmlzb2sNCisNCis6OiB1c2VsZXNzIHNpbmNlIHNlcGFyYXRlZCB0Z3QgZm9sZGVycw0KKzo6ZWNobyBXQ0UgVEFSR0VUIENQVSBjaGFuZ2VkLCBkZXN0cm95aW5nIGV2ZXJ5IG9iaiBmaWxlcw0KKzo6ZGVsIC5cKi5vYmoNCisNCis6OiBpZiBlbnYgaXMgTk9UIG9rLCBhZGp1c3QgTVMgRVZDIGVudiB2YXJzIHRvIGJlIHVzZWQgYnkgTVMgV0NFPENQVT4uQkFUDQorOjogKHRoaXMgaXMgdG8gYXZvaWQgcmVwZXRpdGl2ZSBwb2xsdXRpb24gb2YgUEFUSCkNCisNCitlY2hvIFdDRSBFTlZJUk9OTUVOVCBBREpVU1RFRA0KKw0KKzo6IGNhbGwgIiVXQ0VST09UJVxFVkNcV0NFNDIwXEJJTlxXQ0UlTkVXVEdUQ1BVJS5CQVQiDQorY2FsbCAiJVdDRVJPT1QlXEVWQ1wlT1NWRVJTSU9OJVxiaW5cV0NFJU5FV1RHVENQVSUuQkFUIg0KKw0KK3NldCBUQVJHRVRDUFU9JU5FV1RHVENQVSUNCisNCis6ZW52aXNvaw0KKw0KKzo6ZXhpdCAvQg0KKw0KK3JlbSBtYWtlIGV2ZXJ5dGhpbmcNCityZW0gLS0tLS0tLS0tLS0tLS0tDQorDQorbm1ha2UgL05PTE9HTyAtZiBldmMubWFrICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQpkaWZmIC0tZ2l0IGEvc3JjL21ha2V3MzIuYmF0IGIvc3JjL21ha2V3MzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzc3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFrZXczMi5iYXQKQEAgLTAsMCArMSw0NSBAQAorQGVjaG8gb2ZmDQorVElUTEUgVzMyIFNUVU5ORUwgDQorOjpwZGVsYWFnZSAyMDEwMTAyNjogZm9yIHVzZSB3aXRoIE1TIFZDZXhwcmVzcyAyMDA4ICh2OSkNCis6OnNvbWUgdHJpY2sgdG8gYXZvaWQgcmUtcG9sbHV0aW9uIG9mIGVudiB2YXJzIGFzIG11Y2ggYXMgcG9zc2libGUNCisNCis6OiBJbiBtdWx0aXRhcmdldCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCwgaXQgaXMgYmV0dGVyIHRvIG9wZW4gYSBuZXcgY21kLmV4ZSB3aW5kb3cNCis6OiB0byBhdm9pZCBwb2xsdXRpb24gb2YgUEFUSCBmcm9tLCBlZywgc29tZSBwcmV2aW91cyBXQ0UgY29tcGlsYXRpb24gYXR0ZW1wdHMuDQorDQorc2V0IE5FV1RHVENQVT1XMzINCisNCityZW0gQWRqdXN0IE1TIFZDIGVudiB2YXJzDQorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK3JlbSBDaGVjayBNU2VudiB2YXJzIGFnYWluc3Qgb3VyIHJlZiB2YWx1ZXMNCisNCitzZXQgaXNlbnZvaz0wDQoraWYgTk9UIERFRklORUQgVEFSR0VUQ1BVIHNldCBUQVJHRVRDUFU9WFhYWFgNCitpZiAiJU5FV1RHVENQVSUiPT0iJVRBUkdFVENQVSUiICBzZXQgL0EgImlzZW52b2srPTEiDQorDQoraWYgJWlzZW52b2slPT0xIGVjaG8gVzMyIEVOVklST05NRU5UIE9LDQoraWYgJWlzZW52b2slPT0xIGdvdG8gZW52aXNvaw0KKw0KKzo6IHVzZWxlc3Mgc2luY2Ugc2VwYXJhdGVkIHRndCBmb2xkZXJzDQorOjplY2hvIFczMiBUQVJHRVQgQ1BVIGNoYW5nZWQsIGRlc3Ryb3lpbmcgZXZlcnkgb2JqIGZpbGVzDQorOjpkZWwgLlwqLm9iag0KKw0KKzo6IGlmIGVudiBpcyBOT1Qgb2ssIGFkanVzdCBNUyBWQyBlbnYgdmFycyB0byBiZSB1c2VkIGJ5IE1TIFZDDQorOjogKHRoaXMgaXMgdG8gYXZvaWQgcmVwZXRpdGl2ZSBwb2xsdXRpb24gb2YgUEFUSCkNCisNCitlY2hvIFczMiBFTlZJUk9OTUVOVCBBREpVU1RFRA0KKw0KKzo6IHJlc2V0IG9mIElOQ0xVREUgbmVlZGVkIGJlY2F1c2Ugb2YgYWNjdW11bGF0aW9uIG9mIGluY2x1ZGVzIGluIHZjdmFyczMyDQorDQorc2V0IElOQ0xVREU9DQorDQorY2FsbCAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA5LjBcVkNcYmluXHZjdmFyczMyLmJhdCINCisNCitzZXQgVEFSR0VUQ1BVPSVORVdUR1RDUFUlDQorDQorOmVudmlzb2sNCisNCityZW0gbWFrZSBldmVyeXRoaW5nDQorcmVtIC0tLS0tLS0tLS0tLS0tLQ0KKw0KK25tYWtlLmV4ZSAtZiB2Yy5tYWsgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCmRpZmYgLS1naXQgYS9zcmMvbWluZ3cubWFrIGIvc3JjL21pbmd3Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFhYWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pbmd3Lm1hawpAQCAtMCwwICsxLDE2MyBAQAorIyBTaW1wbGUgTWFrZWZpbGUudzMyIGZvciBzdHVubmVsLmV4ZSBieSBNaWNoYWwgVHJvam5hcmEgMTk5OC0yMDA3CisjCisjIE1vZGlmaWVkIGJ5IEJyaWFuIEhhdGNoICAoYnJpQHN0dW5uZWwub3JnKQorIyAyMDEwMTAzMCBwZGVsYWFnZToKKyMgKyBtdWx0aS1IT1NUIG1hbmFnZW1lbnQgKGlmIHVzZWQgb24gV2luZG93cyBob3N0IG9yIExpbnV4IEhvc3QpCisjICsgbGFjayBvZiBnbnUtd2luMzIgKHJtKSBkZXRlY3Rpb24KKyMgbm90ZTogcm0gaXMgdXNlZCBJTlRFUk5BTExZIGJ5IGdjYyBmb3IgZGVsZXRpb24gaWYgaW50ZXJtZWRpYXRlIGZpbGVzLgorCisjIFRoaXMgbWFrZWZpbGUgaXMgb25seSB0ZXN0ZWQgb24gdGhlIG1pbmd3IGNvbXBpbGVyLiAgTWluZ3cgY2FuIHN1Y2Nlc3NmdWxseQorIyBjb21waWxlIGJvdGggb3BlbnNzbCBhbmQgc3R1bm5lbC4gIElmIHlvdSB3YW50IHRvIHVzZSBhbm90aGVyIGNvbXBpbGVyLCBnaXZlCisjIGl0IGEgc2hvdCwgYW5kIHRlbGwgdXMgaG93IGl0IHdlbnQuCisKKyMgcGRlbGFhZ2UgOiBUSElTIG1ha2VmaWxlIGNhbiBiZSB1c2VkIHdpdGggbWluZ3ctbWFrZSBvbiBXaW5kb3dzIG9yIGdudSBtYWtlCisjIG9uIExpbnV4LCB0byBwcm9kdWNlIHRoZSBXaW4zMiB2ZXJzaW9uIG9mIHN0dW5uZWwgKHRhcmdldCBpcyB3aW4zMikuICBJdAorIyByZXF1aXJlcywgb24gV2luZG93cywgdGhlIHVzZSBvZiBnbnUtd2luMzIgdG9vbHM6IHJtLCBta2Rpciwgcm1kaXIgdGhhdAorIyBtYW5hZ2VzIGZpbGVzIGFuZCBkaXJzIEJPVEggb24gbGludXggYW5kIFdpbmRvd3Mgd2l0aCAvIGFzIHBhdGggc2VwYXJhdG9yLgorIyBOb3RlOiBOYXRpdmUgd2luZG93cyBlcXVpdmFsZW50LCBkZWwgYW5kIG1rZGlyL3JtZGlyLCBiYWRseSBtYW5hZ2UgLyBhbmQgXCwKKyMgc28gdGhleSBjYW5ub3QgYmUgdXNlZCBoZXJlLgorIyBPbiBXaW5kb3dzIGhvc3QsIGRvd25sb2FkOgorIyBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L2Rvd25saW5rcy9jb3JldXRpbHMucGhwCisjIGlmIHlvdSBoYXZlIGZvcmdvdHRlbiB0aGlzLCB0aGlzIG1ha2VmaWxlIHdpbGwgcmVtaW5kIHlvdS4uLgorIAorIyBNb2RpZnkgdGhpcyB0byBwb2ludCB0byB5b3VyIGFjdHVhbCBvcGVuc3NsIGNvbXBpbGUgZGlyZWN0b3J5CisjIChZb3UgZGlkIGFscmVhZHkgY29tcGlsZSBvcGVuc3NsLCBkaWRuJ3QgeW91Pz8/KQorU1NMRElSPS4uL29wZW5zc2wtMS4wLjBmCisjU1NMRElSPUM6L1VzZXJzL3N0YW5kYXJkL0RvY3VtZW50cy9EdnRzL0NvbnRyaWIvb3BlbnNzbC92MS4wLjBjL3BhdGNoZWQzCisKKyMgYzpcLCBiYWNrc2xhc2ggaXMgbm90IGNvcnJlY3RseSByZWNvZ25pemVkIGJ5IG1pbmd3MzItbWFrZSwgcHJvZHVjZXMgc29tZQorIyAibWlzc2luZyBzZXBhcmF0b3IiIGlzc3VlLgorIyBwZGVsYWFnZTogc2ltcGxlIHRyaWNrIHRvIGRldGVjdCBpZiB3ZSBhcmUgdXNpbmcgbWluZ3ctZ2NjIG9uIGEgV2luZG93cyBob3N0LAorIyBvciBvbiBhIGxpbnV4IGhvc3QuICB3aW5kaXIgaXMgYSBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGUgb24gd2luZG93cyBOVAorIyBhbmQgYWJvdmUsIGFuZCB0aGVuIHJlZGVmaW5lIHNvbWUgbWFjcm9zLgorIyBub3RlOiBpZmRlZiBpcyAhSUZERUYgaW4gTVMgbm1ha2Ugb3IgQm9ybGFuZCBtYWtlLgorIyAgICAgICAkKGluZm8gaXMgIU1FU1NBR0UgaW4gTVMgbm1ha2Ugb3IgQm9ybGFuZCBtYWtlLgorCitpZmRlZiB3aW5kaXIKKyQoaW5mbyAgaG9zdCBtYWNoaW5lIGlzIGEgV2luZG93cyBtYWNoaW5lICkKK05VTExERVY9TlVMCitNS0RJUj0iQzpcUHJvZ3JhbSBGaWxlc1xHbnVXaW4zMlxiaW5cbWtkaXIuZXhlIgorREVMRklMRVM9IkM6XFByb2dyYW0gRmlsZXNcR251V2luMzJcYmluXHJtLmV4ZSIgLWYKK0RFTERJUj0iQzpcUHJvZ3JhbSBGaWxlc1xHbnVXaW4zMlxiaW5ccm0uZXhlIiAtcmYKK2Vsc2UKKyQoaW5mbyAgaG9zdCBtYWNoaW5lIGlzIGEgbGludXggbWFjaGluZSApCitOVUxMREVWPS9kZXYvbnVsbAorTUtESVI9bWtkaXIKK0RFTEZJTEVTPXJtIC1mCitERUxESVI9cm0gLXJmCitlbmRpZgorCitUQVJHRVRDUFU9TUdXMzIKK1NSQz0uLi9zcmMKK09CSlJPT1Q9Li4vb2JqCitPQko9JChPQkpST09UKS8kKFRBUkdFVENQVSkKK0JJTlJPT1Q9Li4vYmluCitCSU49JChCSU5ST09UKS8kKFRBUkdFVENQVSkKKworT0JKUz0kKE9CSikvc3R1bm5lbC5vICQoT0JKKS9zc2wubyAkKE9CSikvY3R4Lm8gJChPQkopL3ZlcmlmeS5vIFwKKwkkKE9CSikvZmlsZS5vICQoT0JKKS9jbGllbnQubyAkKE9CSikvcHJvdG9jb2wubyAkKE9CSikvc3RocmVhZHMubyBcCisJJChPQkopL2xvZy5vICQoT0JKKS9vcHRpb25zLm8gJChPQkopL25ldHdvcmsubyAkKE9CSikvcmVzb2x2ZXIubyBcCisJJChPQkopL3VpX3dpbl9ndWkubyAkKE9CSikvcmVzb3VyY2VzLm8gJChPQkopL3N0ci5vICQoT0JKKVx0bHMub2JqIFwKKwkkKE9CSikvZmQubyAkKE9CSikvZGhwYXJhbS5vICQoT0JKKS9jcm9uLm8KKworQ0M9Z2NjCitSQz13aW5kcmVzCisKKyMgcGRlbGFhZ2Ugbm90ZTogYXMgYSB3b3JrYXJvdW5kIGZvciB3aW5kcmVzIGJ1ZyBvbiByZXNvdXJjZXMucmMsIGVxdWl2YWxlbnQgdG8KKyMgInVzZSBhIHRlbXAgZmlsZSBpbnN0ZWFkIG9mIHBvcGVuIiBvcHRpb24gYmV0d2VlbiBjcHAgYW5kIHdpbmRyZXMhCitSQ1A9Z2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VECisKK0RFRklORVM9LURfV0lOMzJfV0lOTlQ9MHgwNTAxCisKKyMgc29tZSBwcmVwcm9jZXNzaW5nIGRlYnVnIDogJChpbmZvICBERUZJTkVTIGlzICQoREVGSU5FUykgKQorCisjQ0ZMQUdTPS1nIC1PMiAtV2FsbCAkKERFRklORVMpIC1JJChTU0xESVIpL291dGluYworI3BkZWxhYWdlIDogb3V0aW5jIG5vdCBjb3JyZWN0LCBpdCBpcyBpbmMzMiEKK0NGTEFHUz0tZyAtTzIgLVdhbGwgJChERUZJTkVTKSAtSSQoU1NMRElSKS9pbmMzMgorCisjIFJGTEFHUywgbm90ZSBvZiBwZGVsYWFnZTogd2luZHJlcyBhY2NlcHRzIC1mbyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1zIHRvb2xzCisjIGRlZmF1bHQgb3B0aW9ucyA6IC1KIHJjIC1PIGNvZmYsIGlucHV0IHJjIGZpbGUsIG91dHB1dCBjb2ZmIGZpbGUuCisKK1JGTEFHUz0tdiAtLXVzZS10ZW1wLWZpbGUgJChERUZJTkVTKQorIyBmb2xsb3dpbmcgUkZMQUdTMiB1c2VmdWwgaWYgb25lIGRheSB1c2UtdGVtcC1maWxlIGRvZXMgbm90IGV4aXN0IGFueW1vcmUgCitSRkxBR1MyPS12ICQoREVGSU5FUykKK0xERkxBR1M9LXMKKworIyBMSUJTPS1MJChTU0xESVIpL291dCAtbHNzbCAtbGNyeXB0byAtbHdzb2NrMzIgLWxnZGkzMiAtbGNyeXB0MzIKKyMyMDEwMTAzMCBwZGVsYWFnZSBmaXggd2luc29jazIgYW5kIEJBRCBzc2xwYXRoICAhIExJQlM9LUwkKFNTTERJUikvb3V0IC1semRsbCAtbGVheTMyIC1sc3NsMzIgLWx3c29jazMyIC1sZ2RpMzIgLWxjcnlwdDMyCisjIGFkZGVkIGxpYmVheSBpbnN0ZWFkIG9mIGVheSwgc3NsZWF5IGluc3RlYWQgb2Ygc3NsMzIsIHN1cHByZXNzZWQgemRsbCB1c2VsZXNzLgorTElCUz0tTCQoU1NMRElSKS9vdXQzMmRsbCAtbHNzbGVheTMyIC1sbGliZWF5MzIgLWx3czJfMzIgLWxwc2FwaSAtbGdkaTMyIC1sY3J5cHQzMgorIyBJTVBPUlRBTlQgcGRlbGFhZ2UgOiByZXN0b3JlIHRoaXMgaWYgeW91IG5lZWQgKGJ1dCBJIGRvIG5vdCBzZWUgd2h5KSAtbHpkbGwKKworJChPQkopLyUubzogJChTUkMpLyUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyRAIC1jICQ8CisKKyQoT0JKKS8lLm86ICQoU1JDKS8lLmNwcAorCSQoQ0MpICQoQ0ZMQUdTKSAtbyRAIC1jICQ8CisJCiskKE9CSikvJS5vOiAkKFNSQykvJS5yYworCSQoUkMpICQoUkZMQUdTKSAtbyRAICQ8CisKKyMgcGRlbGFhZ2UgOiB0cmljayBmb3Igd2luZHJlcyBwcmVwcm9jZXNzaW5nIHBvcGVuIGJ1ZyBvbiBXaW5kb3dzLCBpbiBjYXNlIHRoZSB3aW5kcmVzIG9wdGlvbgorIyB1c2VfdGVtcF9maWxlIGRpc2FwcGVhciBvbmUgZGF5Li4uCisjIGNvbW1lbnQgb3V0IHRoZSAkKFJDKSBydWxlIGFib3ZlIHRvIGFjdGl2YXRlIHRoZSBmb2xsb3dpbmcgCisKKyQoT0JKKS8lLnJjcDogJChTUkMpLyUucmMKKwkkKFJDUCkgJChERUZJTkVTKSAtbyRAICQ8CisJCiskKE9CSikvJS5vOiAkKE9CSikvJS5yY3AKKwkkKFJDKSAkKFJGTEFHUzIpIC1vJEAgJDwKKworIyBOb3RlIDogZ251LW1ha2Ugd2lsbCBhdXRvbWF0aWNhbGx5IFJNIHRoZSBpbnRlcm1lZGlhdGUgInJjcCIgZmlsZSAKKyMgQlVUIGl0IHdpbGwgQUJTT0xVVEVMWSBORUVEIHRoZSAicm0iIGNvbW1hbmQgYXZhaWxhYmxlIDogbm90IGEgcHJvYmxlbSBvbiBsaW51eAorIyBidXQgb24gYSB3aW5kb3dzIGRldiBob3N0IG1hY2hpbmUsIG9uZSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBnbnUtd2luMzIvcm0gY29tbWFuZAorIyBpbiB0aGUgc3lzdGVtLi4uCisjIGZvciBkZWJ1ZyBvZiB0aGUgcHJlcHJvY2Vzc2VkIHJjcCBmaWxlLCBiZWNhdXNlIGl0IGlzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCBieSBnbnUtbWFrZToJY3AgJDwgJDwuMgorCithbGw6IHRlc3RlbnYgbWFrZWRpcnMgJChCSU4pL3N0dW5uZWwuZXhlCisKKyNwZGVsYWFnZSA6IHRlc3RlbnYgcHVycG9zZSBpcyB0byBkZXRlY3QsIG9uIHdpbmRvd3MsIHdoZXRoZXIgR251LXdpbjMyIGhhcyBiZWVuIHByb3Blcmx5IGluc3RhbGxlZC4uLgorIyBhIGZpcnN0IGNhbGwgdG8gInRydWUiIGlzIG1hZGUgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSwgYSBzZWNvbmQgaXMgbWFkZSB0byBzdG9wIHRoZSBtYWtlIHByb2Nlc3MuCitpZmRlZiB3aW5kaXIKK3Rlc3RlbnY6CisJLUAgZWNobyBPRkYKKwktQCB0cnVlID4kKE5VTExERVYpIDI+JjEgfHwgZWNobyBZb3UgTVVTVCBpbnN0YWxsIEdudS1XaW4zMiBjb3JldXRpbHMgXAorCWZyb20gaHR0cDovL2dudXdpbjMyLnNvdXJjZWZvcmdlLm5ldC9kb3dubGlua3MvY29yZXV0aWxzLnBocCBcCisJYW5kIHNldCBQQVRIIHRvIGluY2x1ZGUgQzpcUHJvZ3JhbSBGaWxlc1xHbnVXaW4zMlxiaW4KKwlAdHJ1ZSA+JChOVUxMREVWKSAyPiYxCitlbHNlCit0ZXN0ZW52OgorCS1AIHRydWUgPiQoTlVMTERFVikgMj4mMSB8fCBlY2hvIFlvdXIgc3lzdGVtIGxhY2tzIEdudSBjb3JldXRpbHMgdG9vbHMgISEhCisJQHRydWUgPiQoTlVMTERFVikgMj4mMQorZW5kaWYKKwkKK2NsZWFuOiAKKwktQCAkKERFTEZJTEVTKSAkKE9CSikvKi5vCisJLUAgJChERUxGSUxFUykgJChCSU4pL3N0dW5uZWwuZXhlID4kKE5VTExERVYpIDI+JjEKKwktQCAkKERFTERJUikgJChPQkopICAgPiQoTlVMTERFVikgMj4mMQorCS1AICQoREVMRElSKSAkKEJJTikgICA+JChOVUxMREVWKSAyPiYxCisKK21ha2VkaXJzOgorCS1AICQoTUtESVIpICQoT0JKUk9PVCkgPiQoTlVMTERFVikgMj4mMQorCS1AICQoTUtESVIpICQoT0JKKSA+JChOVUxMREVWKSAyPiYxCisJLUAgJChNS0RJUikgJChCSU5ST09UKSA+JChOVUxMREVWKSAyPiYxCisJLUAgJChNS0RJUikgJChCSU4pID4kKE5VTExERVYpIDI+JjEKKworIyBwc2V1ZG8tdGFyZ2V0IGZvciBSQy1wcmVwcm9jZXNzb3IgZGVidWdnaW5nICAKKyMgcmVzdWx0IGFwcGVhcnMgT0ssIGFzIGEgdGV4dCBmaWxlCitmYWtldGVzdDoKKwlnY2MgLUUgLXhjLWhlYWRlciAtRFJDX0lOVk9LRUQgJChERUZJTkVTKSAtbyAkKFNSQykvcmVzb3VyY2VzLnJjcCAkKFNSQykvcmVzb3VyY2VzLnJjICAKKworJChPQkpTKTogKi5oIG1pbmd3Lm1haworCiskKEJJTikvc3R1bm5lbC5leGU6ICQoT0JKUykKKwkkKENDKSAkKExERkxBR1MpIC1vICQoQklOKS9zdHVubmVsLmV4ZSAkKE9CSlMpICQoTElCUykgLW13aW5kb3dzCisKKyMgIm1pc3Npbmcgc2VwYXJhdG9yIiBpc3N1ZSB3aXRoIG1pbmd3MzItbWFrZTogdGFicyBNVVNUIEJFIFRBQlMgaW4geW91ciB0ZXh0CisjIGVkaXRvciwgYW5kIG5vdCBzZXQgb2Ygc3BhY2VzIGV2ZW4gaWYgeW91ciBkZXZlbG9wbWVudCBob3N0IGlzIHdpbmRvd3MuCisjIFNvbWUgXCBhcmUgYmFkbHkgdG9sZXJhdGVkIGJ5IG1pbmd3MzItbWFrZSAiISIgZGlyZWN0aXZlcywgZWcgYXMgIUlGLAorIyBhY2NlcHRlZCBpbiBNUyBubWFrZSBhbmQgQm9ybGFuZCBtYWtlIEFSRSBOT1Qgc3VwcG9ydGVkIGJ5IGdudSBtYWtlIGJ1dCB0aGV5CisjIGFsbCBoYXZlIHRoZWlyIGVxdWl2YWxlbnRzLgorIyBHbnUtbWFrZSBpcyBjYXNlIHNlbnNpdGl2ZSwgd2hpbGUgbXMgbm1ha2Ugb3IgYm9ybGFuZCBtYWtlIGFyZSBub3QuIEFueXdheSwKKyMgb24gcmVmZXJlbmNlIHRvIGVudiB2YXJzIG5tYWtlIGNvbnZlcnQgZW52IHZhcnMgdG8gVVBQRVJDQVNFIG1hY3JvIG5hbWVzLi4uCisKZGlmZiAtLWdpdCBhL3NyYy9uZXR3b3JrLmMgYi9zcmMvbmV0d29yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmV0d29yay5jCkBAIC0wLDAgKzEsODU4IEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogYnlwYXNzIGF1dG9tYXRpYyBpbmRleCBib3VuZCBjaGVja3MgaW4gdGhlIEZEX1NFVCgpIG1hY3JvICovCisjZGVmaW5lIEZEX1NFVFNJWkUgMTAwMDAwMAorI2VuZGlmCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKy8qICNkZWZpbmUgREVCVUdfVUNPTlRFWFQgKi8KKworTk9FWFBPUlQgdm9pZCBzX3BvbGxfcmVhbGxvYyhzX3BvbGxfc2V0ICopOworTk9FWFBPUlQgaW50IGdldF9zb2NrZXRfZXJyb3IoY29uc3QgU09DS0VUKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc19wb2xsIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgVVNFX1BPTEwKKworc19wb2xsX3NldCAqc19wb2xsX2FsbG9jKCkgeworICAgIC8qIGl0IG5lZWRzIHRvIGJlIGZpbGxlZCB3aXRoIHplcm9zICovCisgICAgcmV0dXJuIHN0cl9hbGxvYyhzaXplb2Yoc19wb2xsX3NldCkpOworfQorCit2b2lkIHNfcG9sbF9mcmVlKHNfcG9sbF9zZXQgKmZkcykgeworICAgIGlmKGZkcykgeworICAgICAgICBzdHJfZnJlZShmZHMtPnVmZHMpOworICAgICAgICBzdHJfZnJlZShmZHMpOworICAgIH0KK30KKwordm9pZCBzX3BvbGxfaW5pdChzX3BvbGxfc2V0ICpmZHMpIHsKKyAgICBmZHMtPm5mZHM9MDsKKyAgICBmZHMtPmFsbG9jYXRlZD00OyAvKiBwcmVhbGxvYyA0IGZpbGUgZGVzY2lwdG9ycyAqLworICAgIHNfcG9sbF9yZWFsbG9jKGZkcyk7Cit9CisKK3ZvaWQgc19wb2xsX2FkZChzX3BvbGxfc2V0ICpmZHMsIFNPQ0tFVCBmZCwgaW50IHJkLCBpbnQgd3IpIHsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yKGk9MDsgaTxmZHMtPm5mZHMgJiYgZmRzLT51ZmRzW2ldLmZkIT1mZDsgaSsrKQorICAgICAgICA7CisgICAgaWYoaT09ZmRzLT5uZmRzKSB7IC8qIG5vdCBmb3VuZCAqLworICAgICAgICBpZihpPT1mZHMtPmFsbG9jYXRlZCkgeworICAgICAgICAgICAgZmRzLT5hbGxvY2F0ZWQ9aSsxOworICAgICAgICAgICAgc19wb2xsX3JlYWxsb2MoZmRzKTsKKyAgICAgICAgfQorICAgICAgICBmZHMtPnVmZHNbaV0uZmQ9ZmQ7CisgICAgICAgIGZkcy0+dWZkc1tpXS5ldmVudHM9MDsKKyAgICAgICAgZmRzLT5uZmRzKys7CisgICAgfQorICAgIGlmKHJkKSB7CisgICAgICAgIGZkcy0+dWZkc1tpXS5ldmVudHN8PVBPTExJTjsKKyNpZmRlZiBQT0xMUkRIVVAKKyAgICAgICAgZmRzLT51ZmRzW2ldLmV2ZW50c3w9UE9MTFJESFVQOworI2VuZGlmCisgICAgfQorICAgIGlmKHdyKQorICAgICAgICBmZHMtPnVmZHNbaV0uZXZlbnRzfD1QT0xMT1VUOworfQorCit2b2lkIHNfcG9sbF9yZW1vdmUoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yKGk9MDsgaTxmZHMtPm5mZHMgJiYgZmRzLT51ZmRzW2ldLmZkIT1mZDsgaSsrKQorICAgICAgICA7CisgICAgaWYoaTxmZHMtPm5mZHMpIHsgLyogZm91bmQgKi8KKyAgICAgICAgbWVtbW92ZShmZHMtPnVmZHMraSwgZmRzLT51ZmRzK2krMSwKKyAgICAgICAgICAgIChmZHMtPm5mZHMtaS0xKSpzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworICAgICAgICBmZHMtPm5mZHMtLTsKKyAgICB9Cit9CisKK2ludCBzX3BvbGxfY2FucmVhZChzX3BvbGxfc2V0ICpmZHMsIFNPQ0tFVCBmZCkgeworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IoaT0wOyBpPGZkcy0+bmZkczsgaSsrKQorICAgICAgICBpZihmZHMtPnVmZHNbaV0uZmQ9PWZkKQorICAgICAgICAgICAgcmV0dXJuIGZkcy0+dWZkc1tpXS5yZXZlbnRzJihQT0xMSU58UE9MTEVSUik7CisgICAgcmV0dXJuIDA7IC8qIG5vdCBsaXN0ZWQgaW4gZmRzICovCit9CisKK2ludCBzX3BvbGxfY2Fud3JpdGUoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yKGk9MDsgaTxmZHMtPm5mZHM7IGkrKykKKyAgICAgICAgaWYoZmRzLT51ZmRzW2ldLmZkPT1mZCkKKyAgICAgICAgICAgIHJldHVybiBmZHMtPnVmZHNbaV0ucmV2ZW50cyYoUE9MTE9VVHxQT0xMRVJSKTsKKyAgICByZXR1cm4gMDsgLyogbm90IGxpc3RlZCBpbiBmZHMgKi8KK30KKworLyogYmVzdCBkb2M6IGh0dHA6Ly9seHIuZnJlZS1lbGVjdHJvbnMuY29tL3NvdXJjZS9uZXQvaXB2NC90Y3AuYyNMNDU2ICovCisKK2ludCBzX3BvbGxfaHVwKHNfcG9sbF9zZXQgKmZkcywgU09DS0VUIGZkKSB7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvcihpPTA7IGk8ZmRzLT5uZmRzOyBpKyspCisgICAgICAgIGlmKGZkcy0+dWZkc1tpXS5mZD09ZmQpCisgICAgICAgICAgICByZXR1cm4gZmRzLT51ZmRzW2ldLnJldmVudHMmUE9MTEhVUDsgLyogcmVhZCBhbmQgd3JpdGUgY2xvc2VkICovCisgICAgcmV0dXJuIDA7IC8qIG5vdCBsaXN0ZWQgaW4gZmRzICovCit9CisKK2ludCBzX3BvbGxfcmRodXAoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yKGk9MDsgaTxmZHMtPm5mZHM7IGkrKykKKyAgICAgICAgaWYoZmRzLT51ZmRzW2ldLmZkPT1mZCkKKyNpZmRlZiBQT0xMUkRIVVAKKyAgICAgICAgICAgIHJldHVybiBmZHMtPnVmZHNbaV0ucmV2ZW50cyZQT0xMUkRIVVA7IC8qIHJlYWQgY2xvc2VkICovCisjZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZkcy0+dWZkc1tpXS5yZXZlbnRzJlBPTExIVVA7IC8qIHJlYWQgYW5kIHdyaXRlIGNsb3NlZCAqLworI2VuZGlmCisgICAgcmV0dXJuIDA7IC8qIG5vdCBsaXN0ZWQgaW4gZmRzICovCit9CisKK05PRVhQT1JUIHZvaWQgc19wb2xsX3JlYWxsb2Moc19wb2xsX3NldCAqZmRzKSB7CisgICAgZmRzLT51ZmRzPXN0cl9yZWFsbG9jKGZkcy0+dWZkcywgZmRzLT5hbGxvY2F0ZWQqc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKK30KKwordm9pZCBzX3BvbGxfZHVtcChzX3BvbGxfc2V0ICpmZHMsIGludCBsZXZlbCkgeworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IoaT0wOyBpPGZkcy0+bmZkczsgaSsrKQorICAgICAgICBzX2xvZyhsZXZlbCwgImZkPSVkIGV2ZW50cz0weCVYIHJldmVudHM9MHglWCIsCisgICAgICAgICAgICBmZHMtPnVmZHNbaV0uZmQsIGZkcy0+dWZkc1tpXS5ldmVudHMsIGZkcy0+dWZkc1tpXS5yZXZlbnRzKTsKK30KKworI2lmZGVmIFVTRV9VQ09OVEVYVAorCisvKiBtb3ZlIHJlYWR5IGNvbnRleHRzIGZyb20gd2FpdGluZyBxdWV1ZSB0byByZWFkeSBxdWV1ZSAqLworTk9FWFBPUlQgdm9pZCBzY2FuX3dhaXRpbmdfcXVldWUodm9pZCkgeworICAgIGludCByZXR2YWw7CisgICAgQ09OVEVYVCAqY29udGV4dCwgKnByZXY7CisgICAgaW50IG1pbl90aW1lb3V0OworICAgIHVuc2lnbmVkIG5mZHMsIGk7CisgICAgdGltZV90IG5vdzsKKyAgICBzdGF0aWMgdW5zaWduZWQgbWF4X25mZHM9MDsKKyAgICBzdGF0aWMgc3RydWN0IHBvbGxmZCAqdWZkcz1OVUxMOworCisgICAgdGltZSgmbm93KTsKKyAgICAvKiBjb3VudCBmaWxlIGRlc2NyaXB0b3JzICovCisgICAgbWluX3RpbWVvdXQ9LTE7IC8qIGluZmluaXR5ICovCisgICAgbmZkcz0wOworICAgIGZvcihjb250ZXh0PXdhaXRpbmdfaGVhZDsgY29udGV4dDsgY29udGV4dD1jb250ZXh0LT5uZXh0KSB7CisgICAgICAgIG5mZHMrPWNvbnRleHQtPmZkcy0+bmZkczsKKyAgICAgICAgaWYoY29udGV4dC0+ZmluaXNoPj0wKSAvKiBmaW5pdGUgdGltZSAqLworICAgICAgICAgICAgaWYobWluX3RpbWVvdXQ8MCB8fCBtaW5fdGltZW91dD5jb250ZXh0LT5maW5pc2gtbm93KQorICAgICAgICAgICAgICAgIG1pbl90aW1lb3V0PQorICAgICAgICAgICAgICAgICAgICAoaW50KShjb250ZXh0LT5maW5pc2gtbm93PDAgPyAwIDogY29udGV4dC0+ZmluaXNoLW5vdyk7CisgICAgfQorICAgIC8qIHNldHVwIHVmZHMgc3RydWN0dXJlICovCisgICAgaWYobmZkcz5tYXhfbmZkcykgeyAvKiBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5ICovCisgICAgICAgIHVmZHM9c3RyX3JlYWxsb2ModWZkcywgbmZkcypzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworICAgICAgICBtYXhfbmZkcz1uZmRzOworICAgIH0KKyAgICBuZmRzPTA7CisgICAgZm9yKGNvbnRleHQ9d2FpdGluZ19oZWFkOyBjb250ZXh0OyBjb250ZXh0PWNvbnRleHQtPm5leHQpCisgICAgICAgIGZvcihpPTA7IGk8Y29udGV4dC0+ZmRzLT5uZmRzOyBpKyspIHsKKyAgICAgICAgICAgIHVmZHNbbmZkc10uZmQ9Y29udGV4dC0+ZmRzLT51ZmRzW2ldLmZkOworICAgICAgICAgICAgdWZkc1tuZmRzXS5ldmVudHM9Y29udGV4dC0+ZmRzLT51ZmRzW2ldLmV2ZW50czsKKyAgICAgICAgICAgIG5mZHMrKzsKKyAgICAgICAgfQorCisjaWZkZWYgREVCVUdfVUNPTlRFWFQKKyAgICBzX2xvZyhMT0dfREVCVUcsICJXYWl0aW5nICVkIHNlY29uZChzKSBmb3IgJWQgZmlsZSBkZXNjcmlwdG9yKHMpIiwKKyAgICAgICAgbWluX3RpbWVvdXQsIG5mZHMpOworI2VuZGlmCisgICAgZG8geyAvKiBza2lwICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIgZXJyb3JzICovCisgICAgICAgIHJldHZhbD1wb2xsKHVmZHMsIG5mZHMsIG1pbl90aW1lb3V0PDAgPyAtMSA6IDEwMDAqbWluX3RpbWVvdXQpOworICAgIH0gd2hpbGUocmV0dmFsPDAgJiYgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk9PVNfRUlOVFIpOworICAgIHRpbWUoJm5vdyk7CisgICAgLyogcHJvY2VzcyB0aGUgcmV0dXJuZWQgZGF0YSAqLworICAgIG5mZHM9MDsKKyAgICBwcmV2PU5VTEw7IC8qIHByZXZpb3VzIGVsZW1lbnQgb2YgdGhlIHdhaXRpbmcgcXVldWUgKi8KKyAgICBjb250ZXh0PXdhaXRpbmdfaGVhZDsKKyAgICB3aGlsZShjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQtPnJlYWR5PTA7CisgICAgICAgIC8qIGNvdW50IHJlYWR5IGZpbGUgZGVzY3JpcHRvcnMgaW4gZWFjaCBjb250ZXh0ICovCisgICAgICAgIGZvcihpPTA7IGk8Y29udGV4dC0+ZmRzLT5uZmRzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmZkcy0+dWZkc1tpXS5yZXZlbnRzPXVmZHNbbmZkc10ucmV2ZW50czsKKyNpZmRlZiBERUJVR19VQ09OVEVYVAorICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiQ09OVEVYVCAlbGQsIEZEPSVkLCVzJXMgLT4lcyVzJXMlcyVzIiwKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5pZCwgdWZkc1tuZmRzXS5mZCwKKyAgICAgICAgICAgICAgICB1ZmRzW25mZHNdLmV2ZW50cyAmIFBPTExJTiA/ICIgSU4iIDogIiIsCisgICAgICAgICAgICAgICAgdWZkc1tuZmRzXS5ldmVudHMgJiBQT0xMT1VUID8gIiBPVVQiIDogIiIsCisgICAgICAgICAgICAgICAgdWZkc1tuZmRzXS5yZXZlbnRzICYgUE9MTElOID8gIiBJTiIgOiAiIiwKKyAgICAgICAgICAgICAgICB1ZmRzW25mZHNdLnJldmVudHMgJiBQT0xMT1VUID8gIiBPVVQiIDogIiIsCisgICAgICAgICAgICAgICAgdWZkc1tuZmRzXS5yZXZlbnRzICYgUE9MTEVSUiA/ICIgRVJSIiA6ICIiLAorICAgICAgICAgICAgICAgIHVmZHNbbmZkc10ucmV2ZW50cyAmIFBPTExIVVAgPyAiIEhVUCIgOiAiIiwKKyAgICAgICAgICAgICAgICB1ZmRzW25mZHNdLnJldmVudHMgJiBQT0xMTlZBTCA/ICIgTlZBTCIgOiAiIik7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKHVmZHNbbmZkc10ucmV2ZW50cykKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWFkeSsrOworICAgICAgICAgICAgbmZkcysrOworICAgICAgICB9CisgICAgICAgIGlmKGNvbnRleHQtPnJlYWR5IHx8IChjb250ZXh0LT5maW5pc2g+PTAgJiYgY29udGV4dC0+ZmluaXNoPD1ub3cpKSB7CisgICAgICAgICAgICAvKiByZW1vdmUgY29udGV4dCBmcm9tIHRoZSB3YWl0aW5nIHF1ZXVlICovCisgICAgICAgICAgICBpZihwcmV2KQorICAgICAgICAgICAgICAgIHByZXYtPm5leHQ9Y29udGV4dC0+bmV4dDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3YWl0aW5nX2hlYWQ9Y29udGV4dC0+bmV4dDsKKyAgICAgICAgICAgIGlmKCFjb250ZXh0LT5uZXh0KSAvKiBzYW1lIGFzIGNvbnRleHQ9PXdhaXRpbmdfdGFpbCAqLworICAgICAgICAgICAgICAgIHdhaXRpbmdfdGFpbD1wcmV2OworCisgICAgICAgICAgICAvKiBhcHBlbmQgY29udGV4dCBjb250ZXh0IHRvIHRoZSByZWFkeSBxdWV1ZSAqLworICAgICAgICAgICAgY29udGV4dC0+bmV4dD1OVUxMOworICAgICAgICAgICAgaWYocmVhZHlfdGFpbCkKKyAgICAgICAgICAgICAgICByZWFkeV90YWlsLT5uZXh0PWNvbnRleHQ7CisgICAgICAgICAgICByZWFkeV90YWlsPWNvbnRleHQ7CisgICAgICAgICAgICBpZighcmVhZHlfaGVhZCkKKyAgICAgICAgICAgICAgICByZWFkeV9oZWFkPWNvbnRleHQ7CisgICAgICAgIH0gZWxzZSB7IC8qIGxlYXZlIHRoZSBjb250ZXh0IGNvbnRleHQgaW4gdGhlIHdhaXRpbmcgcXVldWUgKi8KKyAgICAgICAgICAgIHByZXY9Y29udGV4dDsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0PXByZXYgPyBwcmV2LT5uZXh0IDogd2FpdGluZ19oZWFkOworICAgIH0KK30KKworaW50IHNfcG9sbF93YWl0KHNfcG9sbF9zZXQgKmZkcywgaW50IHNlYywgaW50IG1zZWMpIHsKKyAgICBDT05URVhUICpjb250ZXh0OyAvKiBjdXJyZW50IGNvbnRleHQgKi8KKyAgICBzdGF0aWMgQ09OVEVYVCAqdG9fZnJlZT1OVUxMOyAvKiBkZWxheWVkIG1lbW9yeSBkZWFsbG9jYXRpb24gKi8KKworICAgIC8qIEZJWE1FOiBtc2VjIHBhcmFtZXRlciBpcyBjdXJyZW50bHkgaWdub3JlZCB3aXRoIFVDT05URVhUIHRocmVhZHMgKi8KKyAgICAodm9pZCltc2VjOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworCisgICAgLyogcmVtb3ZlIHRoZSBjdXJyZW50IGNvbnRleHQgZnJvbSByZWFkeSBxdWV1ZSAqLworICAgIGNvbnRleHQ9cmVhZHlfaGVhZDsKKyAgICByZWFkeV9oZWFkPXJlYWR5X2hlYWQtPm5leHQ7CisgICAgaWYoIXJlYWR5X2hlYWQpIC8qIHRoZSBxdWV1ZSBpcyBlbXB0eSAqLworICAgICAgICByZWFkeV90YWlsPU5VTEw7CisgICAgLyogaXQgaXMgc2FmZSB0byBzX2xvZygpIGFmdGVyIG5ldyByZWFkeV9oZWFkIGlzIHNldCAqLworCisgICAgLyogaXQgaXMgaWxsZWdhbCB0byBkZWFsbG9jYXRlIHRoZSBzdGFjayBvZiB0aGUgY3VycmVudCBjb250ZXh0ICovCisgICAgaWYodG9fZnJlZSkgeyAvKiBhIGRlbGF5ZWQgZGVhbGxvY2F0aW9uIGlzIHNjaGVkdWxlZCAqLworI2lmZGVmIERFQlVHX1VDT05URVhUCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlJlbGVhc2luZyBjb250ZXh0ICVsZCIsIHRvX2ZyZWUtPmlkKTsKKyNlbmRpZgorICAgICAgICBzdHJfZnJlZSh0b19mcmVlLT5zdGFjayk7CisgICAgICAgIHN0cl9mcmVlKHRvX2ZyZWUpOworICAgICAgICB0b19mcmVlPU5VTEw7CisgICAgfQorCisgICAgLyogbWFuYWdlIHRoZSBjdXJyZW50IHRocmVhZCAqLworICAgIGlmKGZkcykgeyAvKiBzb21ldGhpbmcgdG8gd2FpdCBmb3IgLT4gc3dhcCB0aGUgY29udGV4dCAqLworICAgICAgICBjb250ZXh0LT5mZHM9ZmRzOyAvKiBzZXQgZmlsZSBkZXNjcmlwdG9ycyB0byB3YWl0IGZvciAqLworICAgICAgICBjb250ZXh0LT5maW5pc2g9c2VjPDAgPyAtMSA6IHRpbWUoTlVMTCkrc2VjOworCisgICAgICAgIC8qIGFwcGVuZCB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSB3YWl0aW5nIHF1ZXVlICovCisgICAgICAgIGNvbnRleHQtPm5leHQ9TlVMTDsKKyAgICAgICAgaWYod2FpdGluZ190YWlsKQorICAgICAgICAgICAgd2FpdGluZ190YWlsLT5uZXh0PWNvbnRleHQ7CisgICAgICAgIHdhaXRpbmdfdGFpbD1jb250ZXh0OworICAgICAgICBpZighd2FpdGluZ19oZWFkKQorICAgICAgICAgICAgd2FpdGluZ19oZWFkPWNvbnRleHQ7CisgICAgfSBlbHNlIHsgLyogbm90aGluZyB0byB3YWl0IGZvciAtPiBkcm9wIHRoZSBjb250ZXh0ICovCisgICAgICAgIHRvX2ZyZWU9Y29udGV4dDsgLyogc2NoZWR1bGUgZm9yIGRlbGF5ZWQgZGVhbGxvY2F0aW9uICovCisgICAgfQorCisgICAgd2hpbGUoIXJlYWR5X2hlYWQpIC8qIHdhaXQgdW50aWwgdGhlcmUgaXMgYSB0aHJlYWQgdG8gc3dpdGNoIHRvICovCisgICAgICAgIHNjYW5fd2FpdGluZ19xdWV1ZSgpOworCisgICAgLyogc3dpdGNoIHRocmVhZHMgKi8KKyAgICBpZihmZHMpIHsgLyogc3dhcCB0aGUgY3VycmVudCBjb250ZXh0ICovCisgICAgICAgIGlmKGNvbnRleHQtPmlkIT1yZWFkeV9oZWFkLT5pZCkgeworI2lmZGVmIERFQlVHX1VDT05URVhUCisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJDb250ZXh0IHN3YXA6ICVsZCAtPiAlbGQiLAorICAgICAgICAgICAgICAgIGNvbnRleHQtPmlkLCByZWFkeV9oZWFkLT5pZCk7CisjZW5kaWYKKyAgICAgICAgICAgIHN3YXBjb250ZXh0KCZjb250ZXh0LT5jb250ZXh0LCAmcmVhZHlfaGVhZC0+Y29udGV4dCk7CisjaWZkZWYgREVCVUdfVUNPTlRFWFQKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkN1cnJlbnQgY29udGV4dDogJWxkIiwgcmVhZHlfaGVhZC0+aWQpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWR5X2hlYWQtPnJlYWR5OworICAgIH0gZWxzZSB7IC8qIGRyb3AgdGhlIGN1cnJlbnQgY29udGV4dCAqLworI2lmZGVmIERFQlVHX1VDT05URVhUCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkNvbnRleHQgc2V0OiAlbGQgKGRyb3BwZWQpIC0+ICVsZCIsCisgICAgICAgICAgICBjb250ZXh0LT5pZCwgcmVhZHlfaGVhZC0+aWQpOworI2VuZGlmCisgICAgICAgIHNldGNvbnRleHQoJnJlYWR5X2hlYWQtPmNvbnRleHQpOworICAgICAgICBpb2Vycm9yKCJzZXRjb250ZXh0Iik7IC8qIHNob3VsZCBub3QgZXZlciBoYXBwZW4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisjZWxzZSAvKiBVU0VfVUNPTlRFWFQgKi8KKworaW50IHNfcG9sbF93YWl0KHNfcG9sbF9zZXQgKmZkcywgaW50IHNlYywgaW50IG1zZWMpIHsKKyAgICBpbnQgcmV0dmFsOworCisgICAgZG8geyAvKiBza2lwICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIgZXJyb3JzICovCisgICAgICAgIHJldHZhbD1wb2xsKGZkcy0+dWZkcywgZmRzLT5uZmRzLCBzZWM8MCA/IC0xIDogMTAwMCpzZWMrbXNlYyk7CisgICAgfSB3aGlsZShyZXR2YWw8MCAmJiBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKT09U19FSU5UUik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIFVTRV9VQ09OVEVYVCAqLworCisjZWxzZSAvKiBzZWxlY3QgKi8KKworc19wb2xsX3NldCAqc19wb2xsX2FsbG9jKCkgeworICAgIC8qIGl0IG5lZWRzIHRvIGJlIGZpbGxlZCB3aXRoIHplcm9zICovCisgICAgcmV0dXJuIHN0cl9hbGxvYyhzaXplb2Yoc19wb2xsX3NldCkpOworfQorCit2b2lkIHNfcG9sbF9mcmVlKHNfcG9sbF9zZXQgKmZkcykgeworICAgIGlmKGZkcykgeworICAgICAgICBzdHJfZnJlZShmZHMtPmlyZmRzKTsKKyAgICAgICAgc3RyX2ZyZWUoZmRzLT5pd2Zkcyk7CisgICAgICAgIHN0cl9mcmVlKGZkcy0+aXhmZHMpOworICAgICAgICBzdHJfZnJlZShmZHMtPm9yZmRzKTsKKyAgICAgICAgc3RyX2ZyZWUoZmRzLT5vd2Zkcyk7CisgICAgICAgIHN0cl9mcmVlKGZkcy0+b3hmZHMpOworICAgICAgICBzdHJfZnJlZShmZHMpOworICAgIH0KK30KKwordm9pZCBzX3BvbGxfaW5pdChzX3BvbGxfc2V0ICpmZHMpIHsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBmZHMtPmFsbG9jYXRlZD00OyAvKiBwcmVhbGxvYyA0IGZpbGUgZGVzY2lwdG9ycyAqLworI2VuZGlmCisgICAgc19wb2xsX3JlYWxsb2MoZmRzKTsKKyAgICBGRF9aRVJPKGZkcy0+aXJmZHMpOworICAgIEZEX1pFUk8oZmRzLT5pd2Zkcyk7CisgICAgRkRfWkVSTyhmZHMtPml4ZmRzKTsKKyAgICBmZHMtPm1heD0wOyAvKiBubyBmaWxlIGRlc2NyaXB0b3JzICovCit9CisKK3ZvaWQgc19wb2xsX2FkZChzX3BvbGxfc2V0ICpmZHMsIFNPQ0tFVCBmZCwgaW50IHJkLCBpbnQgd3IpIHsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICAvKiBmZHMtPml4ZmRzIGNvbnRhaW5zIHVuaW9uIG9mIGZkcy0+aXJmZHMgYW5kIGZkcy0+aXdmZHMgKi8KKyAgICBpZihmZHMtPml4ZmRzLT5mZF9jb3VudD49ZmRzLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgZmRzLT5hbGxvY2F0ZWQ9ZmRzLT5peGZkcy0+ZmRfY291bnQrMTsKKyAgICAgICAgc19wb2xsX3JlYWxsb2MoZmRzKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZihyZCkKKyAgICAgICAgRkRfU0VUKGZkLCBmZHMtPmlyZmRzKTsKKyAgICBpZih3cikKKyAgICAgICAgRkRfU0VUKGZkLCBmZHMtPml3ZmRzKTsKKyAgICAvKiBhbHdheXMgZXhwZWN0IGVycm9ycyAoYW5kIHRoZSBTcGFuaXNoIElucXVpc2l0aW9uKSAqLworICAgIEZEX1NFVChmZCwgZmRzLT5peGZkcyk7CisgICAgaWYoZmQ+ZmRzLT5tYXgpCisgICAgICAgIGZkcy0+bWF4PWZkOworfQorCit2b2lkIHNfcG9sbF9yZW1vdmUoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICBGRF9DTFIoZmQsIGZkcy0+aXJmZHMpOworICAgIEZEX0NMUihmZCwgZmRzLT5pd2Zkcyk7CisgICAgRkRfQ0xSKGZkLCBmZHMtPml4ZmRzKTsKK30KKworaW50IHNfcG9sbF9jYW5yZWFkKHNfcG9sbF9zZXQgKmZkcywgU09DS0VUIGZkKSB7CisgICAgcmV0dXJuIEZEX0lTU0VUKGZkLCBmZHMtPm9yZmRzKSB8fCBGRF9JU1NFVChmZCwgZmRzLT5veGZkcyk7Cit9CisKK2ludCBzX3BvbGxfY2Fud3JpdGUoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICByZXR1cm4gRkRfSVNTRVQoZmQsIGZkcy0+b3dmZHMpIHx8IEZEX0lTU0VUKGZkLCBmZHMtPm94ZmRzKTsKK30KKworaW50IHNfcG9sbF9odXAoc19wb2xsX3NldCAqZmRzLCBTT0NLRVQgZmQpIHsKKyAgICAodm9pZClmZHM7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpZmQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIDA7IC8qIEZJWE1FOiBob3cgdG8gZGV0ZWN0IEhVUCBjb25kaXRpb24gd2l0aCBzZWxlY3QoKT8gKi8KK30KKworaW50IHNfcG9sbF9yZGh1cChzX3BvbGxfc2V0ICpmZHMsIFNPQ0tFVCBmZCkgeworICAgICh2b2lkKWZkczsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClmZDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICByZXR1cm4gMDsgLyogRklYTUU6IGhvdyB0byBkZXRlY3QgUkRIVVAgY29uZGl0aW9uIHdpdGggc2VsZWN0KCk/ICovCit9CisKKyNpZmRlZiBVU0VfV0lOMzIKKyNkZWZpbmUgRkRfU0laRShmZHMpIChzaXplb2YodV9pbnQpKyhmZHMpLT5hbGxvY2F0ZWQqc2l6ZW9mKFNPQ0tFVCkpCisjZWxzZQorI2RlZmluZSBGRF9TSVpFKGZkcykgKHNpemVvZihmZF9zZXQpKQorI2VuZGlmCisKK2ludCBzX3BvbGxfd2FpdChzX3BvbGxfc2V0ICpmZHMsIGludCBzZWMsIGludCBtc2VjKSB7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0diwgKnR2X3B0cjsKKworICAgIGRvIHsgLyogc2tpcCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiIGVycm9ycyAqLworICAgICAgICBtZW1jcHkoZmRzLT5vcmZkcywgZmRzLT5pcmZkcywgRkRfU0laRShmZHMpKTsKKyAgICAgICAgbWVtY3B5KGZkcy0+b3dmZHMsIGZkcy0+aXdmZHMsIEZEX1NJWkUoZmRzKSk7CisgICAgICAgIG1lbWNweShmZHMtPm94ZmRzLCBmZHMtPml4ZmRzLCBGRF9TSVpFKGZkcykpOworICAgICAgICBpZihzZWM8MCkgeyAvKiBpbmZpbml0ZSB0aW1lb3V0ICovCisgICAgICAgICAgICB0dl9wdHI9TlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR2LnR2X3NlYz1zZWM7CisgICAgICAgICAgICB0di50dl91c2VjPTEwMDAqbXNlYzsKKyAgICAgICAgICAgIHR2X3B0cj0mdHY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsPXNlbGVjdCgoaW50KWZkcy0+bWF4KzEsCisgICAgICAgICAgICBmZHMtPm9yZmRzLCBmZHMtPm93ZmRzLCBmZHMtPm94ZmRzLCB0dl9wdHIpOworICAgIH0gd2hpbGUocmV0dmFsPDAgJiYgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk9PVNfRUlOVFIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK05PRVhQT1JUIHZvaWQgc19wb2xsX3JlYWxsb2Moc19wb2xsX3NldCAqZmRzKSB7CisgICAgZmRzLT5pcmZkcz1zdHJfcmVhbGxvYyhmZHMtPmlyZmRzLCBGRF9TSVpFKGZkcykpOworICAgIGZkcy0+aXdmZHM9c3RyX3JlYWxsb2MoZmRzLT5pd2ZkcywgRkRfU0laRShmZHMpKTsKKyAgICBmZHMtPml4ZmRzPXN0cl9yZWFsbG9jKGZkcy0+aXhmZHMsIEZEX1NJWkUoZmRzKSk7CisgICAgZmRzLT5vcmZkcz1zdHJfcmVhbGxvYyhmZHMtPm9yZmRzLCBGRF9TSVpFKGZkcykpOworICAgIGZkcy0+b3dmZHM9c3RyX3JlYWxsb2MoZmRzLT5vd2ZkcywgRkRfU0laRShmZHMpKTsKKyAgICBmZHMtPm94ZmRzPXN0cl9yZWFsbG9jKGZkcy0+b3hmZHMsIEZEX1NJWkUoZmRzKSk7Cit9CisKK3ZvaWQgc19wb2xsX2R1bXAoc19wb2xsX3NldCAqZmRzLCBpbnQgbGV2ZWwpIHsKKyAgICBTT0NLRVQgZmQ7CisgICAgaW50IGlyLCBpdywgaXgsIG9yLCBvdywgb3g7CisKKyAgICBmb3IoZmQ9MDsgZmQ8ZmRzLT5tYXg7IGZkKyspIHsKKyAgICAgICAgaXI9RkRfSVNTRVQoZmQsIGZkcy0+aXJmZHMpOworICAgICAgICBpdz1GRF9JU1NFVChmZCwgZmRzLT5pd2Zkcyk7CisgICAgICAgIGl4PUZEX0lTU0VUKGZkLCBmZHMtPml4ZmRzKTsKKyAgICAgICAgb3I9RkRfSVNTRVQoZmQsIGZkcy0+b3JmZHMpOworICAgICAgICBvdz1GRF9JU1NFVChmZCwgZmRzLT5vd2Zkcyk7CisgICAgICAgIG94PUZEX0lTU0VUKGZkLCBmZHMtPm94ZmRzKTsKKyAgICAgICAgaWYoaXIgfHwgaXcgfHwgaXggfHwgb3IgfHwgb3cgfHwgb3gpCisgICAgICAgICAgICBzX2xvZyhsZXZlbCwgImZkPSVkIGlmZHM9JWMlYyVjIG9mZHM9JWMlYyVjIiwgZmQsCisgICAgICAgICAgICAgICAgaXI/J3InOictJywgaXc/J3cnOictJywgaXg/J3gnOictJywKKyAgICAgICAgICAgICAgICBvcj8ncic6Jy0nLCBvdz8ndyc6Jy0nLCBveD8neCc6Jy0nKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBVU0VfUE9MTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBmZCBtYW5hZ2VtZW50ICovCisKK2ludCBzZXRfc29ja2V0X29wdGlvbnMoU09DS0VUIHMsIGludCB0eXBlKSB7CisgICAgU09DS19PUFQgKnB0cjsKKyAgICBleHRlcm4gU09DS19PUFQgc29ja19vcHRzW107CisgICAgc3RhdGljIGNoYXIgKnR5cGVfc3RyWzNdPXsiYWNjZXB0IiwgImxvY2FsIiwgInJlbW90ZSJ9OworICAgIHNvY2tsZW5fdCBvcHRfc2l6ZTsKKyAgICBpbnQgcmV0dmFsPTA7IC8qIG5vIGVycm9yIGZvdW5kICovCisKKyAgICBmb3IocHRyPXNvY2tfb3B0czsgcHRyLT5vcHRfc3RyOyBwdHIrKykgeworICAgICAgICBpZighcHRyLT5vcHRfdmFsW3R5cGVdKQorICAgICAgICAgICAgY29udGludWU7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgc3dpdGNoKHB0ci0+b3B0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBUWVBFX0xJTkdFUjoKKyAgICAgICAgICAgIG9wdF9zaXplPXNpemVvZihzdHJ1Y3QgbGluZ2VyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfVElNRVZBTDoKKyAgICAgICAgICAgIG9wdF9zaXplPXNpemVvZihzdHJ1Y3QgdGltZXZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG9wdF9zaXplPShzb2NrbGVuX3Qpc3RybGVuKHB0ci0+b3B0X3ZhbFt0eXBlXS0+Y192YWwpKzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9wdF9zaXplPXNpemVvZihpbnQpOworICAgICAgICB9CisgICAgICAgIGlmKHNldHNvY2tvcHQocywgcHRyLT5vcHRfbGV2ZWwsIHB0ci0+b3B0X25hbWUsCisgICAgICAgICAgICAgICAgKHZvaWQgKilwdHItPm9wdF92YWxbdHlwZV0sIG9wdF9zaXplKSkgeworICAgICAgICAgICAgaWYoZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk9PVNfRU9QTk9UU1VQUCkgeworICAgICAgICAgICAgICAgIC8qIG1vc3QgbGlrZWx5IHN0ZGluL3N0ZG91dCBvciBBRl9VTklYIHNvY2tldCAqLworICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgIk9wdGlvbiAlcyBub3Qgc3VwcG9ydGVkIG9uICVzIHNvY2tldCIsCisgICAgICAgICAgICAgICAgICAgIHB0ci0+b3B0X3N0ciwgdHlwZV9zdHJbdHlwZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzb2NrZXJyb3IocHRyLT5vcHRfc3RyKTsKKyAgICAgICAgICAgICAgICByZXR2YWw9LTE7IC8qIGZhaWxlZCB0byBzZXQgdGhpcyBvcHRpb24gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIERFQlVHX0ZEX0FMTE9DCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiT3B0aW9uICVzIHNldCBvbiAlcyBzb2NrZXQiLAorICAgICAgICAgICAgICAgIHB0ci0+b3B0X3N0ciwgdHlwZV9zdHJbdHlwZV0pOworICAgICAgICB9CisjZW5kaWYgLyogREVCVUdfRkRfQUxMT0MgKi8KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsgLyogcmV0dXJucyAwIHdoZW4gYWxsIG9wdGlvbnMgc3VjY2VlZGVkICovCit9CisKK05PRVhQT1JUIGludCBnZXRfc29ja2V0X2Vycm9yKGNvbnN0IFNPQ0tFVCBmZCkgeworICAgIGludCBlcnI7CisgICAgc29ja2xlbl90IG9wdGxlbj1zaXplb2YgZXJyOworCisgICAgaWYoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopJmVyciwgJm9wdGxlbikpCisgICAgICAgIGVycj1nZXRfbGFzdF9zb2NrZXRfZXJyb3IoKTsgLyogZmFpbGVkIC0+IGFzayB3aHkgKi8KKyAgICByZXR1cm4gZXJyPT1TX0VOT1RTT0NLID8gMCA6IGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc2ltdWxhdGUgYmxvY2tpbmcgSS9PICovCisKK2ludCBzX2Nvbm5lY3QoQ0xJICpjLCBTT0NLQUREUl9VTklPTiAqYWRkciwgc29ja2xlbl90IGFkZHJsZW4pIHsKKyAgICBpbnQgZXJyb3I7CisgICAgY2hhciAqZHN0OworCisgICAgZHN0PXNfbnRvcChhZGRyLCBhZGRybGVuKTsKKyAgICBzX2xvZyhMT0dfSU5GTywgInNfY29ubmVjdDogY29ubmVjdGluZyAlcyIsIGRzdCk7CisKKyAgICBpZighY29ubmVjdChjLT5mZCwgJmFkZHItPnNhLCBhZGRybGVuKSkgeworICAgICAgICBzX2xvZyhMT0dfSU5GTywgInNfY29ubmVjdDogY29ubmVjdGVkICVzIiwgZHN0KTsKKyAgICAgICAgc3RyX2ZyZWUoZHN0KTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vIGVycm9yIC0+IHN1Y2Nlc3MgKG9uIHNvbWUgT1NlcyBvdmVyIHRoZSBsb29wYmFjaykgKi8KKyAgICB9CisgICAgZXJyb3I9Z2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk7CisgICAgaWYoZXJyb3IhPVNfRUlOUFJPR1JFU1MgJiYgZXJyb3IhPVNfRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgInNfY29ubmVjdDogY29ubmVjdCAlczogJXMgKCVkKSIsCisgICAgICAgICAgICBkc3QsIHNfc3RyZXJyb3IoZXJyb3IpLCBlcnJvcik7CisgICAgICAgIHN0cl9mcmVlKGRzdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJzX2Nvbm5lY3Q6IHNfcG9sbF93YWl0ICVzOiB3YWl0aW5nICVkIHNlY29uZHMiLAorICAgICAgICBkc3QsIGMtPm9wdC0+dGltZW91dF9jb25uZWN0KTsKKyAgICBzX3BvbGxfaW5pdChjLT5mZHMpOworICAgIHNfcG9sbF9hZGQoYy0+ZmRzLCBjLT5mZCwgMSwgMSk7CisgICAgc3dpdGNoKHNfcG9sbF93YWl0KGMtPmZkcywgYy0+b3B0LT50aW1lb3V0X2Nvbm5lY3QsIDApKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgZXJyb3I9Z2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJzX2Nvbm5lY3Q6IHNfcG9sbF93YWl0ICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIGRzdCwgc19zdHJlcnJvcihlcnJvciksIGVycm9yKTsKKyAgICAgICAgc3RyX2ZyZWUoZHN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgMDoKKyAgICAgICAgc19sb2coTE9HX0VSUiwgInNfY29ubmVjdDogc19wb2xsX3dhaXQgJXM6IgorICAgICAgICAgICAgIiBUSU1FT1VUY29ubmVjdCBleGNlZWRlZCIsIGRzdCk7CisgICAgICAgIHN0cl9mcmVlKGRzdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnJvcj1nZXRfc29ja2V0X2Vycm9yKGMtPmZkKTsKKyAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJzX2Nvbm5lY3Q6IGNvbm5lY3QgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgZHN0LCBzX3N0cmVycm9yKGVycm9yKSwgZXJyb3IpOworICAgICAgICAgICAgc3RyX2ZyZWUoZHN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZihzX3BvbGxfY2Fud3JpdGUoYy0+ZmRzLCBjLT5mZCkpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJzX2Nvbm5lY3Q6IGNvbm5lY3RlZCAlcyIsIGRzdCk7CisgICAgICAgICAgICBzdHJfZnJlZShkc3QpOworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgfQorICAgICAgICBzX2xvZyhMT0dfRVJSLCAic19jb25uZWN0OiBzX3BvbGxfd2FpdCAlczogaW50ZXJuYWwgZXJyb3IiLAorICAgICAgICAgICAgZHN0KTsKKyAgICAgICAgc3RyX2ZyZWUoZHN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gLTE7IC8qIHNob3VsZCBub3QgYmUgcG9zc2libGUgKi8KK30KKwordm9pZCBzX3dyaXRlKENMSSAqYywgU09DS0VUIGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pIHsKKyAgICAgICAgLyogc2ltdWxhdGUgYSBibG9ja2luZyB3cml0ZSAqLworICAgIHVpbnQ4X3QgKnB0cj0odWludDhfdCAqKWJ1ZjsKKyAgICBzc2l6ZV90IG51bTsKKworICAgIHdoaWxlKGxlbj4wKSB7CisgICAgICAgIHNfcG9sbF9pbml0KGMtPmZkcyk7CisgICAgICAgIHNfcG9sbF9hZGQoYy0+ZmRzLCBmZCwgMCwgMSk7IC8qIHdyaXRlICovCisgICAgICAgIHN3aXRjaChzX3BvbGxfd2FpdChjLT5mZHMsIGMtPm9wdC0+dGltZW91dF9idXN5LCAwKSkgeworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgc29ja2Vycm9yKCJzX3dyaXRlOiBzX3BvbGxfd2FpdCIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOyAvKiBlcnJvciAqLworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgInNfd3JpdGU6IHNfcG9sbF93YWl0OiIKKyAgICAgICAgICAgICAgICAiIFRJTUVPVVRidXN5IGV4Y2VlZGVkOiBzZW5kaW5nIHJlc2V0Iik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIHRpbWVvdXQgKi8KKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYnJlYWs7IC8qIE9LICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAic193cml0ZTogc19wb2xsX3dhaXQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIGVycm9yICovCisgICAgICAgIH0KKyAgICAgICAgbnVtPXdyaXRlc29ja2V0KGZkLCAodm9pZCAqKXB0ciwgbGVuKTsKKyAgICAgICAgaWYobnVtPT0tMSkgeyAvKiBlcnJvciAqLworICAgICAgICAgICAgc29ja2Vycm9yKCJ3cml0ZXNvY2tldCAoc193cml0ZSkiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorICAgICAgICBwdHIrPShzaXplX3QpbnVtOworICAgICAgICBsZW4tPShzaXplX3QpbnVtOworICAgIH0KK30KKwordm9pZCBzX3JlYWQoQ0xJICpjLCBTT0NLRVQgZmQsIHZvaWQgKnB0ciwgc2l6ZV90IGxlbikgeworICAgICAgICAvKiBzaW11bGF0ZSBhIGJsb2NraW5nIHJlYWQgKi8KKyAgICBzc2l6ZV90IG51bTsKKworICAgIHdoaWxlKGxlbj4wKSB7CisgICAgICAgIHNfcG9sbF9pbml0KGMtPmZkcyk7CisgICAgICAgIHNfcG9sbF9hZGQoYy0+ZmRzLCBmZCwgMSwgMCk7IC8qIHJlYWQgKi8KKyAgICAgICAgc3dpdGNoKHNfcG9sbF93YWl0KGMtPmZkcywgYy0+b3B0LT50aW1lb3V0X2J1c3ksIDApKSB7CisgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBzb2NrZXJyb3IoInNfcmVhZDogc19wb2xsX3dhaXQiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogZXJyb3IgKi8KKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJzX3JlYWQ6IHNfcG9sbF93YWl0OiIKKyAgICAgICAgICAgICAgICAiIFRJTUVPVVRidXN5IGV4Y2VlZGVkOiBzZW5kaW5nIHJlc2V0Iik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIHRpbWVvdXQgKi8KKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYnJlYWs7IC8qIE9LICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAic19yZWFkOiBzX3BvbGxfd2FpdDogdW5rbm93biByZXN1bHQiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICBudW09cmVhZHNvY2tldChmZCwgcHRyLCBsZW4pOworICAgICAgICBzd2l0Y2gobnVtKSB7CisgICAgICAgIGNhc2UgLTE6IC8qIGVycm9yICovCisgICAgICAgICAgICBzb2NrZXJyb3IoInJlYWRzb2NrZXQgKHNfcmVhZCkiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgY2FzZSAwOiAvKiBFT0YgKi8KKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIHNvY2tldCBjbG9zZSAoc19yZWFkKSIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIHB0cj0odWludDhfdCAqKXB0citudW07CisgICAgICAgIGxlbi09KHNpemVfdCludW07CisgICAgfQorfQorCit2b2lkIGZkX3B1dGxpbmUoQ0xJICpjLCBTT0NLRVQgZmQsIGNvbnN0IGNoYXIgKmxpbmUpIHsKKyAgICBjaGFyICp0bXBsaW5lOworICAgIGNvbnN0IGNoYXIgY3JsZltdPSJcclxuIjsKKyAgICBzaXplX3QgbGVuOworCisgICAgdG1wbGluZT1zdHJfcHJpbnRmKCIlcyVzIiwgbGluZSwgY3JsZik7CisgICAgbGVuPXN0cmxlbih0bXBsaW5lKTsKKyAgICBzX3dyaXRlKGMsIGZkLCB0bXBsaW5lLCBsZW4pOworICAgIHRtcGxpbmVbbGVuLTJdPSdcMCc7IC8qIHJlbW92ZSBDUkxGICovCisgICAgc19sb2coTE9HX0RFQlVHLCAiIC0+ICVzIiwgdG1wbGluZSk7CisgICAgc3RyX2ZyZWUodG1wbGluZSk7Cit9CisKK2NoYXIgKmZkX2dldGxpbmUoQ0xJICpjLCBTT0NLRVQgZmQpIHsKKyAgICBjaGFyICpsaW5lOworICAgIHNpemVfdCBwdHI9MCwgYWxsb2NhdGVkPTMyOworCisgICAgbGluZT1zdHJfYWxsb2MoYWxsb2NhdGVkKTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYocHRyPjY1NTM2KSB7IC8qID42NEtCIC0tPiBEb1MgcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgImZkX2dldGxpbmU6IExpbmUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIGlmKGFsbG9jYXRlZDxwdHIrMSkgeworICAgICAgICAgICAgYWxsb2NhdGVkKj0yOworICAgICAgICAgICAgbGluZT1zdHJfcmVhbGxvYyhsaW5lLCBhbGxvY2F0ZWQpOworICAgICAgICB9CisgICAgICAgIHNfcmVhZChjLCBmZCwgbGluZStwdHIsIDEpOworICAgICAgICBpZihsaW5lW3B0cl09PSdccicpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYobGluZVtwdHJdPT0nXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKGxpbmVbcHRyXT09J1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK3B0cjsKKyAgICB9CisgICAgbGluZVtwdHJdPSdcMCc7CisgICAgc19sb2coTE9HX0RFQlVHLCAiIDwtICVzIiwgbGluZSk7CisgICAgcmV0dXJuIGxpbmU7Cit9CisKK3ZvaWQgZmRfcHJpbnRmKENMSSAqYywgU09DS0VUIGZkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICAgIHZhX2xpc3QgYXA7CisgICAgY2hhciAqbGluZTsKKworICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAgIGxpbmU9c3RyX3ZwcmludGYoZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBpZighbGluZSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiZmRfcHJpbnRmOiBzdHJfdnByaW50ZiBmYWlsZWQiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBmZF9wdXRsaW5lKGMsIGZkLCBsaW5lKTsKKyAgICBzdHJfZnJlZShsaW5lKTsKK30KKwordm9pZCBzX3NzbF93cml0ZShDTEkgKmMsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikgeworICAgICAgICAvKiBzaW11bGF0ZSBhIGJsb2NraW5nIFNTTF93cml0ZSAqLworICAgIHVpbnQ4X3QgKnB0cj0odWludDhfdCAqKWJ1ZjsKKyAgICBpbnQgbnVtOworCisgICAgd2hpbGUobGVuPjApIHsKKyAgICAgICAgc19wb2xsX2luaXQoYy0+ZmRzKTsKKyAgICAgICAgc19wb2xsX2FkZChjLT5mZHMsIGMtPnNzbF93ZmQtPmZkLCAwLCAxKTsgLyogd3JpdGUgKi8KKyAgICAgICAgc3dpdGNoKHNfcG9sbF93YWl0KGMtPmZkcywgYy0+b3B0LT50aW1lb3V0X2J1c3ksIDApKSB7CisgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBzb2NrZXJyb3IoInNfd3JpdGU6IHNfcG9sbF93YWl0Iik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIGVycm9yICovCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAic193cml0ZTogc19wb2xsX3dhaXQ6IgorICAgICAgICAgICAgICAgICIgVElNRU9VVGJ1c3kgZXhjZWVkZWQ6IHNlbmRpbmcgcmVzZXQiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogdGltZW91dCAqLworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBicmVhazsgLyogT0sgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJzX3dyaXRlOiBzX3BvbGxfd2FpdDogdW5rbm93biByZXN1bHQiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICBudW09U1NMX3dyaXRlKGMtPnNzbCwgKHZvaWQgKilwdHIsIGxlbik7CisgICAgICAgIGlmKG51bT09LTEpIHsgLyogZXJyb3IgKi8KKyAgICAgICAgICAgIHNvY2tlcnJvcigiU1NMX3dyaXRlIChzX3NzbF93cml0ZSkiKTsKKyAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICAgICAgfQorICAgICAgICBwdHIrPW51bTsKKyAgICAgICAgbGVuLT1udW07CisgICAgfQorfQorCit2b2lkIHNfc3NsX3JlYWQoQ0xJICpjLCB2b2lkICpwdHIsIGludCBsZW4pIHsKKyAgICAgICAgLyogc2ltdWxhdGUgYSBibG9ja2luZyBTU0xfcmVhZCAqLworICAgIGludCBudW07CisKKyAgICB3aGlsZShsZW4+MCkgeworICAgICAgICBpZighU1NMX3BlbmRpbmcoYy0+c3NsKSkgeworICAgICAgICAgICAgc19wb2xsX2luaXQoYy0+ZmRzKTsKKyAgICAgICAgICAgIHNfcG9sbF9hZGQoYy0+ZmRzLCBjLT5zc2xfcmZkLT5mZCwgMSwgMCk7IC8qIHJlYWQgKi8KKyAgICAgICAgICAgIHN3aXRjaChzX3BvbGxfd2FpdChjLT5mZHMsIGMtPm9wdC0+dGltZW91dF9idXN5LCAwKSkgeworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICBzb2NrZXJyb3IoInNfcmVhZDogc19wb2xsX3dhaXQiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIGVycm9yICovCisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJzX3JlYWQ6IHNfcG9sbF93YWl0OiIKKyAgICAgICAgICAgICAgICAgICAgIiBUSU1FT1VUYnVzeSBleGNlZWRlZDogc2VuZGluZyByZXNldCIpOworICAgICAgICAgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsgLyogdGltZW91dCAqLworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBPSyAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAic19yZWFkOiBzX3BvbGxfd2FpdDogdW5rbm93biByZXN1bHQiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7IC8qIGVycm9yICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbnVtPVNTTF9yZWFkKGMtPnNzbCwgcHRyLCBsZW4pOworICAgICAgICBzd2l0Y2gobnVtKSB7CisgICAgICAgIGNhc2UgLTE6IC8qIGVycm9yICovCisgICAgICAgICAgICBzb2NrZXJyb3IoIlNTTF9yZWFkIChzX3NzbF9yZWFkKSIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICBjYXNlIDA6IC8qIEVPRiAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIlVuZXhwZWN0ZWQgc29ja2V0IGNsb3NlIChzX3NzbF9yZWFkKSIpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIHB0cj0odWludDhfdCAqKXB0citudW07CisgICAgICAgIGxlbi09bnVtOworICAgIH0KK30KKworY2hhciAqc3NsX2dldHN0cmluZyhDTEkgKmMpIHsgLyogZ2V0IG51bGwtdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICBjaGFyICpsaW5lOworICAgIHNpemVfdCBwdHI9MCwgYWxsb2NhdGVkPTMyOworCisgICAgbGluZT1zdHJfYWxsb2MoYWxsb2NhdGVkKTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYocHRyPjY1NTM2KSB7IC8qID42NEtCIC0tPiBEb1MgcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgImZkX2dldGxpbmU6IExpbmUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICB9CisgICAgICAgIGlmKGFsbG9jYXRlZDxwdHIrMSkgeworICAgICAgICAgICAgYWxsb2NhdGVkKj0yOworICAgICAgICAgICAgbGluZT1zdHJfcmVhbGxvYyhsaW5lLCBhbGxvY2F0ZWQpOworICAgICAgICB9CisgICAgICAgIHNfc3NsX3JlYWQoYywgbGluZStwdHIsIDEpOworICAgICAgICBpZihsaW5lW3B0cl09PSdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytwdHI7CisgICAgfQorICAgIHJldHVybiBsaW5lOworfQorCisjZGVmaW5lIElORVRfU09DS0VUX1BBSVIKKworaW50IG1ha2Vfc29ja2V0cyhTT0NLRVQgZmRbMl0pIHsgLyogbWFrZSBhIHBhaXIgb2YgY29ubmVjdGVkIGlwdjQgc29ja2V0cyAqLworI2lmZGVmIElORVRfU09DS0VUX1BBSVIKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBTT0NLRVQgczsgLyogdGVtcG9yYXJ5IHNvY2tldCBhd2FpdGluZyBmb3IgY29ubmVjdGlvbiAqLworCisgICAgLyogY3JlYXRlIHR3byAqYmxvY2tpbmcqIHNvY2tldHMgZmlyc3QgKi8KKyAgICBzPXNfc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCAwLCAibWFrZV9zb2NrZXRzOiBzX3NvY2tldCMxIik7CisgICAgaWYocz09SU5WQUxJRF9TT0NLRVQpCisgICAgICAgIHJldHVybiAxOworICAgIGZkWzFdPXNfc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCAwLCAibWFrZV9zb2NrZXRzOiBzX3NvY2tldCMyIik7CisgICAgaWYoZmRbMV09PUlOVkFMSURfU09DS0VUKSB7CisgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBhZGRybGVuPXNpemVvZiBhZGRyOworICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mIGFkZHIpOworICAgIGFkZHIuc2luX2ZhbWlseT1BRl9JTkVUOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyPWh0b25sKElOQUREUl9MT09QQkFDSyk7CisgICAgYWRkci5zaW5fcG9ydD1odG9ucygwKTsgLyogZHluYW1pYyBwb3J0IGFsbG9jYXRpb24gKi8KKyAgICBpZihiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgYWRkcmxlbikpCisgICAgICAgIGxvZ19lcnJvcihMT0dfREVCVUcsIGdldF9sYXN0X3NvY2tldF9lcnJvcigpLCAibWFrZV9zb2NrZXRzOiBiaW5kIzEiKTsKKyAgICBpZihiaW5kKGZkWzFdLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIGFkZHJsZW4pKQorICAgICAgICBsb2dfZXJyb3IoTE9HX0RFQlVHLCBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSwgIm1ha2Vfc29ja2V0czogYmluZCMyIik7CisKKyAgICBpZihsaXN0ZW4ocywgMSkpIHsKKyAgICAgICAgc29ja2Vycm9yKCJtYWtlX3NvY2tldHM6IGxpc3RlbiIpOworICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQoZmRbMV0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoZ2V0c29ja25hbWUocywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbikpIHsKKyAgICAgICAgc29ja2Vycm9yKCJtYWtlX3NvY2tldHM6IGdldHNvY2tuYW1lIik7CisgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICBjbG9zZXNvY2tldChmZFsxXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihjb25uZWN0KGZkWzFdLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIGFkZHJsZW4pKSB7CisgICAgICAgIHNvY2tlcnJvcigibWFrZV9zb2NrZXRzOiBjb25uZWN0Iik7CisgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICBjbG9zZXNvY2tldChmZFsxXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmZFswXT1zX2FjY2VwdChzLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuLCAxLAorICAgICAgICAibWFrZV9zb2NrZXRzOiBzX2FjY2VwdCIpOworICAgIGlmKGZkWzBdPT1JTlZBTElEX1NPQ0tFVCkgeworICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQoZmRbMV0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgY2xvc2Vzb2NrZXQocyk7IC8qIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdCAqLworICAgIHNldF9ub25ibG9jayhmZFswXSwgMSk7CisgICAgc2V0X25vbmJsb2NrKGZkWzFdLCAxKTsKKyNlbHNlCisgICAgaWYoc19zb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCwgMSwgIm1ha2Vfc29ja2V0czogc29ja2V0cGFpciIpKQorICAgICAgICByZXR1cm4gMTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKiBlbmQgb2YgbmV0d29yay5jICovCmRpZmYgLS1naXQgYS9zcmMvb3B0aW9ucy5jIGIvc3JjL29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVkZGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29wdGlvbnMuYwpAQCAtMCwwICsxLDM0NjEgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoQ09ORkRJUikKKyNkZWZpbmUgQ09ORkRJUiAiXFxzdHVubmVsIgorI2VuZGlmCisKKyNkZWZpbmUgQ09ORkxJTkVMRU4gKDE2KjEwMjQpCisKK3R5cGVkZWYgZW51bSB7CisgICAgQ01EX0JFR0lOLCAgICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdHMgKi8KKyAgICBDTURfRVhFQywgICAgICAgLyogcHJvY2VzcyBjb21tYW5kICovCisgICAgQ01EX0VORCwgICAgICAgIC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgQ01EX0ZSRUUsICAgICAgIC8qIFRPRE86IGRlYWxsb2NhdGUgbWVtb3J5ICovCisgICAgQ01EX0RFRkFVTFQsICAgIC8qIHByaW50IGRlZmF1bHQgdmFsdWUgKi8KKyAgICBDTURfSEVMUCAgICAgICAgLyogcHJpbnQgaGVscCAqLworfSBDTUQ7CisKK05PRVhQT1JUIGludCBvcHRpb25zX2ZpbGUoY2hhciAqLCBDT05GX1RZUEUsIFNFUlZJQ0VfT1BUSU9OUyAqKik7CitOT0VYUE9SVCBpbnQgb3B0aW9uc19pbmNsdWRlKGNoYXIgKiwgU0VSVklDRV9PUFRJT05TICoqKTsKKyNpZmRlZiBVU0VfV0lOMzIKK3N0cnVjdCBkaXJlbnQgeworICAgIGNoYXIgZF9uYW1lW01BWF9QQVRIXTsKK307CitpbnQgc2NhbmRpcihjb25zdCBjaGFyICosIHN0cnVjdCBkaXJlbnQgKioqLAorICAgIGludCAoKikoY29uc3Qgc3RydWN0IGRpcmVudCAqKSwKKyAgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBkaXJlbnQgKiosIGNvbnN0IHN0cnVjdCBkaXJlbnQgKiopKTsKK2ludCBhbHBoYXNvcnQoY29uc3Qgc3RydWN0IGRpcmVudCAqKiwgY29uc3Qgc3RydWN0IGRpcmVudCAqKik7CisjZW5kaWYKK05PRVhQT1JUIGNoYXIgKnBhcnNlX2dsb2JhbF9vcHRpb24oQ01ELCBjaGFyICosIGNoYXIgKik7CitOT0VYUE9SVCBjaGFyICpwYXJzZV9zZXJ2aWNlX29wdGlvbihDTUQsIFNFUlZJQ0VfT1BUSU9OUyAqLCBjaGFyICosIGNoYXIgKik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK05PRVhQT1JUIGNoYXIgKnNuaV9pbml0KFNFUlZJQ0VfT1BUSU9OUyAqKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1RMU0VYVCkgKi8KKworTk9FWFBPUlQgY2hhciAqcGFyc2VfZGVidWdfbGV2ZWwoY2hhciAqLCBTRVJWSUNFX09QVElPTlMgKik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKK05PRVhQT1JUIFBTS19LRVlTICpwc2tfcmVhZChjaGFyICopOworTk9FWFBPUlQgdm9pZCBwc2tfZnJlZShQU0tfS0VZUyAqKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1BTSykgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgKm5hbWU7CisgICAgbG9uZyB2YWx1ZTsKK30gU1NMX09QVElPTjsKKworc3RhdGljIGNvbnN0IFNTTF9PUFRJT04gc3NsX29wdHNbXSA9IHsKKyAgICB7Ik1JQ1JPU09GVF9TRVNTX0lEX0JVRyIsIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUd9LAorICAgIHsiTkVUU0NBUEVfQ0hBTExFTkdFX0JVRyIsIFNTTF9PUF9ORVRTQ0FQRV9DSEFMTEVOR0VfQlVHfSwKKyNpZmRlZiBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUCisgICAgeyJMRUdBQ1lfU0VSVkVSX0NPTk5FQ1QiLCBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUfSwKKyNlbmRpZgorICAgIHsiTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUciLAorICAgICAgICBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUd9LAorI2lmZGVmIFNTTF9PUF9UTFNFWFRfUEFERElORworICAgIHsiVExTRVhUX1BBRERJTkciLCBTU0xfT1BfVExTRVhUX1BBRERJTkd9LAorI2VuZGlmCisgICAgeyJNSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUiIsIFNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUn0sCisjaWZkZWYgU1NMX09QX1NBRkFSSV9FQ0RIRV9FQ0RTQV9CVUcKKyAgICB7IlNBRkFSSV9FQ0RIRV9FQ0RTQV9CVUciLCBTU0xfT1BfU0FGQVJJX0VDREhFX0VDRFNBX0JVR30sCisjZW5kaWYKKyAgICB7IlNTTEVBWV8wODBfQ0xJRU5UX0RIX0JVRyIsIFNTTF9PUF9TU0xFQVlfMDgwX0NMSUVOVF9ESF9CVUd9LAorICAgIHsiVExTX0Q1X0JVRyIsIFNTTF9PUF9UTFNfRDVfQlVHfSwKKyAgICB7IlRMU19CTE9DS19QQURESU5HX0JVRyIsIFNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUd9LAorI2lmZGVmIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCisgICAgeyJNU0lFX1NTTFYyX1JTQV9QQURESU5HIiwgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkd9LAorI2VuZGlmCisgICAgeyJTU0xSRUYyX1JFVVNFX0NFUlRfVFlQRV9CVUciLCBTU0xfT1BfU1NMUkVGMl9SRVVTRV9DRVJUX1RZUEVfQlVHfSwKKyNpZmRlZiBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTCisgICAgeyJET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMiLCBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTfSwKKyNlbmRpZgorICAgIHsiQUxMIiwgKGxvbmcpU1NMX09QX0FMTH0sCisjaWZkZWYgU1NMX09QX05PX1FVRVJZX01UVQorICAgIHsiTk9fUVVFUllfTVRVIiwgU1NMX09QX05PX1FVRVJZX01UVX0sCisjZW5kaWYKKyNpZmRlZiBTU0xfT1BfQ09PS0lFX0VYQ0hBTkdFCisgICAgeyJDT09LSUVfRVhDSEFOR0UiLCBTU0xfT1BfQ09PS0lFX0VYQ0hBTkdFfSwKKyNlbmRpZgorI2lmZGVmIFNTTF9PUF9OT19USUNLRVQKKyAgICB7Ik5PX1RJQ0tFVCIsIFNTTF9PUF9OT19USUNLRVR9LAorI2VuZGlmCisjaWZkZWYgU1NMX09QX0NJU0NPX0FOWUNPTk5FQ1QKKyAgICB7IkNJU0NPX0FOWUNPTk5FQ1QiLCBTU0xfT1BfQ0lTQ09fQU5ZQ09OTkVDVH0sCisjZW5kaWYKKyNpZmRlZiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04KKyAgICB7Ik5PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OIiwKKyAgICAgICAgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OfSwKKyNlbmRpZgorI2lmZGVmIFNTTF9PUF9OT19DT01QUkVTU0lPTgorICAgIHsiTk9fQ09NUFJFU1NJT04iLCBTU0xfT1BfTk9fQ09NUFJFU1NJT059LAorI2VuZGlmCisjaWZkZWYgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTgorICAgIHsiQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIiwKKyAgICAgICAgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTn0sCisjZW5kaWYKKyNpZmRlZiBTU0xfT1BfU0lOR0xFX0VDREhfVVNFCisgICAgeyJTSU5HTEVfRUNESF9VU0UiLCBTU0xfT1BfU0lOR0xFX0VDREhfVVNFfSwKKyNlbmRpZgorICAgIHsiU0lOR0xFX0RIX1VTRSIsIFNTTF9PUF9TSU5HTEVfREhfVVNFfSwKKyAgICB7IkVQSEVNRVJBTF9SU0EiLCBTU0xfT1BfRVBIRU1FUkFMX1JTQX0sCisjaWZkZWYgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRQorICAgIHsiQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFIiwgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRX0sCisjZW5kaWYKKyAgICB7IlRMU19ST0xMQkFDS19CVUciLCBTU0xfT1BfVExTX1JPTExCQUNLX0JVR30sCisgICAgeyJOT19TU0x2MiIsIFNTTF9PUF9OT19TU0x2Mn0sCisgICAgeyJOT19TU0x2MyIsIFNTTF9PUF9OT19TU0x2M30sCisgICAgeyJOT19UTFN2MSIsIFNTTF9PUF9OT19UTFN2MX0sCisjaWZkZWYgU1NMX09QX05PX1RMU3YxXzEKKyAgICB7Ik5PX1RMU3YxLjEiLCBTU0xfT1BfTk9fVExTdjFfMX0sCisjZW5kaWYKKyNpZmRlZiBTU0xfT1BfTk9fVExTdjFfMgorICAgIHsiTk9fVExTdjEuMiIsIFNTTF9PUF9OT19UTFN2MV8yfSwKKyNlbmRpZgorICAgIHsiUEtDUzFfQ0hFQ0tfMSIsIFNTTF9PUF9QS0NTMV9DSEVDS18xfSwKKyAgICB7IlBLQ1MxX0NIRUNLXzIiLCBTU0xfT1BfUEtDUzFfQ0hFQ0tfMn0sCisgICAgeyJORVRTQ0FQRV9DQV9ETl9CVUciLCBTU0xfT1BfTkVUU0NBUEVfQ0FfRE5fQlVHfSwKKyNpZmRlZiBTU0xfT1BfTk9OX0VYUE9SVF9GSVJTVAorICAgIHsiTk9OX0VYUE9SVF9GSVJTVCIsIFNTTF9PUF9OT05fRVhQT1JUX0ZJUlNUfSwKKyNlbmRpZgorICAgIHsiTkVUU0NBUEVfREVNT19DSVBIRVJfQ0hBTkdFX0JVRyIsIFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHfSwKKyNpZmRlZiBTU0xfT1BfQ1JZUFRPUFJPX1RMU0VYVF9CVUcKKyAgICB7IkNSWVBUT1BST19UTFNFWFRfQlVHIiwgKGxvbmcpU1NMX09QX0NSWVBUT1BST19UTFNFWFRfQlVHfSwKKyNlbmRpZgorICAgIHtOVUxMLCAwfQorfTsKKworTk9FWFBPUlQgbG9uZyBwYXJzZV9zc2xfb3B0aW9uKGNoYXIgKik7CitOT0VYUE9SVCB2b2lkIHByaW50X3NzbF9vcHRpb25zKHZvaWQpOworCitOT0VYUE9SVCBpbnQgcHJpbnRfc29ja2V0X29wdGlvbnModm9pZCk7CitOT0VYUE9SVCBjaGFyICpwcmludF9vcHRpb24oaW50LCBPUFRfVU5JT04gKik7CitOT0VYUE9SVCBpbnQgcGFyc2Vfc29ja2V0X29wdGlvbihjaGFyICopOworCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorTk9FWFBPUlQgdW5zaWduZWQgbG9uZyBwYXJzZV9vY3NwX2ZsYWcoY2hhciAqKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK05PRVhQT1JUIHZvaWQgZW5naW5lX3Jlc2V0X2xpc3Qodm9pZCk7CitOT0VYUE9SVCBjaGFyICplbmdpbmVfYXV0byh2b2lkKTsKK05PRVhQT1JUIGNoYXIgKmVuZ2luZV9vcGVuKGNvbnN0IGNoYXIgKik7CitOT0VYUE9SVCBjaGFyICplbmdpbmVfY3RybChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitOT0VYUE9SVCBjaGFyICplbmdpbmVfZGVmYXVsdChjb25zdCBjaGFyICopOworTk9FWFBPUlQgY2hhciAqZW5naW5lX2luaXQodm9pZCk7CitOT0VYUE9SVCB2b2lkIGVuZ2luZV9uZXh0KHZvaWQpOworTk9FWFBPUlQgRU5HSU5FICplbmdpbmVfZ2V0X2J5X2lkKGNvbnN0IGNoYXIgKik7CitOT0VYUE9SVCBFTkdJTkUgKmVuZ2luZV9nZXRfYnlfbnVtKGNvbnN0IGludCk7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19FTkdJTkUpICovCisKK05PRVhQT1JUIHZvaWQgcHJpbnRfc3ludGF4KHZvaWQpOworCitOT0VYUE9SVCB2b2lkIG5hbWVfbGlzdF9hcHBlbmQoTkFNRV9MSVNUICoqLCBjaGFyICopOworI2lmbmRlZiBVU0VfV0lOMzIKK05PRVhQT1JUIGNoYXIgKiphcmdhbGxvYyhjaGFyICopOworI2VuZGlmCisKK2NoYXIgKmNvbmZpZ3VyYXRpb25fZmlsZT0KKyNpZmRlZiBDT05GRElSCisgICAgICAgICAgICBDT05GRElSCisjaWZkZWYgVVNFX1dJTjMyCisgICAgICAgICAgICAiXFwiCisjZWxzZQorICAgICAgICAgICAgIi8iCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgInN0dW5uZWwuY29uZiI7CisKK0dMT0JBTF9PUFRJT05TIGdsb2JhbF9vcHRpb25zOworU0VSVklDRV9PUFRJT05TIHNlcnZpY2Vfb3B0aW9uczsKKworc3RhdGljIEdMT0JBTF9PUFRJT05TIG5ld19nbG9iYWxfb3B0aW9uczsKK3N0YXRpYyBTRVJWSUNFX09QVElPTlMgbmV3X3NlcnZpY2Vfb3B0aW9uczsKKworc3RhdGljIGNoYXIgKm9wdGlvbl9ub3RfZm91bmQ9CisgICAgIlNwZWNpZmllZCBvcHRpb24gbmFtZSBpcyBub3QgdmFsaWQgaGVyZSI7CisKK3N0YXRpYyBjaGFyICpzdHVubmVsX2NpcGhlcl9saXN0PQorICAgICJISUdIOiszREVTOitESDohYU5VTEw6IVNTTHYyIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcGFyc2UgY29tbWFuZGxpbmUgcGFyYW1ldGVycyAqLworCitpbnQgb3B0aW9uc19jbWRsaW5lKGNoYXIgKm5hbWUsIGNoYXIgKnBhcmFtZXRlcikgeworICAgIENPTkZfVFlQRSB0eXBlPUNPTkZfRklMRTsKKworI2lmZGVmIFVTRV9XSU4zMgorICAgICh2b2lkKXBhcmFtZXRlcjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyNlbmRpZgorICAgIGlmKCFuYW1lKSB7CisgICAgICAgIC8qIGxlYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBjb25maWd1cmF0aW9uX2ZpbGUgKi8KKyAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAobmFtZSwgIi1oZWxwIikpIHsKKyAgICAgICAgcGFyc2VfZ2xvYmFsX29wdGlvbihDTURfSEVMUCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHBhcnNlX3NlcnZpY2Vfb3B0aW9uKENNRF9IRUxQLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgbG9nX2ZsdXNoKExPR19NT0RFX0lORk8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAobmFtZSwgIi12ZXJzaW9uIikpIHsKKyAgICAgICAgcGFyc2VfZ2xvYmFsX29wdGlvbihDTURfREVGQVVMVCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHBhcnNlX3NlcnZpY2Vfb3B0aW9uKENNRF9ERUZBVUxULCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgbG9nX2ZsdXNoKExPR19NT0RFX0lORk8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAobmFtZSwgIi1zb2NrZXRzIikpIHsKKyAgICAgICAgcHJpbnRfc29ja2V0X29wdGlvbnMoKTsKKyAgICAgICAgbG9nX2ZsdXNoKExPR19NT0RFX0lORk8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAobmFtZSwgIi1vcHRpb25zIikpIHsKKyAgICAgICAgcHJpbnRfc3NsX29wdGlvbnMoKTsKKyAgICAgICAgbG9nX2ZsdXNoKExPR19NT0RFX0lORk8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UKKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgaWYoIXN0cmNhc2VjbXAobmFtZSwgIi1mZCIpKSB7CisgICAgICAgIGlmKCFwYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJObyBmaWxlIGRlc2NyaXB0b3Igc3BlY2lmaWVkIik7CisgICAgICAgICAgICBwcmludF9zeW50YXgoKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyYXRpb25fZmlsZT1wYXJhbWV0ZXI7CisgICAgICAgIHR5cGU9Q09ORl9GRDsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICBjb25maWd1cmF0aW9uX2ZpbGU9bmFtZTsKKyAgICBjb25maWd1cmF0aW9uX2ZpbGU9c3RyX2R1cChjb25maWd1cmF0aW9uX2ZpbGUpOworICAgIHN0cl9kZXRhY2goY29uZmlndXJhdGlvbl9maWxlKTsgLyogZG8gbm90IHRyYWNrIHRoaXMgYWxsb2NhdGlvbiAqLworCisgICAgcmV0dXJuIG9wdGlvbnNfcGFyc2UodHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCitpbnQgb3B0aW9uc19wYXJzZShDT05GX1RZUEUgdHlwZSkgeworICAgIFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbjsKKyAgICBjaGFyICplcnJzdHI7CisKKyAgICBvcHRpb25zX2RlZmF1bHRzKCk7CisgICAgc2VjdGlvbj0mbmV3X3NlcnZpY2Vfb3B0aW9uczsKKyAgICBpZihvcHRpb25zX2ZpbGUoY29uZmlndXJhdGlvbl9maWxlLCB0eXBlLCAmc2VjdGlvbikpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYobmV3X3NlcnZpY2Vfb3B0aW9ucy5uZXh0KSB7IC8qIGRhZW1vbiBtb2RlOiBpbml0aWFsaXplIHNlY3Rpb25zICovCisgICAgICAgIGZvcihzZWN0aW9uPW5ld19zZXJ2aWNlX29wdGlvbnMubmV4dDsgc2VjdGlvbjsgc2VjdGlvbj1zZWN0aW9uLT5uZXh0KSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkluaXRpYWxpemluZyBzZXJ2aWNlIFslc10iLCBzZWN0aW9uLT5zZXJ2bmFtZSk7CisgICAgICAgICAgICBlcnJzdHI9cGFyc2Vfc2VydmljZV9vcHRpb24oQ01EX0VORCwgc2VjdGlvbiwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZihlcnJzdHIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBpbmV0ZCBtb2RlOiBuZWVkIHRvIGluaXRpYWxpemUgZ2xvYmFsIG9wdGlvbnMgKi8KKyAgICAgICAgZXJyc3RyPXBhcnNlX2dsb2JhbF9vcHRpb24oQ01EX0VORCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmKGVycnN0cikgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkdsb2JhbCBvcHRpb25zOiAlcyIsIGVycnN0cik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkluaXRpYWxpemluZyBpbmV0ZCBtb2RlIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgc2VjdGlvbj0mbmV3X3NlcnZpY2Vfb3B0aW9uczsKKyAgICAgICAgZXJyc3RyPXBhcnNlX3NlcnZpY2Vfb3B0aW9uKENNRF9FTkQsIHNlY3Rpb24sIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICBpZihlcnJzdHIpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlNlcnZpY2UgWyVzXTogJXMiLCBzZWN0aW9uLT5zZXJ2bmFtZSwgZXJyc3RyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc19sb2coTE9HX05PVElDRSwgIkNvbmZpZ3VyYXRpb24gc3VjY2Vzc2Z1bCIpOworICAgIHJldHVybiAwOworfQorCitOT0VYUE9SVCBpbnQgb3B0aW9uc19maWxlKGNoYXIgKnBhdGgsIENPTkZfVFlQRSB0eXBlLCBTRVJWSUNFX09QVElPTlMgKipzZWN0aW9uKSB7CisgICAgRElTS19GSUxFICpkZjsKKyAgICBjaGFyIGxpbmVfdGV4dFtDT05GTElORUxFTl0sICplcnJzdHI7CisgICAgY2hhciBjb25maWdfbGluZVtDT05GTElORUxFTl0sICpjb25maWdfb3B0LCAqY29uZmlnX2FyZzsKKyAgICBpbnQgaSwgbGluZV9udW1iZXI9MDsKKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgaW50IGZkOworICAgIGNoYXIgKnRtcF9zdHI7CisjZW5kaWYKKworICAgIHNfbG9nKExPR19OT1RJQ0UsICJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAlcyAlcyIsCisgICAgICAgIHR5cGU9PUNPTkZfRkQgPyAiZGVzY3JpcHRvciIgOiAiZmlsZSIsIHBhdGgpOworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBpZih0eXBlPT1DT05GX0ZEKSB7IC8qIGZpbGUgZGVzY3JpcHRvciAqLworICAgICAgICBmZD0oaW50KXN0cnRvbChwYXRoLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1wYXRoIHx8ICp0bXBfc3RyKSB7IC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIG51bWJlciIpOworICAgICAgICAgICAgcHJpbnRfc3ludGF4KCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBkZj1maWxlX2Zkb3BlbihmZCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgZGY9ZmlsZV9vcGVuKHBhdGgsIEZJTEVfTU9ERV9SRUFEKTsKKyAgICBpZighZGYpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkNhbm5vdCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgICBpZih0eXBlIT1DT05GX1JFTE9BRCkKKyAgICAgICAgICAgIHByaW50X3N5bnRheCgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICB3aGlsZShmaWxlX2dldGxpbmUoZGYsIGxpbmVfdGV4dCwgQ09ORkxJTkVMRU4pPj0wKSB7CisgICAgICAgIG1lbWNweShjb25maWdfbGluZSwgbGluZV90ZXh0LCBDT05GTElORUxFTik7CisgICAgICAgICsrbGluZV9udW1iZXI7CisgICAgICAgIGNvbmZpZ19vcHQ9Y29uZmlnX2xpbmU7CisgICAgICAgIGlmKGxpbmVfbnVtYmVyPT0xKSB7CisgICAgICAgICAgICBpZihjb25maWdfb3B0WzBdPT0oY2hhcikweGVmICYmCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19vcHRbMV09PShjaGFyKTB4YmIgJiYKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnX29wdFsyXT09KGNoYXIpMHhiZikgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJVVEYtOCBieXRlIG9yZGVyIG1hcmsgZGV0ZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICBjb25maWdfb3B0Kz0zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiVVRGLTggYnl0ZSBvcmRlciBtYXJrIG5vdCBkZXRlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqY29uZmlnX29wdCkpCisgICAgICAgICAgICArK2NvbmZpZ19vcHQ7IC8qIHJlbW92ZSBpbml0aWFsIHdoaXRlc3BhY2VzICovCisgICAgICAgIGZvcihpPShpbnQpc3RybGVuKGNvbmZpZ19vcHQpLTE7IGk+PTAgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhciljb25maWdfb3B0W2ldKTsgLS1pKQorICAgICAgICAgICAgY29uZmlnX29wdFtpXT0nXDAnOyAvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMgKi8KKyAgICAgICAgaWYoY29uZmlnX29wdFswXT09J1wwJyB8fCBjb25maWdfb3B0WzBdPT0nIycgfHwgY29uZmlnX29wdFswXT09JzsnKSAvKiBlbXB0eSBvciBjb21tZW50ICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZihjb25maWdfb3B0WzBdPT0nWycgJiYgY29uZmlnX29wdFtzdHJsZW4oY29uZmlnX29wdCktMV09PSddJykgeyAvKiBuZXcgc2VjdGlvbiAqLworICAgICAgICAgICAgU0VSVklDRV9PUFRJT05TICpuZXdfc2VjdGlvbjsKKworICAgICAgICAgICAgaWYoIW5ld19zZXJ2aWNlX29wdGlvbnMubmV4dCkgeyAvKiBpbml0aWFsaXplIGdsb2JhbCBvcHRpb25zICovCisgICAgICAgICAgICAgICAgZXJyc3RyPXBhcnNlX2dsb2JhbF9vcHRpb24oQ01EX0VORCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYoZXJyc3RyKSB7CisgICAgICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICIlczolZDogXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBsaW5lX251bWJlciwgbGluZV90ZXh0LCBlcnJzdHIpOworICAgICAgICAgICAgICAgICAgICBmaWxlX2Nsb3NlKGRmKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjb25maWdfb3B0OworICAgICAgICAgICAgY29uZmlnX29wdFtzdHJsZW4oY29uZmlnX29wdCktMV09J1wwJzsKKyAgICAgICAgICAgIG5ld19zZWN0aW9uPXN0cl9hbGxvYyhzaXplb2YoU0VSVklDRV9PUFRJT05TKSk7CisgICAgICAgICAgICBtZW1jcHkobmV3X3NlY3Rpb24sICZuZXdfc2VydmljZV9vcHRpb25zLCBzaXplb2YoU0VSVklDRV9PUFRJT05TKSk7CisgICAgICAgICAgICBuZXdfc2VjdGlvbi0+c2Vydm5hbWU9c3RyX2R1cChjb25maWdfb3B0KTsKKyAgICAgICAgICAgIG5ld19zZWN0aW9uLT5zZXNzaW9uPU5VTEw7CisgICAgICAgICAgICBuZXdfc2VjdGlvbi0+bmV4dD1OVUxMOworICAgICAgICAgICAgKCpzZWN0aW9uKS0+bmV4dD1uZXdfc2VjdGlvbjsKKyAgICAgICAgICAgICpzZWN0aW9uPW5ld19zZWN0aW9uOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25maWdfYXJnPXN0cmNocihjb25maWdfbGluZSwgJz0nKTsKKyAgICAgICAgaWYoIWNvbmZpZ19hcmcpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICIlczolZDogXCIlc1wiOiBObyAnPScgZm91bmQiLAorICAgICAgICAgICAgICAgIHBhdGgsIGxpbmVfbnVtYmVyLCBsaW5lX3RleHQpOworICAgICAgICAgICAgZmlsZV9jbG9zZShkZik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqY29uZmlnX2FyZysrPSdcMCc7IC8qIHNwbGl0IGludG8gb3B0aW9uIG5hbWUgYW5kIGFyZ3VtZW50IHZhbHVlICovCisgICAgICAgIGZvcihpPShpbnQpc3RybGVuKGNvbmZpZ19vcHQpLTE7IGk+PTAgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhciljb25maWdfb3B0W2ldKTsgLS1pKQorICAgICAgICAgICAgY29uZmlnX29wdFtpXT0nXDAnOyAvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMgKi8KKyAgICAgICAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqY29uZmlnX2FyZykpCisgICAgICAgICAgICArK2NvbmZpZ19hcmc7IC8qIHJlbW92ZSBpbml0aWFsIHdoaXRlc3BhY2VzICovCisKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAoY29uZmlnX29wdCwgImluY2x1ZGUiKSkgeworICAgICAgICAgICAgaWYob3B0aW9uc19pbmNsdWRlKGNvbmZpZ19hcmcsIHNlY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIiVzOiVkOiBGYWlsZWQgdG8gaW5jbHVkZSBkaXJlY3RvcnkgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgcGF0aCwgbGluZV9udW1iZXIsIGNvbmZpZ19hcmcpOworICAgICAgICAgICAgICAgIGZpbGVfY2xvc2UoZGYpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBlcnJzdHI9b3B0aW9uX25vdF9mb3VuZDsKKyAgICAgICAgLyogdHJ5IGdsb2JhbCBvcHRpb25zIGZpcnN0IChlLmcuIGZvciAnZGVidWcnKSAqLworICAgICAgICBpZighbmV3X3NlcnZpY2Vfb3B0aW9ucy5uZXh0KQorICAgICAgICAgICAgZXJyc3RyPXBhcnNlX2dsb2JhbF9vcHRpb24oQ01EX0VYRUMsIGNvbmZpZ19vcHQsIGNvbmZpZ19hcmcpOworICAgICAgICBpZihlcnJzdHI9PW9wdGlvbl9ub3RfZm91bmQpCisgICAgICAgICAgICBlcnJzdHI9cGFyc2Vfc2VydmljZV9vcHRpb24oQ01EX0VYRUMsICpzZWN0aW9uLCBjb25maWdfb3B0LCBjb25maWdfYXJnKTsKKyAgICAgICAgaWYoZXJyc3RyKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiJXM6JWQ6IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgIHBhdGgsIGxpbmVfbnVtYmVyLCBsaW5lX3RleHQsIGVycnN0cik7CisgICAgICAgICAgICBmaWxlX2Nsb3NlKGRmKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGZpbGVfY2xvc2UoZGYpOworICAgIHJldHVybiAwOworfQorCitOT0VYUE9SVCBpbnQgb3B0aW9uc19pbmNsdWRlKGNoYXIgKmRpcmVjdG9yeSwgU0VSVklDRV9PUFRJT05TICoqc2VjdGlvbikgeworICAgIHN0cnVjdCBkaXJlbnQgKipuYW1lbGlzdDsKKyAgICBpbnQgaSwgbnVtLCBlcnI9MDsKKworICAgIG51bT1zY2FuZGlyKGRpcmVjdG9yeSwgJm5hbWVsaXN0LCBOVUxMLCBhbHBoYXNvcnQpOworICAgIGlmKG51bTwwKSB7CisgICAgICAgIGlvZXJyb3IoInNjYW5kaXIiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvcihpPTA7IGk8bnVtOyArK2kpIHsKKyAgICAgICAgaWYoIWVycikgeworICAgICAgICAgICAgc3RydWN0IHN0YXQgc2I7CisgICAgICAgICAgICBjaGFyICpuYW1lPXN0cl9wcmludGYoCisjaWZkZWYgVVNFX1dJTjMyCisgICAgICAgICAgICAgICAgIiVzXFwlcyIsCisjZWxzZQorICAgICAgICAgICAgICAgICIlcy8lcyIsCisjZW5kaWYKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnksIG5hbWVsaXN0W2ldLT5kX25hbWUpOworICAgICAgICAgICAgc3RhdChuYW1lLCAmc2IpOworICAgICAgICAgICAgaWYoU19JU1JFRyhzYi5zdF9tb2RlKSkKKyAgICAgICAgICAgICAgICBlcnI9b3B0aW9uc19maWxlKG5hbWUsIENPTkZfRklMRSwgc2VjdGlvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiXCIlc1wiIGlzIG5vdCBhIGZpbGUiLCBuYW1lKTsKKyAgICAgICAgICAgIHN0cl9mcmVlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGZyZWUobmFtZWxpc3RbaV0pOworICAgIH0KKyAgICBmcmVlKG5hbWVsaXN0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisjaWZkZWYgVVNFX1dJTjMyCisKK2ludCBzY2FuZGlyKGNvbnN0IGNoYXIgKmRpcnAsIHN0cnVjdCBkaXJlbnQgKioqbmFtZWxpc3QsCisgICAgICAgIGludCAoKmZpbHRlcikoY29uc3Qgc3RydWN0IGRpcmVudCAqKSwKKyAgICAgICAgaW50ICgqY29tcGFyKShjb25zdCBzdHJ1Y3QgZGlyZW50ICoqLCBjb25zdCBzdHJ1Y3QgZGlyZW50ICoqKSkgeworICAgIFdJTjMyX0ZJTkRfREFUQSBkYXRhOworICAgIEhBTkRMRSBoOworICAgIHVuc2lnbmVkIG51bT0wLCBhbGxvY2F0ZWQ9MDsKKyAgICBMUFRTVFIgcGF0aCwgcGF0dGVybjsKKyAgICBjaGFyICpuYW1lOworICAgIERXT1JEIHNhdmVkX2Vycm5vOworCisgICAgKHZvaWQpZmlsdGVyOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKWNvbXBhcjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBwYXRoPXN0cjJ0c3RyKGRpcnApOworICAgIHBhdHRlcm49c3RyX3RwcmludGYoVEVYVCgiJXNcXCoiKSwgcGF0aCk7CisgICAgc3RyX2ZyZWUocGF0aCk7CisgICAgaD1GaW5kRmlyc3RGaWxlKHBhdHRlcm4sICZkYXRhKTsKKyAgICBzYXZlZF9lcnJubz1HZXRMYXN0RXJyb3IoKTsKKyAgICBzdHJfZnJlZShwYXR0ZXJuKTsKKyAgICBTZXRMYXN0RXJyb3Ioc2F2ZWRfZXJybm8pOworICAgIGlmKGg9PUlOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKm5hbWVsaXN0PU5VTEw7CisgICAgZG8geworICAgICAgICBpZihudW0+PWFsbG9jYXRlZCkgeworICAgICAgICAgICAgYWxsb2NhdGVkKz0xNjsKKyAgICAgICAgICAgICpuYW1lbGlzdD1yZWFsbG9jKCpuYW1lbGlzdCwgYWxsb2NhdGVkKnNpemVvZigqKm5hbWVsaXN0KSk7CisgICAgICAgIH0KKyAgICAgICAgKCpuYW1lbGlzdClbbnVtXT1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXJlbnQpKTsKKyAgICAgICAgaWYoISgqbmFtZWxpc3QpW251bV0pCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG5hbWU9dHN0cjJzdHIoZGF0YS5jRmlsZU5hbWUpOworICAgICAgICBzdHJuY3B5KCgqbmFtZWxpc3QpW251bV0tPmRfbmFtZSwgbmFtZSwgTUFYX1BBVEgtMSk7CisgICAgICAgICgqbmFtZWxpc3QpW251bV0tPmRfbmFtZVtNQVhfUEFUSC0xXT0nXDAnOworICAgICAgICBzdHJfZnJlZShuYW1lKTsKKyAgICAgICAgKytudW07CisgICAgfSB3aGlsZShGaW5kTmV4dEZpbGUoaCwgJmRhdGEpKTsKKyAgICBGaW5kQ2xvc2UoaCk7CisgICAgcmV0dXJuIChpbnQpbnVtOworfQorCitpbnQgYWxwaGFzb3J0KGNvbnN0IHN0cnVjdCBkaXJlbnQgKiphLCBjb25zdCBzdHJ1Y3QgZGlyZW50ICoqYikgeworICAgICh2b2lkKWE7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpYjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAvKiBtb3N0IFdpbmRvd3MgZmlsZXN5c3RlbSByZXR1cm4gc29ydGVkIGRhdGEgKi8KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3ZvaWQgb3B0aW9uc19kZWZhdWx0cygpIHsKKyAgICAvKiBpbml0aWFsaXplIGdsb2JhbHMgKmJlZm9yZSogb3BlbmluZyB0aGUgY29uZmlnIGZpbGUgKi8KKyAgICBtZW1zZXQoJm5ld19nbG9iYWxfb3B0aW9ucywgMCwgc2l6ZW9mKEdMT0JBTF9PUFRJT05TKSk7IC8qIHJlc2V0IGdsb2JhbCBvcHRpb25zICovCisgICAgbWVtc2V0KCZuZXdfc2VydmljZV9vcHRpb25zLCAwLCBzaXplb2YoU0VSVklDRV9PUFRJT05TKSk7IC8qIHJlc2V0IGxvY2FsIG9wdGlvbnMgKi8KKyAgICBuZXdfc2VydmljZV9vcHRpb25zLm5leHQ9TlVMTDsKKyAgICBwYXJzZV9nbG9iYWxfb3B0aW9uKENNRF9CRUdJTiwgTlVMTCwgTlVMTCk7CisgICAgcGFyc2Vfc2VydmljZV9vcHRpb24oQ01EX0JFR0lOLCAmbmV3X3NlcnZpY2Vfb3B0aW9ucywgTlVMTCwgTlVMTCk7Cit9CisKK3ZvaWQgb3B0aW9uc19hcHBseSgpIHsgLyogYXBwbHkgZGVmYXVsdC92YWxpZGF0ZWQgY29uZmlndXJhdGlvbiAqLworICAgIC8qIEZJWE1FOiB0aGlzIG9wZXJhdGlvbiBtYXkgYmUgdW5zYWZlLCBhcyBjbGllbnQoKSB0aHJlYWRzIHVzZSBpdCAqLworICAgIG1lbWNweSgmZ2xvYmFsX29wdGlvbnMsICZuZXdfZ2xvYmFsX29wdGlvbnMsIHNpemVvZihHTE9CQUxfT1BUSU9OUykpOworICAgIC8qIHNlcnZpY2Vfb3B0aW9ucyBhcmUgdXNlZCBmb3IgaW5ldGQgbW9kZSBhbmQgdG8gZW51bWVyYXRlIHNlcnZpY2VzICovCisgICAgbWVtY3B5KCZzZXJ2aWNlX29wdGlvbnMsICZuZXdfc2VydmljZV9vcHRpb25zLCBzaXplb2YoU0VSVklDRV9PUFRJT05TKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBvcHRpb25zICovCisKK05PRVhQT1JUIGNoYXIgKnBhcnNlX2dsb2JhbF9vcHRpb24oQ01EIGNtZCwgY2hhciAqb3B0LCBjaGFyICphcmcpIHsKKyAgICBjaGFyICp0bXBfc3RyOworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBzdHJ1Y3QgZ3JvdXAgKmdyOworICAgIHN0cnVjdCBwYXNzd2QgKnB3OworI2VuZGlmCisKKyAgICBpZihjbWQ9PUNNRF9ERUZBVUxUIHx8IGNtZD09Q01EX0hFTFApIHsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiAiKTsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIkdsb2JhbCBvcHRpb25zOiIpOworICAgIH0KKworICAgIC8qIGNocm9vdCAqLworI2lmZGVmIEhBVkVfQ0hST09UCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMuY2hyb290X2Rpcj1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImNocm9vdCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5jaHJvb3RfZGlyPXN0cl9kdXAoYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBkaXJlY3RvcnkgdG8gY2hyb290IHN0dW5uZWwgcHJvY2VzcyIsICJjaHJvb3QiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfQ0hST09UICovCisKKyAgICAvKiBjb21wcmVzc2lvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5jb21wcmVzc2lvbj1DT01QX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiY29tcHJlc3Npb24iKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihTU0xlYXkoKT49MHgwMDkwODA1MUwgJiYgIXN0cmNhc2VjbXAoYXJnLCAiZGVmbGF0ZSIpKQorICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmNvbXByZXNzaW9uPUNPTVBfREVGTEFURTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChhcmcsICJ6bGliIikpCisgICAgICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMuY29tcHJlc3Npb249Q09NUF9aTElCOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlNwZWNpZmllZCBjb21wcmVzc2lvbiB0eXBlIGlzIG5vdCBhdmFpbGFibGUiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGNvbXByZXNzaW9uIHR5cGUiLAorICAgICAgICAgICAgImNvbXByZXNzaW9uIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0NPTVApICovCisKKyAgICAvKiBkZWJ1ZyAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X3NlcnZpY2Vfb3B0aW9ucy5sb2dfbGV2ZWw9TE9HX05PVElDRTsKKyNpZiAhZGVmaW5lZCAoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZCAoX192bXMpCisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5sb2dfZmFjaWxpdHk9TE9HX0RBRU1PTjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImRlYnVnIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHBhcnNlX2RlYnVnX2xldmVsKGFyZywgJm5ld19zZXJ2aWNlX29wdGlvbnMpOworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyNpZiAhZGVmaW5lZCAoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZCAoX192bXMpCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzIiwgImRlYnVnIiwgImRhZW1vbi5ub3RpY2UiKTsKKyNlbHNlCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzIiwgImRlYnVnIiwgIm5vdGljZSIpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IFtmYWNpbGl0eV0ubGV2ZWwgKGUuZy4gZGFlbW9uLmluZm8pIiwgImRlYnVnIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEVHRCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyNpZmRlZiBFR0RfU09DS0VUCisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5lZ2Rfc29jaz1FR0RfU09DS0VUOworI2Vsc2UKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmVnZF9zb2NrPU5VTEw7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJFR0QiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMuZWdkX3NvY2s9c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisjaWZkZWYgRUdEX1NPQ0tFVAorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJFR0QiLCBFR0RfU09DS0VUKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBwYXRoIHRvIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQiLCAiRUdEIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCisgICAgLyogZW5naW5lICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBlbmdpbmVfcmVzZXRfbGlzdCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImVuZ2luZSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgImF1dG8iKSkKKyAgICAgICAgICAgIHJldHVybiBlbmdpbmVfYXV0bygpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZW5naW5lX29wZW4oYXJnKTsKKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGVuZ2luZV9uZXh0KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGF1dG98ZW5naW5lX2lkIiwKKyAgICAgICAgICAgICJlbmdpbmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZW5naW5lQ3RybCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJlbmdpbmVDdHJsIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdG1wX3N0cj1zdHJjaHIoYXJnLCAnOicpOworICAgICAgICBpZih0bXBfc3RyKQorICAgICAgICAgICAgKnRtcF9zdHIrKz0nXDAnOworICAgICAgICByZXR1cm4gZW5naW5lX2N0cmwoYXJnLCB0bXBfc3RyKTsKKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGNtZFs6YXJnXSIsCisgICAgICAgICAgICAiZW5naW5lQ3RybCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBlbmdpbmVEZWZhdWx0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImVuZ2luZURlZmF1bHQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gZW5naW5lX2RlZmF1bHQoYXJnKTsKKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IFRBU0tfTElTVCIsCisgICAgICAgICAgICAiZW5naW5lRGVmYXVsdCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgKi8KKworICAgIC8qIGZpcHMgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisjaWZkZWYgVVNFX0ZJUFMKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5maXBzPTA7CisjZW5kaWYgLyogVVNFX0ZJUFMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJmaXBzIikpCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfRklQUworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24uZmlwcz0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vIikpCisgICAgICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMub3B0aW9uLmZpcHM9MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJUaGUgYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICd5ZXMnIG9yICdubyciOworI2Vsc2UKKyAgICAgICAgaWYoc3RyY2FzZWNtcChhcmcsICJubyIpKQorICAgICAgICAgICAgcmV0dXJuICJGSVBTIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSI7CisjZW5kaWYgLyogVVNFX0ZJUFMgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorI2lmZGVmIFVTRV9GSVBTCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHllc3xubyBGSVBTIDE0MC0yIG1vZGUiLAorICAgICAgICAgICAgImZpcHMiKTsKKyNlbmRpZiAvKiBVU0VfRklQUyAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBmb3JlZ3JvdW5kICovCisjaWZuZGVmIFVTRV9XSU4zMgorICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5mb3JlZ3JvdW5kPTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiZm9yZWdyb3VuZCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5mb3JlZ3JvdW5kPTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24uZm9yZWdyb3VuZD0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzfG5vIGZvcmVncm91bmQgbW9kZSAoZG9uJ3QgZm9yaywgbG9nIHRvIHN0ZGVycikiLAorICAgICAgICAgICAgImZvcmVncm91bmQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBJQ09OX0lNQUdFCisKKyAgICAvKiBpY29uQWN0aXZlICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMuaWNvbltJQ09OX0FDVElWRV09bG9hZF9pY29uX2RlZmF1bHQoSUNPTl9BQ1RJVkUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImljb25BY3RpdmUiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighKG5ld19nbG9iYWxfb3B0aW9ucy5pY29uW0lDT05fQUNUSVZFXT1sb2FkX2ljb25fZmlsZShhcmcpKSkKKyAgICAgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIGxvYWQgdGhlIHNwZWNpZmllZCBpY29uIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBpY29uIHdoZW4gY29ubmVjdGlvbnMgYXJlIGVzdGFibGlzaGVkIiwgImljb25BY3RpdmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogaWNvbkVycm9yICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMuaWNvbltJQ09OX0VSUk9SXT1sb2FkX2ljb25fZGVmYXVsdChJQ09OX0VSUk9SKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJpY29uRXJyb3IiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighKG5ld19nbG9iYWxfb3B0aW9ucy5pY29uW0lDT05fRVJST1JdPWxvYWRfaWNvbl9maWxlKGFyZykpKQorICAgICAgICAgICAgcmV0dXJuICJGYWlsZWQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGljb24iOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGljb24gZm9yIGludmFsaWQgY29uZmlndXJhdGlvbiBmaWxlIiwgImljb25FcnJvciIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpY29uSWRsZSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmljb25bSUNPTl9JRExFXT1sb2FkX2ljb25fZGVmYXVsdChJQ09OX0lETEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImljb25JZGxlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIShuZXdfZ2xvYmFsX29wdGlvbnMuaWNvbltJQ09OX0lETEVdPWxvYWRfaWNvbl9maWxlKGFyZykpKQorICAgICAgICAgICAgcmV0dXJuICJGYWlsZWQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGljb24iOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGljb24gd2hlbiBubyBjb25uZWN0aW9ucyB3ZXJlIGVzdGFibGlzaGVkIiwgImljb25JZGxlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2VuZGlmIC8qIElDT05fSU1BR0UgKi8KKworICAgIC8qIGxvZyAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmxvZ19maWxlX21vZGU9RklMRV9NT0RFX0FQUEVORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJsb2ciKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJhcHBlbmQiKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5sb2dfZmlsZV9tb2RlPUZJTEVfTU9ERV9BUFBFTkQ7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAib3ZlcndyaXRlIikpCisgICAgICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMubG9nX2ZpbGVfbW9kZT1GSUxFX01PREVfT1ZFUldSSVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ2FwcGVuZCcgb3IgJ292ZXJ3cml0ZSciOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGFwcGVuZHxvdmVyd3JpdGUgbG9nIGZpbGUiLAorICAgICAgICAgICAgImxvZyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBvdXRwdXQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vdXRwdXRfZmlsZT1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIm91dHB1dCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vdXRwdXRfZmlsZT1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gZmlsZSB0byBhcHBlbmQgbG9nIG1lc3NhZ2VzIiwgIm91dHB1dCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBwaWQgKi8KKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMucGlkZmlsZT1OVUxMOyAvKiBkbyBub3QgY3JlYXRlIGEgcGlkIGZpbGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJwaWQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihhcmdbMF0pIC8qIGlzIGFyZ3VtZW50IG5vdCBlbXB0eT8gKi8KKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5waWRmaWxlPXN0cl9kdXAoYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLnBpZGZpbGU9TlVMTDsgLyogZW1wdHkgLT4gZG8gbm90IGNyZWF0ZSBhIHBpZCBmaWxlICovCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gcGlkIGZpbGUiLCAicGlkIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgLyogUk5EYnl0ZXMgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5yYW5kb21fYnl0ZXM9UkFORE9NX0JZVEVTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIlJORGJ5dGVzIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLnJhbmRvbV9ieXRlcz0obG9uZylzdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gcmFuZG9tIHNlZWQgZmlsZXMiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVkIiwgIlJORGJ5dGVzIiwgUkFORE9NX0JZVEVTKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gYnl0ZXMgdG8gcmVhZCBmcm9tIHJhbmRvbSBzZWVkIGZpbGVzIiwgIlJORGJ5dGVzIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFJORGZpbGUgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5yYW5kX2ZpbGU9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJSTkRmaWxlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLnJhbmRfZmlsZT1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyNpZmRlZiBSQU5ET01fRklMRQorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJSTkRmaWxlIiwgUkFORE9NX0ZJTEUpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHBhdGggdG8gZmlsZSB3aXRoIHJhbmRvbSBzZWVkIGRhdGEiLCAiUk5EZmlsZSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBSTkRvdmVyd3JpdGUgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24ucmFuZF93cml0ZT0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIlJORG92ZXJ3cml0ZSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5yYW5kX3dyaXRlPTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24ucmFuZF93cml0ZT0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzIiwgIlJORG92ZXJ3cml0ZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSB5ZXN8bm8gb3ZlcndyaXRlIHNlZWQgZGF0YWZpbGVzIHdpdGggbmV3IHJhbmRvbSBkYXRhIiwKKyAgICAgICAgICAgICJSTkRvdmVyd3JpdGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZuZGVmIFVTRV9XSU4zMgorICAgIC8qIHNlcnZpY2UgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19zZXJ2aWNlX29wdGlvbnMuc2Vydm5hbWU9c3RyX2R1cCgic3R1bm5lbCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInNlcnZpY2UiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXdfc2VydmljZV9vcHRpb25zLnNlcnZuYW1lPXN0cl9kdXAoYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBzZXJ2aWNlIG5hbWUiLCAic2VydmljZSIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICAvKiBzZXRnaWQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5naWQ9MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzZXRnaWQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBncj1nZXRncm5hbShhcmcpOworICAgICAgICBpZihncikgeworICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmdpZD1nci0+Z3JfZ2lkOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgICAgIH0KKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLmdpZD0oZ2lkX3Qpc3RydG9sKGFyZywgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBHSUQiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGdyb3VwbmFtZSBmb3Igc2V0Z2lkKCkiLCAic2V0Z2lkIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIFVTRV9XSU4zMgorICAgIC8qIHNldHVpZCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLnVpZD0wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInNldHVpZCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHB3PWdldHB3bmFtKGFyZyk7CisgICAgICAgIGlmKHB3KSB7CisgICAgICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMudWlkPXB3LT5wd191aWQ7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICAgICAgfQorICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMudWlkPSh1aWRfdClzdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIFVJRCI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gdXNlcm5hbWUgZm9yIHNldHVpZCgpIiwgInNldHVpZCIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIHNvY2tldCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzb2NrZXQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihwYXJzZV9zb2NrZXRfb3B0aW9uKGFyZykpCisgICAgICAgICAgICByZXR1cm4gIklsbGVnYWwgc29ja2V0IG9wdGlvbiI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gYXxsfHI6b3B0aW9uPXZhbHVlWzp2YWx1ZV0iLCAic29ja2V0Iik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlMjVzc2V0IGFuIG9wdGlvbiBvbiBhY2NlcHQvbG9jYWwvcmVtb3RlIHNvY2tldCIsICIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogc3lzbG9nICovCisjaWZuZGVmIFVTRV9XSU4zMgorICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5zeXNsb2c9MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzeXNsb2ciKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24uc3lzbG9nPTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24uc3lzbG9nPTA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiVGhlIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGVpdGhlciAneWVzJyBvciAnbm8nIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSB5ZXN8bm8gc2VuZCBsb2dnaW5nIG1lc3NhZ2VzIHRvIHN5c2xvZyIsCisgICAgICAgICAgICAic3lzbG9nIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgLyogdGFza2JhciAqLworI2lmZGVmIFVTRV9XSU4zMgorICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi50YXNrYmFyPTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAidGFza2JhciIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi50YXNrYmFyPTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIG5ld19nbG9iYWxfb3B0aW9ucy5vcHRpb24udGFza2Jhcj0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzIiwgInRhc2tiYXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzfG5vIGVuYWJsZSB0aGUgdGFza2JhciBpY29uIiwgInRhc2tiYXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBpZihjbWQ9PUNNRF9FWEVDKQorICAgICAgICByZXR1cm4gb3B0aW9uX25vdF9mb3VuZDsKKworICAgIGlmKGNtZD09Q01EX0VORCkgeworICAgICAgICAvKiBGSVBTIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlICovCisgICAgICAgIGlmKHNzbF9jb25maWd1cmUoJm5ld19nbG9iYWxfb3B0aW9ucykpIC8qIGNvbmZpZ3VyZSBnbG9iYWwgU1NMIHNldHRpbmdzICovCisgICAgICAgICAgICByZXR1cm4gIkZhaWxlZCB0byBpbml0aWFsaXplIFNTTCI7CisgICAgfQorICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzZXJ2aWNlLWxldmVsIG9wdGlvbnMgKi8KKworTk9FWFBPUlQgY2hhciAqcGFyc2Vfc2VydmljZV9vcHRpb24oQ01EIGNtZCwgU0VSVklDRV9PUFRJT05TICpzZWN0aW9uLAorICAgICAgICBjaGFyICpvcHQsIGNoYXIgKmFyZykgeworICAgIGNoYXIgKnRtcF9zdHI7CisgICAgaW50IGVuZHBvaW50cz0wOworICAgIGxvbmcgdG1wX2xvbmc7CisKKyAgICBpZihjbWQ9PUNNRF9ERUZBVUxUIHx8IGNtZD09Q01EX0hFTFApIHsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiAiKTsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIlNlcnZpY2UtbGV2ZWwgb3B0aW9uczoiKTsKKyAgICB9CisKKyAgICAvKiBhY2NlcHQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5hY2NlcHQ9MDsKKyAgICAgICAgbWVtc2V0KCZzZWN0aW9uLT5sb2NhbF9hZGRyLCAwLCBzaXplb2YoU09DS0FERFJfVU5JT04pKTsKKyAgICAgICAgc2VjdGlvbi0+bG9jYWxfYWRkci5pbi5zaW5fZmFtaWx5PUFGX0lORVQ7CisgICAgICAgIHNlY3Rpb24tPmZkPUlOVkFMSURfU09DS0VUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImFjY2VwdCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5hY2NlcHQ9MTsKKyAgICAgICAgaWYoIW5hbWUyYWRkcigmc2VjdGlvbi0+bG9jYWxfYWRkciwgYXJnLCAxKSkKKyAgICAgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIHJlc29sdmUgYWNjZXB0aW5nIGFkZHJlc3MiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGlmKHNlY3Rpb24tPm9wdGlvbi5hY2NlcHQpCisgICAgICAgICAgICArK2VuZHBvaW50czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gW2hvc3Q6XXBvcnQgYWNjZXB0IGNvbm5lY3Rpb25zIG9uIHNwZWNpZmllZCBob3N0OnBvcnQiLAorICAgICAgICAgICAgImFjY2VwdCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBDQXBhdGggKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisjaWYgMAorICAgICAgICBzZWN0aW9uLT5jYV9kaXI9KGNoYXIgKilYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyKCk7CisjZW5kaWYKKyAgICAgICAgc2VjdGlvbi0+Y2FfZGlyPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiQ0FwYXRoIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoYXJnWzBdKSAvKiBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgIHNlY3Rpb24tPmNhX2Rpcj1zdHJfZHVwKGFyZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlY3Rpb24tPmNhX2Rpcj1OVUxMOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisjaWYgMAorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJDQXBhdGgiLAorICAgICAgICAgICAgc2VjdGlvbi0+Y2FfZGlyID8gc2VjdGlvbi0+Y2FfZGlyIDogIihub25lKSIpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IENBIGNlcnRpZmljYXRlIGRpcmVjdG9yeSBmb3IgJ3ZlcmlmeScgb3B0aW9uIiwKKyAgICAgICAgICAgICJDQXBhdGgiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQ0FmaWxlICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorI2lmIDAKKyAgICAgICAgc2VjdGlvbi0+Y2FfZmlsZT0oY2hhciAqKVg1MDlfZ2V0X2RlZmF1bHRfY2VydGZpbGUoKTsKKyNlbmRpZgorICAgICAgICBzZWN0aW9uLT5jYV9maWxlPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiQ0FmaWxlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoYXJnWzBdKSAvKiBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgIHNlY3Rpb24tPmNhX2ZpbGU9c3RyX2R1cChhcmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWN0aW9uLT5jYV9maWxlPU5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyNpZiAwCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzIiwgIkNBZmlsZSIsCisgICAgICAgICAgICBzZWN0aW9uLT5jYV9maWxlID8gc2VjdGlvbi0+Y2FfZmlsZSA6ICIobm9uZSkiKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBDQSBjZXJ0aWZpY2F0ZSBmaWxlIGZvciAndmVyaWZ5JyBvcHRpb24iLAorICAgICAgICAgICAgIkNBZmlsZSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjZXJ0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5jZXJ0PU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiY2VydCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPmNlcnQ9c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisgICAgICAgIGlmKHNlY3Rpb24tPnBza19rZXlzKQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19QU0spICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGlmKHNlY3Rpb24tPmVuZ2luZSkKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fRU5HSU5FKSAqLworICAgICAgICBpZighc2VjdGlvbi0+b3B0aW9uLmNsaWVudCAmJiAhc2VjdGlvbi0+Y2VydCkKKyAgICAgICAgICAgIHJldHVybiAiU1NMIHNlcnZlciBuZWVkcyBhIGNlcnRpZmljYXRlIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7IC8qIG5vIGRlZmF1bHQgY2VydGlmaWNhdGUgKi8KKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBjZXJ0aWZpY2F0ZSBjaGFpbiIsICJjZXJ0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMCisKKyAgICAvKiBjaGVja0VtYWlsICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5jaGVja19lbWFpbD1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImNoZWNrRW1haWwiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuYW1lX2xpc3RfYXBwZW5kKCZzZWN0aW9uLT5jaGVja19lbWFpbCwgYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBwZWVyIGNlcnRpZmljYXRlIGVtYWlsIGFkZHJlc3MiLAorICAgICAgICAgICAgImNoZWNrRW1haWwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2hlY2tIb3N0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5jaGVja19ob3N0PU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiY2hlY2tIb3N0IikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmFtZV9saXN0X2FwcGVuZCgmc2VjdGlvbi0+Y2hlY2tfaG9zdCwgYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBwZWVyIGNlcnRpZmljYXRlIGhvc3QgbmFtZSBwYXR0ZXJuIiwKKyAgICAgICAgICAgICJjaGVja0hvc3QiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2hlY2tJUCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+Y2hlY2tfaXA9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJjaGVja0lQIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmFtZV9saXN0X2FwcGVuZCgmc2VjdGlvbi0+Y2hlY2tfaXAsIGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gcGVlciBjZXJ0aWZpY2F0ZSBJUCBhZGRyZXNzIiwKKyAgICAgICAgICAgICJjaGVja0lQIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2VuZGlmIC8qIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMICovCisKKyAgICAvKiBjaXBoZXJzICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5jaXBoZXJfbGlzdD1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImNpcGhlcnMiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5jaXBoZXJfbGlzdD1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyNpZmRlZiBVU0VfRklQUworICAgICAgICBpZihuZXdfZ2xvYmFsX29wdGlvbnMub3B0aW9uLmZpcHMpIHsKKyAgICAgICAgICAgIGlmKCFuZXdfc2VydmljZV9vcHRpb25zLmNpcGhlcl9saXN0KQorICAgICAgICAgICAgICAgIG5ld19zZXJ2aWNlX29wdGlvbnMuY2lwaGVyX2xpc3Q9IkZJUFMiOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfRklQUyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZighbmV3X3NlcnZpY2Vfb3B0aW9ucy5jaXBoZXJfbGlzdCkKKyAgICAgICAgICAgICAgICBuZXdfc2VydmljZV9vcHRpb25zLmNpcGhlcl9saXN0PXN0dW5uZWxfY2lwaGVyX2xpc3Q7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorI2lmZGVmIFVTRV9GSVBTCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzICVzIiwgImNpcGhlcnMiLAorICAgICAgICAgICAgIkZJUFMiLCAiKHdpdGggXCJmaXBzID0geWVzXCIpIik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzICVzIiwgImNpcGhlcnMiLAorICAgICAgICAgICAgc3R1bm5lbF9jaXBoZXJfbGlzdCwgIih3aXRoIFwiZmlwcyA9IG5vXCIpIik7CisjZWxzZQorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJjaXBoZXJzIiwgc3R1bm5lbF9jaXBoZXJfbGlzdCk7CisjZW5kaWYgLyogVVNFX0ZJUFMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gbGlzdCBvZiBwZXJtaXR0ZWQgU1NMIGNpcGhlcnMiLCAiY2lwaGVycyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjbGllbnQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5jbGllbnQ9MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJjbGllbnQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5jbGllbnQ9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChhcmcsICJubyIpKQorICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmNsaWVudD0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzfG5vIGNsaWVudCBtb2RlIChyZW1vdGUgc2VydmljZSB1c2VzIFNTTCkiLAorICAgICAgICAgICAgImNsaWVudCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjb25uZWN0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBhZGRybGlzdF9jbGVhcigmc2VjdGlvbi0+Y29ubmVjdF9hZGRyLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJjb25uZWN0IikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmFtZV9saXN0X2FwcGVuZCgmc2VjdGlvbi0+Y29ubmVjdF9hZGRyLm5hbWVzLCBhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGlmKHNlY3Rpb24tPmNvbm5lY3RfYWRkci5uYW1lcykgeworICAgICAgICAgICAgaWYoIXNlY3Rpb24tPm9wdGlvbi5kZWxheWVkX2xvb2t1cCAmJgorICAgICAgICAgICAgICAgICAgICAhYWRkcmxpc3RfcmVzb2x2ZSgmc2VjdGlvbi0+Y29ubmVjdF9hZGRyKSkgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlc29sdmUgY29ubmVjdCB0YXJnZXQgLSBkZWxheWluZyBETlMgbG9va3VwIik7CisgICAgICAgICAgICAgICAgc2VjdGlvbi0+cmVkaXJlY3RfYWRkci5udW09MDsKKyAgICAgICAgICAgICAgICBzdHJfZnJlZShzZWN0aW9uLT5yZWRpcmVjdF9hZGRyLm5hbWVzKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5yZWRpcmVjdF9hZGRyLm5hbWVzPU5VTEw7CisgICAgICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmRlbGF5ZWRfbG9va3VwPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2VuZHBvaW50czsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBbaG9zdDpdcG9ydCB0byBjb25uZWN0IiwKKyAgICAgICAgICAgICJjb25uZWN0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIENSTHBhdGggKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPmNybF9kaXI9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJDUkxwYXRoIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoYXJnWzBdKSAvKiBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgIHNlY3Rpb24tPmNybF9kaXI9c3RyX2R1cChhcmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWN0aW9uLT5jcmxfZGlyPU5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gQ1JMIGRpcmVjdG9yeSIsICJDUkxwYXRoIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIENSTGZpbGUgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPmNybF9maWxlPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiQ1JMZmlsZSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKGFyZ1swXSkgLyogbm90IGVtcHR5ICovCisgICAgICAgICAgICBzZWN0aW9uLT5jcmxfZmlsZT1zdHJfZHVwKGFyZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlY3Rpb24tPmNybF9maWxlPU5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gQ1JMIGZpbGUiLCAiQ1JMZmlsZSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisKKyAgICAvKiBjdXJ2ZSAqLworI2RlZmluZSBERUZBVUxUX0NVUlZFIE5JRF9YOV82Ml9wcmltZTI1NnYxCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5jdXJ2ZT1ERUZBVUxUX0NVUlZFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImN1cnZlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+Y3VydmU9T0JKX3R4dDJuaWQoYXJnKTsKKyAgICAgICAgaWYoc2VjdGlvbi0+Y3VydmU9PU5JRF91bmRlZikKKyAgICAgICAgICAgIHJldHVybiAiQ3VydmUgbmFtZSBub3Qgc3VwcG9ydGVkIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJjdXJ2ZSIsIE9CSl9uaWQybG4oREVGQVVMVF9DVVJWRSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBFQ0RIIGN1cnZlIG5hbWUiLCAiY3VydmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19FQ0RIKSAqLworCisgICAgLyogZGVidWcgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIG5ld19zZXJ2aWNlX29wdGlvbnMubG9nX2xldmVsPUxPR19OT1RJQ0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiZGVidWciKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcGFyc2VfZGVidWdfbGV2ZWwoYXJnLCBzZWN0aW9uKTsKKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzIiwgImRlYnVnIiwgIm5vdGljZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBsZXZlbCAoZS5nLiBpbmZvKSIsICJkZWJ1ZyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBkZWxheSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmRlbGF5ZWRfbG9va3VwPTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiZGVsYXkiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5kZWxheWVkX2xvb2t1cD0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24uZGVsYXllZF9sb29rdXA9MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJUaGUgYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICd5ZXMnIG9yICdubyciOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsCisgICAgICAgICAgICAiJS0yMnMgPSB5ZXN8bm8gZGVsYXkgRE5TIGxvb2t1cCBmb3IgJ2Nvbm5lY3QnIG9wdGlvbiIsCisgICAgICAgICAgICAiZGVsYXkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisKKyAgICAvKiBlbmdpbmVJZCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJlbmdpbmVJZCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPmVuZ2luZT1lbmdpbmVfZ2V0X2J5X2lkKGFyZyk7CisgICAgICAgIGlmKCFzZWN0aW9uLT5lbmdpbmUpCisgICAgICAgICAgICByZXR1cm4gIkVuZ2luZSBJRCBub3QgZm91bmQiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IElEIG9mIGVuZ2luZSB0byByZWFkIHRoZSBrZXkgZnJvbSIsCisgICAgICAgICAgICAiZW5naW5lSWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZW5naW5lTnVtICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImVuZ2luZU51bSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0bXBfaW50PShpbnQpc3RydG9sKGFyZywgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgICAgIGlmKHRtcF9zdHI9PWFyZyB8fCAqdG1wX3N0cikgLyogbm90IGEgbnVtYmVyICovCisgICAgICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIGVuZ2luZSBudW1iZXIiOworICAgICAgICAgICAgc2VjdGlvbi0+ZW5naW5lPWVuZ2luZV9nZXRfYnlfbnVtKHRtcF9pbnQtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIXNlY3Rpb24tPmVuZ2luZSkKKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBlbmdpbmUgbnVtYmVyIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBudW1iZXIgb2YgZW5naW5lIHRvIHJlYWQgdGhlIGtleSBmcm9tIiwKKyAgICAgICAgICAgICJlbmdpbmVOdW0iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19FTkdJTkUpICovCisKKyAgICAvKiBleGVjICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5leGVjX25hbWU9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJleGVjIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+ZXhlY19uYW1lPXN0cl9kdXAoYXJnKTsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICAgICAgc2VjdGlvbi0+ZXhlY19hcmdzPXN0cl9kdXAoYXJnKTsKKyNlbHNlCisgICAgICAgIGlmKCFzZWN0aW9uLT5leGVjX2FyZ3MpIHsKKyAgICAgICAgICAgIHNlY3Rpb24tPmV4ZWNfYXJncz1zdHJfYWxsb2MoMipzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBzZWN0aW9uLT5leGVjX2FyZ3NbMF09c2VjdGlvbi0+ZXhlY19uYW1lOworICAgICAgICAgICAgc2VjdGlvbi0+ZXhlY19hcmdzWzFdPU5VTEw7IC8qIHRvIHNob3cgdGhhdCBpdCdzIG51bGwtdGVybWluYXRlZCAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBpZihzZWN0aW9uLT5leGVjX25hbWUpCisgICAgICAgICAgICArK2VuZHBvaW50czsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gZmlsZSBleGVjdXRlIGxvY2FsIGluZXRkLXR5cGUgcHJvZ3JhbSIsCisgICAgICAgICAgICAiZXhlYyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBleGVjQXJncyAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+ZXhlY19hcmdzPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiZXhlY0FyZ3MiKSkKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVTRV9XSU4zMgorICAgICAgICBzZWN0aW9uLT5leGVjX2FyZ3M9c3RyX2R1cChhcmcpOworI2Vsc2UKKyAgICAgICAgc2VjdGlvbi0+ZXhlY19hcmdzPWFyZ2FsbG9jKGFyZyk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBhcmd1bWVudHMgZm9yICdleGVjJyAoaW5jbHVkaW5nICQwKSIsCisgICAgICAgICAgICAiZXhlY0FyZ3MiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZmFpbG92ZXIgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPmZhaWxvdmVyPUZBSUxPVkVSX1JSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImZhaWxvdmVyIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAoYXJnLCAicnIiKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPmZhaWxvdmVyPUZBSUxPVkVSX1JSOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgInByaW8iKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPmZhaWxvdmVyPUZBSUxPVkVSX1BSSU87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiVGhlIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGVpdGhlciAncnInIG9yICdwcmlvJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gcnJ8cHJpbyBmYWlsb3ZlciBzdHJhdGVneSIsCisgICAgICAgICAgICAiZmFpbG92ZXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogaWRlbnQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnVzZXJuYW1lPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiaWRlbnQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT51c2VybmFtZT1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gdXNlcm5hbWUgZm9yIElERU5UIChSRkMgMTQxMykgY2hlY2tpbmciLCAiaWRlbnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoga2V5ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5rZXk9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJrZXkiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5rZXk9c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGlmKHNlY3Rpb24tPmNlcnQgJiYgIXNlY3Rpb24tPmtleSkKKyAgICAgICAgICAgIHNlY3Rpb24tPmtleT1zdHJfZHVwKHNlY3Rpb24tPmNlcnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBjZXJ0aWZpY2F0ZSBwcml2YXRlIGtleSIsICJrZXkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgVVNFX0xJQldSQVAKKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5saWJ3cmFwPTA7IC8qIGRpc2FibGUgbGlid3JhcCBieSBkZWZhdWx0ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAibGlid3JhcCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmxpYndyYXA9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChhcmcsICJubyIpKQorICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmxpYndyYXA9MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJUaGUgYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICd5ZXMnIG9yICdubyciOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHllc3xubyB1c2UgL2V0Yy9ob3N0cy5hbGxvdyBhbmQgL2V0Yy9ob3N0cy5kZW55IiwKKyAgICAgICAgICAgICJsaWJ3cmFwIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBVU0VfTElCV1JBUCAqLworCisgICAgLyogbG9jYWwgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5sb2NhbD0wOworICAgICAgICBtZW1zZXQoJnNlY3Rpb24tPnNvdXJjZV9hZGRyLCAwLCBzaXplb2YoU09DS0FERFJfVU5JT04pKTsKKyAgICAgICAgc2VjdGlvbi0+c291cmNlX2FkZHIuaW4uc2luX2ZhbWlseT1BRl9JTkVUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgImxvY2FsIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmxvY2FsPTE7CisgICAgICAgIGlmKCFob3N0cG9ydDJhZGRyKCZzZWN0aW9uLT5zb3VyY2VfYWRkciwgYXJnLCAiMCIsIDEpKQorICAgICAgICAgICAgcmV0dXJuICJGYWlsZWQgdG8gcmVzb2x2ZSBsb2NhbCBhZGRyZXNzIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBJUCBhZGRyZXNzIHRvIGJlIHVzZWQgYXMgc291cmNlIGZvciByZW1vdGUiCisgICAgICAgICAgICAiIGNvbm5lY3Rpb25zIiwgImxvY2FsIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGxvZ0lkICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5sb2dfaWQ9TE9HX0lEX1NFUUVOVElBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJsb2dJZCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInNlcXVlbnRpYWwiKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPmxvZ19pZD1MT0dfSURfU0VRRU5USUFMOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgInVuaXF1ZSIpKQorICAgICAgICAgICAgc2VjdGlvbi0+bG9nX2lkPUxPR19JRF9VTklRVUU7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAidGhyZWFkIikpCisgICAgICAgICAgICBzZWN0aW9uLT5sb2dfaWQ9TE9HX0lEX1RIUkVBRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0eXBlIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJsb2dJZCIsICJzZXF1ZW50aWFsIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGNvbm5lY3Rpb24gaWRlbnRpZmllciB0eXBlIiwKKyAgICAgICAgICAgICJsb2dJZCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQCisKKyAgICAvKiBPQ1NQICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vY3NwX3VybD1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIm9jc3AiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5vY3NwX3VybD1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gT0NTUCBzZXJ2ZXIgVVJMIiwgIm9jc3AiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogT0NTUGFpYSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmFpYT0wOyAvKiBkaXNhYmxlIEFJQSBieSBkZWZhdWx0ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiT0NTUGFpYSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLmFpYT0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24uYWlhPTA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiVGhlIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGVpdGhlciAneWVzJyBvciAnbm8nIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSB5ZXN8bm8gY2hlY2sgdGhlIEFJQSByZXNwb25kZXJzIGZyb20gY2VydGlmaWNhdGVzIiwKKyAgICAgICAgICAgICJPQ1NQYWlhIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE9DU1BmbGFnICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vY3NwX2ZsYWdzPTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiT0NTUGZsYWciKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRtcF91bG9uZz1wYXJzZV9vY3NwX2ZsYWcoYXJnKTsKKyAgICAgICAgICAgIGlmKCF0bXBfdWxvbmcpCisgICAgICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIE9DU1AgZmxhZyI7CisgICAgICAgICAgICBzZWN0aW9uLT5vY3NwX2ZsYWdzfD10bXBfdWxvbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBPQ1NQIHNlcnZlciBmbGFncyIsICJPQ1NQZmxhZyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApICovCisKKyAgICAvKiBvcHRpb25zICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5zc2xfb3B0aW9uc19zZXR8PVNTTF9PUF9OT19TU0x2MnxTU0xfT1BfTk9fU1NMdjM7CisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgwMDkwODBkZkwKKyAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfY2xlYXI9MDsKKyNlbmRpZiAvKiBPcGVuU1NMIDAuOS44bSBvciBsYXRlciAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIm9wdGlvbnMiKSkKKyAgICAgICAgICAgIGJyZWFrOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MDA5MDgwZGZMCisgICAgICAgIGlmKCphcmc9PSctJykgeworICAgICAgICAgICAgdG1wX2xvbmc9cGFyc2Vfc3NsX29wdGlvbihhcmcrMSk7CisgICAgICAgICAgICBpZighdG1wX2xvbmcpCisgICAgICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIFNTTCBvcHRpb24iOworICAgICAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfY2xlYXJ8PXRtcF9sb25nOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBPcGVuU1NMIDAuOS44bSBvciBsYXRlciAqLworICAgICAgICB0bXBfbG9uZz1wYXJzZV9zc2xfb3B0aW9uKGFyZyk7CisgICAgICAgIGlmKCF0bXBfbG9uZykKKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBTU0wgb3B0aW9uIjsKKyAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfc2V0fD10bXBfbG9uZzsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlcyIsICJvcHRpb25zIiwgIk5PX1NTTHYyIik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVzIiwgIm9wdGlvbnMiLCAiTk9fU1NMdjMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gU1NMIG9wdGlvbiIsICJvcHRpb25zIik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlMjVzc2V0IGFuIFNTTCBvcHRpb24iLCAiIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHByb3RvY29sICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5wcm90b2NvbD1OVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInByb3RvY29sIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+cHJvdG9jb2w9c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIC8qIHRoaXMgYWxzbyBpbml0aWFsaXplcyBzZWN0aW9uLT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsICovCisgICAgICAgIHRtcF9zdHI9cHJvdG9jb2woTlVMTCwgc2VjdGlvbiwgUFJPVE9DT0xfQ0hFQ0spOworICAgICAgICBpZih0bXBfc3RyKQorICAgICAgICAgICAgcmV0dXJuIHRtcF9zdHI7CisgICAgICAgIGlmKHNlY3Rpb24tPnByb3RvY29sICYmICFzdHJjYXNlY21wKHNlY3Rpb24tPnByb3RvY29sLCAic29ja3MiKSkgeworICAgICAgICAgICAgKytlbmRwb2ludHM7CisgICAgICAgIH0KKyNpZmRlZiBTU0xfT1BfTk9fVElDS0VUCisgICAgICAgIC8qIGRpc2FibGUgUkZDNDUwNyBzdXBwb3J0IGludHJvZHVjZWQgaW4gT3BlblNTTCAwLjkuOGYgKi8KKyAgICAgICAgLyogc2Vzc2lvbiB0aWNrZXRzIGRvIG5vdCBzdXBwb3J0IFNTTF9TRVNTSU9OXypfZXhfZGF0YSgpICovCisgICAgICAgIGlmKCFzZWN0aW9uLT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsKSAvKiBhZGRyZXNzIGNhY2hlIGNhbiBiZSB1c2VkICovCisgICAgICAgICAgICBzZWN0aW9uLT5zc2xfb3B0aW9uc19zZXR8PVNTTF9PUF9OT19USUNLRVQ7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gcHJvdG9jb2wgdG8gbmVnb3RpYXRlIGJlZm9yZSBTU0wgaW5pdGlhbGl6YXRpb24iLAorICAgICAgICAgICAgInByb3RvY29sIik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlMjVzY3VycmVudGx5IHN1cHBvcnRlZDogY2lmcywgY29ubmVjdCwgaW1hcCwiLCAiIik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlMjVzICAgIG5udHAsIHBnc3FsLCBwb3AzLCBwcm94eSwgc210cCIsICIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogcHJvdG9jb2xBdXRoZW50aWNhdGlvbiAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+cHJvdG9jb2xfYXV0aGVudGljYXRpb249ImJhc2ljIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJwcm90b2NvbEF1dGhlbnRpY2F0aW9uIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+cHJvdG9jb2xfYXV0aGVudGljYXRpb249c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGF1dGhlbnRpY2F0aW9uIHR5cGUgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucyIsCisgICAgICAgICAgICAicHJvdG9jb2xBdXRoZW50aWNhdGlvbiIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBwcm90b2NvbEhvc3QgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnByb3RvY29sX2hvc3Q9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJwcm90b2NvbEhvc3QiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5wcm90b2NvbF9ob3N0PXN0cl9kdXAoYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBob3N0OnBvcnQgZm9yIHByb3RvY29sIG5lZ290aWF0aW9ucyIsCisgICAgICAgICAgICAicHJvdG9jb2xIb3N0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHByb3RvY29sUGFzc3dvcmQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnByb3RvY29sX3Bhc3N3b3JkPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAicHJvdG9jb2xQYXNzd29yZCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPnByb3RvY29sX3Bhc3N3b3JkPXN0cl9kdXAoYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBwYXNzd29yZCBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zIiwKKyAgICAgICAgICAgICJwcm90b2NvbFBhc3N3b3JkIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHByb3RvY29sVXNlcm5hbWUgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnByb3RvY29sX3VzZXJuYW1lPU5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAicHJvdG9jb2xVc2VybmFtZSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPnByb3RvY29sX3VzZXJuYW1lPXN0cl9kdXAoYXJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSB1c2VybmFtZSBmb3IgcHJvdG9jb2wgbmVnb3RpYXRpb25zIiwKKyAgICAgICAgICAgICJwcm90b2NvbFVzZXJuYW1lIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCisgICAgLyogUFNLaWRlbnRpdHkgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnBza19pZGVudGl0eT1OVUxMOworICAgICAgICBzZWN0aW9uLT5wc2tfc2VsZWN0ZWQ9TlVMTDsKKyAgICAgICAgc2VjdGlvbi0+cHNrX3NvcnRlZC52YWw9TlVMTDsKKyAgICAgICAgc2VjdGlvbi0+cHNrX3NvcnRlZC5udW09MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJQU0tpZGVudGl0eSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPnBza19pZGVudGl0eT1zdHJfZHVwKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgaWYoIXNlY3Rpb24tPnBza19rZXlzKSAvKiBQU0sgbm90IGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwc2tfc29ydCgmc2VjdGlvbi0+cHNrX3NvcnRlZCwgc2VjdGlvbi0+cHNrX2tleXMpOworICAgICAgICBpZihzZWN0aW9uLT5vcHRpb24uY2xpZW50KSB7CisgICAgICAgICAgICBpZihzZWN0aW9uLT5wc2tfaWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5wc2tfc2VsZWN0ZWQ9CisgICAgICAgICAgICAgICAgICAgIHBza19maW5kKCZzZWN0aW9uLT5wc2tfc29ydGVkLCBzZWN0aW9uLT5wc2tfaWRlbnRpdHkpOworICAgICAgICAgICAgICAgIGlmKCFzZWN0aW9uLT5wc2tfc2VsZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTm8ga2V5IGZvdW5kIGZvciB0aGUgc3BlY2lmaWVkIFBTSyBpZGVudGl0eSI7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiB0YWtlIHRoZSBmaXJzdCBzcGVjaWZpZWQgaWRlbnRpdHkgYXMgZGVmYXVsdCAqLworICAgICAgICAgICAgICAgIHNlY3Rpb24tPnBza19zZWxlY3RlZD1zZWN0aW9uLT5wc2tfa2V5czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKHNlY3Rpb24tPnBza19pZGVudGl0eSkKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgICAgICAgICAiUFNLIGlkZW50aXR5IGlzIGlnbm9yZWQgaW4gdGhlIHNlcnZlciBtb2RlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gaWRlbnRpdHkgZm9yIFBTSyBhdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgICAiUFNLaWRlbnRpdHkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogUFNLc2VjcmV0cyAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+cHNrX2tleXM9TlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJQU0tzZWNyZXRzIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+cHNrX2tleXM9cHNrX3JlYWQoYXJnKTsKKyAgICAgICAgaWYoIXNlY3Rpb24tPnBza19rZXlzKQorICAgICAgICAgICAgcmV0dXJuICJGYWlsZWQgdG8gcmVhZCBQU0sgc2VjcmV0cyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgcHNrX2ZyZWUoc2VjdGlvbi0+cHNrX2tleXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBzZWNyZXRzIGZvciBQU0sgYXV0aGVudGljYXRpb24iLAorICAgICAgICAgICAgIlBTS3NlY3JldHMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19QU0spICovCisKKyAgICAvKiBwdHkgKi8KKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vcHRpb24ucHR5PTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAicHR5IikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAoYXJnLCAieWVzIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24ucHR5PTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5wdHk9MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJUaGUgYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICd5ZXMnIG9yICdubyciOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHllc3xubyBhbGxvY2F0ZSBwc2V1ZG8gdGVybWluYWwgZm9yICdleGVjJyBvcHRpb24iLAorICAgICAgICAgICAgInB0eSIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIHJlZGlyZWN0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBhZGRybGlzdF9jbGVhcigmc2VjdGlvbi0+cmVkaXJlY3RfYWRkciwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAicmVkaXJlY3QiKSkKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNTTF9PUF9OT19USUNLRVQKKyAgICAgICAgLyogZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgaW50cm9kdWNlZCBpbiBPcGVuU1NMIDAuOS44ZiAqLworICAgICAgICAvKiBzZXNzaW9uIHRpY2tldHMgZG8gbm90IHN1cHBvcnQgU1NMX1NFU1NJT05fKl9leF9kYXRhKCkgKi8KKyAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfc2V0fD1TU0xfT1BfTk9fVElDS0VUOworI2VuZGlmCisgICAgICAgIG5hbWVfbGlzdF9hcHBlbmQoJnNlY3Rpb24tPnJlZGlyZWN0X2FkZHIubmFtZXMsIGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgaWYoc2VjdGlvbi0+cmVkaXJlY3RfYWRkci5uYW1lcykgeworICAgICAgICAgICAgaWYoIXNlY3Rpb24tPm9wdGlvbi5kZWxheWVkX2xvb2t1cCAmJgorICAgICAgICAgICAgICAgICAgICAhYWRkcmxpc3RfcmVzb2x2ZSgmc2VjdGlvbi0+cmVkaXJlY3RfYWRkcikpIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZXNvbHZlIHJlZGlyZWN0IHRhcmdldCAtIGRlbGF5aW5nIEROUyBsb29rdXAiKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5jb25uZWN0X2FkZHIubnVtPTA7CisgICAgICAgICAgICAgICAgc3RyX2ZyZWUoc2VjdGlvbi0+Y29ubmVjdF9hZGRyLm5hbWVzKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5jb25uZWN0X2FkZHIubmFtZXM9TlVMTDsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24uZGVsYXllZF9sb29rdXA9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHNlY3Rpb24tPnZlcmlmeV9sZXZlbDwxKQorICAgICAgICAgICAgICAgIHJldHVybiAiXCJ2ZXJpZnlcIiBuZWVkcyB0byBiZSAxIG9yIGhpZ2hlciBmb3IgXCJyZWRpcmVjdFwiIHRvIHdvcmsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsCisgICAgICAgICAgICAiJS0yMnMgPSBbaG9zdDpdcG9ydCB0byByZWRpcmVjdCBvbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlcyIsCisgICAgICAgICAgICAicmVkaXJlY3QiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogcmVuZWdvdGlhdGlvbiAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnJlbmVnb3RpYXRpb249MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJyZW5lZ290aWF0aW9uIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAoYXJnLCAieWVzIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24ucmVuZWdvdGlhdGlvbj0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24ucmVuZWdvdGlhdGlvbj0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzfG5vIHN1cHBvcnQgcmVuZWdvdGlhdGlvbiIsCisgICAgICAgICAgICAgICJyZW5lZ290aWF0aW9uIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHJlc2V0ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vcHRpb24ucmVzZXQ9MTsgLyogZW5hYmxlZCBieSBkZWZhdWx0ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAicmVzZXQiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5yZXNldD0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vIikpCisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24ucmVzZXQ9MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJUaGUgYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICd5ZXMnIG9yICdubyciOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHllc3xubyBzZW5kIFRDUCBSU1Qgb24gZXJyb3IiLAorICAgICAgICAgICAgInJldHJ5Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHJldHJ5ICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vcHRpb24ucmV0cnk9MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJyZXRyeSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgInllcyIpKQorICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnJldHJ5PTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAibm8iKSkKKyAgICAgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5yZXRyeT0wOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgJ3llcycgb3IgJ25vJyI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0geWVzfG5vIHJldHJ5IGNvbm5lY3QrZXhlYyBzZWN0aW9uIiwKKyAgICAgICAgICAgICJyZXRyeSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBzZXNzaW9uQ2FjaGVTaXplICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5zZXNzaW9uX3NpemU9MTAwMEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAic2Vzc2lvbkNhY2hlU2l6ZSIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPnNlc3Npb25fc2l6ZT1zdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIHNlc3Npb24gY2FjaGUgc2l6ZSI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gJWxkIiwgInNlc3Npb25DYWNoZVNpemUiLCAxMDAwTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHNlc3Npb24gY2FjaGUgc2l6ZSIsICJzZXNzaW9uQ2FjaGVTaXplIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHNlc3Npb25DYWNoZVRpbWVvdXQgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnNlc3Npb25fdGltZW91dD0zMDBMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInNlc3Npb25DYWNoZVRpbWVvdXQiKSAmJiBzdHJjYXNlY21wKG9wdCwgInNlc3Npb24iKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5zZXNzaW9uX3RpbWVvdXQ9c3RydG9sKGFyZywgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBzZXNzaW9uIGNhY2hlIHRpbWVvdXQiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVsZCBzZWNvbmRzIiwgInNlc3Npb25DYWNoZVRpbWVvdXQiLCAzMDBMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfSEVMUDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gc2Vzc2lvbiBjYWNoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSIsCisgICAgICAgICAgICAic2Vzc2lvbkNhY2hlVGltZW91dCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBzZXNzaW9uZCAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnNlc3Npb25kPTA7CisgICAgICAgIG1lbXNldCgmc2VjdGlvbi0+c2Vzc2lvbmRfYWRkciwgMCwgc2l6ZW9mKFNPQ0tBRERSX1VOSU9OKSk7CisgICAgICAgIHNlY3Rpb24tPnNlc3Npb25kX2FkZHIuaW4uc2luX2ZhbWlseT1BRl9JTkVUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInNlc3Npb25kIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnNlc3Npb25kPTE7CisjaWZkZWYgU1NMX09QX05PX1RJQ0tFVAorICAgICAgICAvKiBkaXNhYmxlIFJGQzQ1MDcgc3VwcG9ydCBpbnRyb2R1Y2VkIGluIE9wZW5TU0wgMC45LjhmICovCisgICAgICAgIC8qIHRoaXMgcHJldmVudHMgc2Vzc2lvbiBjYWxsYmFja3MgZnJvbSBiZWVpbmcgZXhlY3V0ZWQgKi8KKyAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfc2V0fD1TU0xfT1BfTk9fVElDS0VUOworI2VuZGlmCisgICAgICAgIGlmKCFuYW1lMmFkZHIoJnNlY3Rpb24tPnNlc3Npb25kX2FkZHIsIGFyZywgMCkpCisgICAgICAgICAgICByZXR1cm4gIkZhaWxlZCB0byByZXNvbHZlIHNlc3Npb25kIHNlcnZlciBhZGRyZXNzIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBbaG9zdDpdcG9ydCB1c2Ugc2Vzc2lvbmQgYXQgaG9zdDpwb3J0IiwKKyAgICAgICAgICAgICJzZXNzaW9uZCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKyAgICAvKiBzbmkgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnNlcnZlcm5hbWVfbGlzdF9oZWFkPU5VTEw7CisgICAgICAgIHNlY3Rpb24tPnNlcnZlcm5hbWVfbGlzdF90YWlsPU5VTEw7CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi5zbmk9MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzbmkiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT5zbmk9c3RyX2R1cChhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIHRtcF9zdHI9c25pX2luaXQoc2VjdGlvbik7CisgICAgICAgIGlmKHRtcF9zdHIpCisgICAgICAgICAgICByZXR1cm4gdG1wX3N0cjsKKyAgICAgICAgaWYoc2VjdGlvbi0+b3B0aW9uLnNuaSkKKyAgICAgICAgICAgICsrZW5kcG9pbnRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBtYXN0ZXJfc2VydmljZTpob3N0X25hbWUgZm9yIGFuIFNOSSB2aXJ0dWFsIHNlcnZpY2UiLAorICAgICAgICAgICAgInNuaSIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19UTFNFWFQpICovCisKKyAgICAvKiBzc2xWZXJzaW9uICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAxMDAwMDBMCisgICAgICAgIHNlY3Rpb24tPmNsaWVudF9tZXRob2Q9KFNTTF9NRVRIT0QgKilUTFNfY2xpZW50X21ldGhvZCgpOworICAgICAgICBzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kPShTU0xfTUVUSE9EICopVExTX3NlcnZlcl9tZXRob2QoKTsKKyNlbHNlCisgICAgICAgIHNlY3Rpb24tPmNsaWVudF9tZXRob2Q9KFNTTF9NRVRIT0QgKilTU0x2MjNfY2xpZW50X21ldGhvZCgpOworICAgICAgICBzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kPShTU0xfTUVUSE9EICopU1NMdjIzX3NlcnZlcl9tZXRob2QoKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgInNzbFZlcnNpb24iKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighc3RyY2FzZWNtcChhcmcsICJhbGwiKSkgeworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAxMDAwMDBMCisgICAgICAgICAgICBzZWN0aW9uLT5jbGllbnRfbWV0aG9kPShTU0xfTUVUSE9EICopVExTX2NsaWVudF9tZXRob2QoKTsKKyAgICAgICAgICAgIHNlY3Rpb24tPnNlcnZlcl9tZXRob2Q9KFNTTF9NRVRIT0QgKilUTFNfc2VydmVyX21ldGhvZCgpOworI2Vsc2UKKyAgICAgICAgICAgIHNlY3Rpb24tPmNsaWVudF9tZXRob2Q9KFNTTF9NRVRIT0QgKilTU0x2MjNfY2xpZW50X21ldGhvZCgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2VydmVyX21ldGhvZD0oU1NMX01FVEhPRCAqKVNTTHYyM19zZXJ2ZXJfbWV0aG9kKCk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIlNTTHYyIikpIHsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisgICAgICAgICAgICBzZWN0aW9uLT5jbGllbnRfbWV0aG9kPShTU0xfTUVUSE9EICopU1NMdjJfY2xpZW50X21ldGhvZCgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2VydmVyX21ldGhvZD0oU1NMX01FVEhPRCAqKVNTTHYyX3NlcnZlcl9tZXRob2QoKTsKKyNlbHNlIC8qIGRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAqLworICAgICAgICAgICAgcmV0dXJuICJTU0x2MiBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICovCisgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChhcmcsICJTU0x2MyIpKSB7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICAgICAgICAgICAgc2VjdGlvbi0+Y2xpZW50X21ldGhvZD0oU1NMX01FVEhPRCAqKVNTTHYzX2NsaWVudF9tZXRob2QoKTsKKyAgICAgICAgICAgIHNlY3Rpb24tPnNlcnZlcl9tZXRob2Q9KFNTTF9NRVRIT0QgKilTU0x2M19zZXJ2ZXJfbWV0aG9kKCk7CisjZWxzZSAvKiBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykgKi8KKyAgICAgICAgICAgIHJldHVybiAiU1NMdjMgbm90IHN1cHBvcnRlZCI7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19TU0wzKSAqLworICAgICAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAiVExTdjEiKSkgeworI2lmbmRlZiBPUEVOU1NMX05PX1RMUzEKKyAgICAgICAgICAgIHNlY3Rpb24tPmNsaWVudF9tZXRob2Q9KFNTTF9NRVRIT0QgKilUTFN2MV9jbGllbnRfbWV0aG9kKCk7CisgICAgICAgICAgICBzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kPShTU0xfTUVUSE9EICopVExTdjFfc2VydmVyX21ldGhvZCgpOworI2Vsc2UgLyogZGVmaW5lZChPUEVOU1NMX05PX1RMUzEpICovCisgICAgICAgICAgICByZXR1cm4gIlRMU3YxIG5vdCBzdXBwb3J0ZWQiOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTMSkgKi8KKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIlRMU3YxLjEiKSkgeworI2lmbmRlZiBPUEVOU1NMX05PX1RMUzFfMQorICAgICAgICAgICAgc2VjdGlvbi0+Y2xpZW50X21ldGhvZD0oU1NMX01FVEhPRCAqKVRMU3YxXzFfY2xpZW50X21ldGhvZCgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2VydmVyX21ldGhvZD0oU1NMX01FVEhPRCAqKVRMU3YxXzFfc2VydmVyX21ldGhvZCgpOworI2Vsc2UgLyogZGVmaW5lZChPUEVOU1NMX05PX1RMUzFfMSkgKi8KKyAgICAgICAgICAgIHJldHVybiAiVExTdjEuMSBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1RMUzFfMSkgKi8KKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjYXNlY21wKGFyZywgIlRMU3YxLjIiKSkgeworI2lmbmRlZiBPUEVOU1NMX05PX1RMUzFfMgorICAgICAgICAgICAgc2VjdGlvbi0+Y2xpZW50X21ldGhvZD0oU1NMX01FVEhPRCAqKVRMU3YxXzJfY2xpZW50X21ldGhvZCgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2VydmVyX21ldGhvZD0oU1NMX01FVEhPRCAqKVRMU3YxXzJfc2VydmVyX21ldGhvZCgpOworI2Vsc2UgLyogZGVmaW5lZChPUEVOU1NMX05PX1RMUzFfMikgKi8KKyAgICAgICAgICAgIHJldHVybiAiVExTdjEuMiBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1RMUzFfMikgKi8KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gIkluY29ycmVjdCB2ZXJzaW9uIG9mIFNTTCBwcm90b2NvbCI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyNpZmRlZiBVU0VfRklQUworICAgICAgICBpZihuZXdfZ2xvYmFsX29wdGlvbnMub3B0aW9uLmZpcHMpIHsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisgICAgICAgICAgICBpZihzZWN0aW9uLT5vcHRpb24uY2xpZW50ID8KKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi0+Y2xpZW50X21ldGhvZD09KFNTTF9NRVRIT0QgKilTU0x2Ml9jbGllbnRfbWV0aG9kKCkgOgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kPT0oU1NMX01FVEhPRCAqKVNTTHYyX3NlcnZlcl9tZXRob2QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwic3NsVmVyc2lvbiA9IFNTTHYyXCIgbm90IHN1cHBvcnRlZCBpbiBGSVBTIG1vZGUiOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisgICAgICAgICAgICBpZihzZWN0aW9uLT5vcHRpb24uY2xpZW50ID8KKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi0+Y2xpZW50X21ldGhvZD09KFNTTF9NRVRIT0QgKilTU0x2M19jbGllbnRfbWV0aG9kKCkgOgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLT5zZXJ2ZXJfbWV0aG9kPT0oU1NMX01FVEhPRCAqKVNTTHYzX3NlcnZlcl9tZXRob2QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwic3NsVmVyc2lvbiA9IFNTTHYzXCIgbm90IHN1cHBvcnRlZCBpbiBGSVBTIG1vZGUiOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9GSVBTICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IGFsbHxTU0x2MnxTU0x2M3xUTFN2MSIKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAxMDAwTAorICAgICAgICAgICAgInxUTFN2MS4xfFRMU3YxLjIiCisjZW5kaWYKKyAgICAgICAgICAgICIgU1NMIG1ldGhvZCIsICJzc2xWZXJzaW9uIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmbmRlZiBVU0VfRk9SSworICAgIC8qIHN0YWNrICovCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5zdGFja19zaXplPURFRkFVTFRfU1RBQ0tfU0laRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzdGFjayIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNlY3Rpb24tPnN0YWNrX3NpemU9KHNpemVfdClzdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIHRocmVhZCBzdGFjayBzaXplIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSAlZCBieXRlcyIsICJzdGFjayIsIERFRkFVTFRfU1RBQ0tfU0laRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHRocmVhZCBzdGFjayBzaXplIChpbiBieXRlcykiLCAic3RhY2siKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBUSU1FT1VUYnVzeSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+dGltZW91dF9idXN5PTMwMDsgLyogNSBtaW51dGVzICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiVElNRU9VVGJ1c3kiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT50aW1lb3V0X2J1c3k9KGludClzdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIGJ1c3kgdGltZW91dCI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gJWQgc2Vjb25kcyIsICJUSU1FT1VUYnVzeSIsIDMwMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHNlY29uZHMgdG8gd2FpdCBmb3IgZXhwZWN0ZWQgZGF0YSIsICJUSU1FT1VUYnVzeSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBUSU1FT1VUY2xvc2UgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnRpbWVvdXRfY2xvc2U9NjA7IC8qIDEgbWludXRlICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0VYRUM6CisgICAgICAgIGlmKHN0cmNhc2VjbXAob3B0LCAiVElNRU9VVGNsb3NlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+dGltZW91dF9jbG9zZT0oaW50KXN0cnRvbChhcmcsICZ0bXBfc3RyLCAxMCk7CisgICAgICAgIGlmKHRtcF9zdHI9PWFyZyB8fCAqdG1wX3N0cikgLyogbm90IGEgbnVtYmVyICovCisgICAgICAgICAgICByZXR1cm4gIklsbGVnYWwgY2xvc2UgdGltZW91dCI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRlJFRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiUtMjJzID0gJWQgc2Vjb25kcyIsICJUSU1FT1VUY2xvc2UiLCA2MCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHNlY29uZHMgdG8gd2FpdCBmb3IgY2xvc2Vfbm90aWZ5IiwKKyAgICAgICAgICAgICJUSU1FT1VUY2xvc2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVElNRU9VVGNvbm5lY3QgKi8KKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDTURfQkVHSU46CisgICAgICAgIHNlY3Rpb24tPnRpbWVvdXRfY29ubmVjdD0xMDsgLyogMTAgc2Vjb25kcyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIlRJTUVPVVRjb25uZWN0IikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+dGltZW91dF9jb25uZWN0PShpbnQpc3RydG9sKGFyZywgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBjb25uZWN0IHRpbWVvdXQiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVkIHNlY29uZHMiLCAiVElNRU9VVGNvbm5lY3QiLCAxMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHNlY29uZHMgdG8gY29ubmVjdCByZW1vdGUgaG9zdCIsICJUSU1FT1VUY29ubmVjdCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBUSU1FT1VUaWRsZSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+dGltZW91dF9pZGxlPTQzMjAwOyAvKiAxMiBob3VycyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9FWEVDOgorICAgICAgICBpZihzdHJjYXNlY21wKG9wdCwgIlRJTUVPVVRpZGxlIikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2VjdGlvbi0+dGltZW91dF9pZGxlPShpbnQpc3RydG9sKGFyZywgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBpZGxlIHRpbWVvdXQiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0RFRkFVTFQ6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9ICVkIHNlY29uZHMiLCAiVElNRU9VVGlkbGUiLCA0MzIwMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0hFTFA6CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICIlLTIycyA9IHNlY29uZHMgdG8ga2VlcCBhbiBpZGxlIGNvbm5lY3Rpb24iLCAiVElNRU9VVGlkbGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogdHJhbnNwYXJlbnQgKi8KKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ01EX0JFR0lOOgorICAgICAgICBzZWN0aW9uLT5vcHRpb24udHJhbnNwYXJlbnRfc3JjPTA7CisgICAgICAgIHNlY3Rpb24tPm9wdGlvbi50cmFuc3BhcmVudF9kc3Q9MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJ0cmFuc3BhcmVudCIpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKGFyZywgIm5vbmUiKSB8fCAhc3RyY2FzZWNtcChhcmcsICJubyIpKSB7CisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24udHJhbnNwYXJlbnRfc3JjPTA7CisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24udHJhbnNwYXJlbnRfZHN0PTA7CisgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChhcmcsICJzb3VyY2UiKSB8fCAhc3RyY2FzZWNtcChhcmcsICJ5ZXMiKSkgeworICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnRyYW5zcGFyZW50X3NyYz0xOworICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnRyYW5zcGFyZW50X2RzdD0wOworI2lmZGVmIFNPX09SSUdJTkFMX0RTVAorICAgICAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAiZGVzdGluYXRpb24iKSkgeworICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnRyYW5zcGFyZW50X3NyYz0wOworICAgICAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnRyYW5zcGFyZW50X2RzdD0xOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAoYXJnLCAiYm90aCIpKSB7CisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24udHJhbnNwYXJlbnRfc3JjPTE7CisgICAgICAgICAgICBzZWN0aW9uLT5vcHRpb24udHJhbnNwYXJlbnRfZHN0PTE7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gIlNlbGVjdGVkIHRyYW5zcGFyZW50IHByb3h5IG1vZGUgaXMgbm90IGF2YWlsYWJsZSI7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIGNhc2UgQ01EX0VORDoKKyAgICAgICAgaWYoc2VjdGlvbi0+b3B0aW9uLnRyYW5zcGFyZW50X2RzdCkKKyAgICAgICAgICAgICsrZW5kcG9pbnRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgIiUtMjJzID0gbm9uZXxzb3VyY2V8ZGVzdGluYXRpb258Ym90aCB0cmFuc3BhcmVudCBwcm94eSBtb2RlIiwKKyAgICAgICAgICAgICJ0cmFuc3BhcmVudCIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIHZlcmlmeSAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgc2VjdGlvbi0+dmVyaWZ5X2xldmVsPS0xOyAvKiBkbyBub3QgZXZlbiByZXF1ZXN0IGEgY2VydGlmaWNhdGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJ2ZXJpZnkiKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzZWN0aW9uLT52ZXJpZnlfbGV2ZWw9KGludClzdHJ0b2woYXJnLCAmdG1wX3N0ciwgMTApOworICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgcmV0dXJuICJCYWQgdmVyaWZ5IGxldmVsIjsKKyAgICAgICAgaWYoc2VjdGlvbi0+dmVyaWZ5X2xldmVsPDAgfHwgc2VjdGlvbi0+dmVyaWZ5X2xldmVsPjQpCisgICAgICAgICAgICByZXR1cm4gIkJhZCB2ZXJpZnkgbGV2ZWwiOworICAgICAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KKyAgICBjYXNlIENNRF9FTkQ6CisgICAgICAgIGlmKHNlY3Rpb24tPnZlcmlmeV9sZXZlbD4wICYmICFzZWN0aW9uLT5jYV9maWxlICYmICFzZWN0aW9uLT5jYV9kaXIpCisgICAgICAgICAgICByZXR1cm4gIkVpdGhlciBcIkNBZmlsZVwiIG9yIFwiQ0FwYXRoXCIgaGFzIHRvIGJlIGNvbmZpZ3VyZWQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9GUkVFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9ERUZBVUxUOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiJS0yMnMgPSBub25lIiwgInZlcmlmeSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgIiUtMjJzID0gbGV2ZWwgb2YgcGVlciBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24iLCAidmVyaWZ5Iik7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsCisgICAgICAgICAgICAiJTI1c2xldmVsIDAgLSByZXF1ZXN0IGFuZCBpZ25vcmUgcGVlciBjZXJ0IiwgIiIpOworICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgIiUyNXNsZXZlbCAxIC0gb25seSB2YWxpZGF0ZSBwZWVyIGNlcnQgaWYgcHJlc2VudCIsICIiKTsKKyAgICAgICAgc19sb2coTE9HX05PVElDRSwKKyAgICAgICAgICAgICIlMjVzbGV2ZWwgMiAtIGFsd2F5cyByZXF1aXJlIGEgdmFsaWQgcGVlciBjZXJ0IiwgIiIpOworICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgIiUyNXNsZXZlbCAzIC0gdmVyaWZ5IHBlZXIgd2l0aCBsb2NhbGx5IGluc3RhbGxlZCBjZXJ0IiwgIiIpOworICAgICAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAgICAgIiUyNXNsZXZlbCA0IC0gaWdub3JlIENBIGNoYWluIGFuZCBvbmx5IHZlcmlmeSBwZWVyIGNlcnQiLCAiIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGZpbmFsIGNoZWNrcyAqLworICAgIHN3aXRjaChjbWQpIHsKKyAgICBjYXNlIENNRF9CRUdJTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfRVhFQzoKKyAgICAgICAgcmV0dXJuIG9wdGlvbl9ub3RfZm91bmQ7CisgICAgY2FzZSBDTURfRU5EOgorICAgICAgICBpZihuZXdfc2VydmljZV9vcHRpb25zLm5leHQpIHsgLyogZGFlbW9uIG1vZGUgY2hlY2tzICovCisgICAgICAgICAgICBpZihlbmRwb2ludHMhPTIpCisgICAgICAgICAgICAgICAgcmV0dXJuICJFYWNoIHNlcnZpY2UgbXVzdCBkZWZpbmUgdHdvIGVuZHBvaW50cyI7CisgICAgICAgIH0gZWxzZSB7IC8qIGluZXRkIG1vZGUgY2hlY2tzICovCisgICAgICAgICAgICBpZihzZWN0aW9uLT5vcHRpb24uYWNjZXB0KQorICAgICAgICAgICAgICAgIHJldHVybiAiJ2FjY2VwdCcgb3B0aW9uIGlzIG9ubHkgYWxsb3dlZCBpbiBhIFtzZWN0aW9uXSI7CisgICAgICAgICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZvciBzZWN0aW9uLT5vcHRpb24uc25pIGluIGluZXRkIG1vZGUsCisgICAgICAgICAgICAgICBhcyBpdCByZXF1aXJlcyB2YWxpZCBzZWN0aW9ucyB0byBiZSBzZXQgKi8KKyAgICAgICAgICAgIGlmKGVuZHBvaW50cyE9MSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIkluZXRkIG1vZGUgbXVzdCBkZWZpbmUgb25lIGVuZHBvaW50IjsKKyAgICAgICAgfQorICAgICAgICBpZihjb250ZXh0X2luaXQoc2VjdGlvbikpIC8qIGluaXRpYWxpemUgU1NMIGNvbnRleHQgKi8KKyAgICAgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIGluaXRpYWxpemUgU1NMIGNvbnRleHQiOworICAgIGNhc2UgQ01EX0ZSRUU6CisgICAgY2FzZSBDTURfREVGQVVMVDoKKyAgICBjYXNlIENNRF9IRUxQOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsgLyogT0sgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGUgYW5kIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCitOT0VYUE9SVCBjaGFyICpzbmlfaW5pdChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsKKyAgICBjaGFyICp0bXBfc3RyOworICAgIFNFUlZJQ0VfT1BUSU9OUyAqdG1wc3J2OworCisgICAgLyogc2VydmVyIG1vZGU6IHVwZGF0ZSBzZXJ2ZXJuYW1lX2xpc3QgYmFzZWQgb24gdGhlIFNOSSBvcHRpb24gKi8KKyAgICBpZighc2VjdGlvbi0+b3B0aW9uLmNsaWVudCAmJiBzZWN0aW9uLT5zbmkpIHsKKyAgICAgICAgdG1wX3N0cj1zdHJjaHIoc2VjdGlvbi0+c25pLCAnOicpOworICAgICAgICBpZighdG1wX3N0cikKKyAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBTTkkgcGFyYW1ldGVyIGZvcm1hdCI7CisgICAgICAgICp0bXBfc3RyKys9J1wwJzsKKyAgICAgICAgZm9yKHRtcHNydj1uZXdfc2VydmljZV9vcHRpb25zLm5leHQ7IHRtcHNydjsgdG1wc3J2PXRtcHNydi0+bmV4dCkKKyAgICAgICAgICAgIGlmKCFzdHJjbXAodG1wc3J2LT5zZXJ2bmFtZSwgc2VjdGlvbi0+c25pKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIXRtcHNydikKKyAgICAgICAgICAgIHJldHVybiAiU05JIHNlY3Rpb24gbmFtZSBub3QgZm91bmQiOworICAgICAgICBpZih0bXBzcnYtPm9wdGlvbi5jbGllbnQpCisgICAgICAgICAgICByZXR1cm4gIlNOSSBtYXN0ZXIgc2VydmljZSBpcyBhIFRMUyBjbGllbnQiOworICAgICAgICBpZih0bXBzcnYtPnNlcnZlcm5hbWVfbGlzdF90YWlsKSB7CisgICAgICAgICAgICB0bXBzcnYtPnNlcnZlcm5hbWVfbGlzdF90YWlsLT5uZXh0PXN0cl9hbGxvYyhzaXplb2YoU0VSVkVSTkFNRV9MSVNUKSk7CisgICAgICAgICAgICB0bXBzcnYtPnNlcnZlcm5hbWVfbGlzdF90YWlsPXRtcHNydi0+c2VydmVybmFtZV9saXN0X3RhaWwtPm5leHQ7CisgICAgICAgIH0gZWxzZSB7IC8qIGZpcnN0IHZpcnR1YWwgc2VydmljZSAqLworICAgICAgICAgICAgdG1wc3J2LT5zZXJ2ZXJuYW1lX2xpc3RfaGVhZD0KKyAgICAgICAgICAgICAgICB0bXBzcnYtPnNlcnZlcm5hbWVfbGlzdF90YWlsPQorICAgICAgICAgICAgICAgIHN0cl9hbGxvYyhzaXplb2YoU0VSVkVSTkFNRV9MSVNUKSk7CisgICAgICAgICAgICB0bXBzcnYtPnNzbF9vcHRpb25zX3NldHw9CisgICAgICAgICAgICAgICAgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OOworICAgICAgICB9CisgICAgICAgIHRtcHNydi0+c2VydmVybmFtZV9saXN0X3RhaWwtPnNlcnZlcm5hbWU9c3RyX2R1cCh0bXBfc3RyKTsKKyAgICAgICAgdG1wc3J2LT5zZXJ2ZXJuYW1lX2xpc3RfdGFpbC0+b3B0PXNlY3Rpb247CisgICAgICAgIHRtcHNydi0+c2VydmVybmFtZV9saXN0X3RhaWwtPm5leHQ9TlVMTDsKKyAgICAgICAgc2VjdGlvbi0+b3B0aW9uLnNuaT0xOworICAgICAgICAvKiBhbHdheXMgbmVnb3RpYXRlIGEgbmV3IHNlc3Npb24gb24gcmVuZWdvdGlhdGlvbiwgYXMgdGhlIFNTTAorICAgICAgICAgKiBjb250ZXh0IHNldHRpbmdzIChpbmNsdWRpbmcgYWNjZXNzIGNvbnRyb2wpIG1heSBiZSBkaWZmZXJlbnQgKi8KKyAgICAgICAgc2VjdGlvbi0+c3NsX29wdGlvbnNfc2V0fD0KKyAgICAgICAgICAgIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTjsKKyAgICB9CisKKyAgICAvKiBjbGllbnQgbW9kZTogc2V0dXAgU05JIGRlZmF1bHQgYmFzZWQgb24gJ3Byb3RvY29sSG9zdCcgYW5kICdjb25uZWN0JyBvcHRpb25zICovCisgICAgaWYoc2VjdGlvbi0+b3B0aW9uLmNsaWVudCAmJiAhc2VjdGlvbi0+c25pKSB7CisgICAgICAgIC8qIHNldHVwIGhvc3RfbmFtZSBmb3IgU05JLCBwcmVmZXIgU05JIGFuZCBwcm90b2NvbEhvc3QgaWYgc3BlY2lmaWVkICovCisgICAgICAgIGlmKHNlY3Rpb24tPnByb3RvY29sX2hvc3QpIC8qICdwcm90b2NvbEhvc3QnIG9wdGlvbiAqLworICAgICAgICAgICAgc2VjdGlvbi0+c25pPXN0cl9kdXAoc2VjdGlvbi0+cHJvdG9jb2xfaG9zdCk7CisgICAgICAgIGVsc2UgaWYoc2VjdGlvbi0+Y29ubmVjdF9hZGRyLm5hbWVzKSAvKiAnY29ubmVjdCcgb3B0aW9uICovCisgICAgICAgICAgICBzZWN0aW9uLT5zbmk9c3RyX2R1cChzZWN0aW9uLT5jb25uZWN0X2FkZHIubmFtZXMtPm5hbWUpOyAvKiBmaXJzdCBob3N0bmFtZSAqLworICAgICAgICBpZihzZWN0aW9uLT5zbmkpIHsgLyogZWl0aGVyICdwcm90b2NvbEhvc3QnIG9yICdjb25uZWN0JyBzcGVjaWZpZWQgKi8KKyAgICAgICAgICAgIHRtcF9zdHI9c3RycmNocihzZWN0aW9uLT5zbmksICc6Jyk7CisgICAgICAgICAgICBpZih0bXBfc3RyKSB7IC8qICdob3N0OnBvcnQnIC0+IGRyb3AgJzpwb3J0JyAqLworICAgICAgICAgICAgICAgICp0bXBfc3RyPSdcMCc7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiAncG9ydCcgLT4gZGVmYXVsdCB0byAnbG9jYWxob3N0JyAqLworICAgICAgICAgICAgICAgIHN0cl9mcmVlKHNlY3Rpb24tPnNuaSk7CisgICAgICAgICAgICAgICAgc2VjdGlvbi0+c25pPXN0cl9kdXAoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBmYWNpbGl0eS9kZWJ1ZyBsZXZlbCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7Cit9IGZhY2lsaXR5bGV2ZWw7CisKK05PRVhQT1JUIGNoYXIgKnBhcnNlX2RlYnVnX2xldmVsKGNoYXIgKmFyZywgU0VSVklDRV9PUFRJT05TICpzZWN0aW9uKSB7CisgICAgY2hhciAqYXJnX2NvcHk7CisgICAgY2hhciAqc3RyaW5nOworICAgIGZhY2lsaXR5bGV2ZWwgKmZsOworCisvKiBmYWNpbGl0aWVzIG9ubHkgbWFrZSBzZW5zZSBvbiB1bml4ICovCisjaWYgIWRlZmluZWQgKFVTRV9XSU4zMikgJiYgIWRlZmluZWQgKF9fdm1zKQorICAgIGZhY2lsaXR5bGV2ZWwgZmFjaWxpdGllc1tdID0geworICAgICAgICB7ImF1dGgiLCBMT0dfQVVUSH0sICAgICB7ImNyb24iLCBMT0dfQ1JPTn0sICAgICB7ImRhZW1vbiIsIExPR19EQUVNT059LAorICAgICAgICB7Imtlcm4iLCBMT0dfS0VSTn0sICAgICB7ImxwciIsIExPR19MUFJ9LCAgICAgICB7Im1haWwiLCBMT0dfTUFJTH0sCisgICAgICAgIHsibmV3cyIsIExPR19ORVdTfSwgICAgIHsic3lzbG9nIiwgTE9HX1NZU0xPR30sIHsidXNlciIsIExPR19VU0VSfSwKKyAgICAgICAgeyJ1dWNwIiwgTE9HX1VVQ1B9LCAgICAgeyJsb2NhbDAiLCBMT0dfTE9DQUwwfSwgeyJsb2NhbDEiLCBMT0dfTE9DQUwxfSwKKyAgICAgICAgeyJsb2NhbDIiLCBMT0dfTE9DQUwyfSwgeyJsb2NhbDMiLCBMT0dfTE9DQUwzfSwgeyJsb2NhbDQiLCBMT0dfTE9DQUw0fSwKKyAgICAgICAgeyJsb2NhbDUiLCBMT0dfTE9DQUw1fSwgeyJsb2NhbDYiLCBMT0dfTE9DQUw2fSwgeyJsb2NhbDciLCBMT0dfTE9DQUw3fSwKKworICAgICAgICAvKiBzb21lIGZhY2lsaXRpZXMgYXJlIG5vdCBkZWZpbmVkIG9uIGFsbCBVbmljZXMgKi8KKyNpZmRlZiBMT0dfQVVUSFBSSVYKKyAgICAgICAgeyJhdXRocHJpdiIsIExPR19BVVRIUFJJVn0sCisjZW5kaWYKKyNpZmRlZiBMT0dfRlRQCisgICAgICAgIHsiZnRwIiwgTE9HX0ZUUH0sCisjZW5kaWYKKyNpZmRlZiBMT0dfTlRQCisgICAgICAgIHsibnRwIiwgTE9HX05UUH0sCisjZW5kaWYKKyAgICAgICAge05VTEwsIDB9CisgICAgfTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIsIF9fdm1zICovCisKKyAgICBmYWNpbGl0eWxldmVsIGxldmVsc1tdID0geworICAgICAgICB7ImVtZXJnIiwgTE9HX0VNRVJHfSwgICAgIHsiYWxlcnQiLCBMT0dfQUxFUlR9LAorICAgICAgICB7ImNyaXQiLCBMT0dfQ1JJVH0sICAgICAgIHsiZXJyIiwgTE9HX0VSUn0sCisgICAgICAgIHsid2FybmluZyIsIExPR19XQVJOSU5HfSwgeyJub3RpY2UiLCBMT0dfTk9USUNFfSwKKyAgICAgICAgeyJpbmZvIiwgTE9HX0lORk99LCAgICAgICB7ImRlYnVnIiwgTE9HX0RFQlVHfSwKKyAgICAgICAge05VTEwsIC0xfQorICAgIH07CisKKyAgICBhcmdfY29weT1zdHJfZHVwKGFyZyk7CisgICAgc3RyaW5nPWFyZ19jb3B5OworCisvKiBmYWNpbGl0aWVzIG9ubHkgbWFrZSBzZW5zZSBvbiBVbml4ICovCisjaWYgIWRlZmluZWQgKFVTRV9XSU4zMikgJiYgIWRlZmluZWQgKF9fdm1zKQorICAgIGlmKHNlY3Rpb249PSZuZXdfc2VydmljZV9vcHRpb25zICYmIHN0cmNocihzdHJpbmcsICcuJykpIHsKKyAgICAgICAgLyogYSBmYWNpbGl0eSB3YXMgc3BlY2lmaWVkIGluIHRoZSBnbG9iYWwgb3B0aW9ucyAqLworICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMubG9nX2ZhY2lsaXR5PS0xOworICAgICAgICBzdHJpbmc9c3RydG9rKGFyZ19jb3B5LCAiLiIpOyAvKiBicmVhayBpdCB1cCAqLworCisgICAgICAgIGZvcihmbD1mYWNpbGl0aWVzOyBmbC0+bmFtZTsgKytmbCkgeworICAgICAgICAgICAgaWYoIXN0cmNhc2VjbXAoZmwtPm5hbWUsIHN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMubG9nX2ZhY2lsaXR5PWZsLT52YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihuZXdfZ2xvYmFsX29wdGlvbnMubG9nX2ZhY2lsaXR5PT0tMSkKKyAgICAgICAgICAgIHJldHVybiAiSWxsZWdhbCBzeXNsb2cgZmFjaWxpdHkiOworICAgICAgICBzdHJpbmc9c3RydG9rKE5VTEwsICIuIik7ICAgIC8qIHNldCB0byB0aGUgcmVtYWluZGVyICovCisgICAgfQorI2VuZGlmIC8qIFVTRV9XSU4zMiwgX192bXMgKi8KKworICAgIC8qIHRpbWUgdG8gY2hlY2sgdGhlIHN5c2xvZyBsZXZlbCAqLworICAgIGlmKHN0cmluZyAmJiBzdHJsZW4oc3RyaW5nKT09MSAmJiAqc3RyaW5nPj0nMCcgJiYgKnN0cmluZzw9JzcnKSB7CisgICAgICAgIHNlY3Rpb24tPmxvZ19sZXZlbD0qc3RyaW5nLScwJzsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCisgICAgfQorICAgIHNlY3Rpb24tPmxvZ19sZXZlbD04OyAgICAvKiBpbGxlZ2FsIGxldmVsICovCisgICAgZm9yKGZsPWxldmVsczsgZmwtPm5hbWU7ICsrZmwpIHsKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAoZmwtPm5hbWUsIHN0cmluZykpIHsKKyAgICAgICAgICAgIHNlY3Rpb24tPmxvZ19sZXZlbD1mbC0+dmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihzZWN0aW9uLT5sb2dfbGV2ZWw9PTgpCisgICAgICAgIHJldHVybiAiSWxsZWdhbCBkZWJ1ZyBsZXZlbCI7IC8qIEZBSUxFRCAqLworICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTU0wgb3B0aW9ucyAqLworCitOT0VYUE9SVCBsb25nIHBhcnNlX3NzbF9vcHRpb24oY2hhciAqYXJnKSB7CisgICAgU1NMX09QVElPTiAqb3B0aW9uOworCisgICAgZm9yKG9wdGlvbj0oU1NMX09QVElPTiAqKXNzbF9vcHRzOyBvcHRpb24tPm5hbWU7ICsrb3B0aW9uKQorICAgICAgICBpZighc3RyY2FzZWNtcChvcHRpb24tPm5hbWUsIGFyZykpCisgICAgICAgICAgICByZXR1cm4gb3B0aW9uLT52YWx1ZTsKKyAgICByZXR1cm4gMDsgLyogRkFJTEVEICovCit9CisKK05PRVhQT1JUIHZvaWQgcHJpbnRfc3NsX29wdGlvbnModm9pZCkgeworICAgIFNTTF9PUFRJT04gKm9wdGlvbjsKKworICAgIHNfbG9nKExPR19OT1RJQ0UsICIgIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIlN1cHBvcnRlZCBTU0wgb3B0aW9uczoiKTsKKyAgICBmb3Iob3B0aW9uPShTU0xfT1BUSU9OICopc3NsX29wdHM7IG9wdGlvbi0+bmFtZTsgKytvcHRpb24pCisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJvcHRpb25zID0gJXMiLCBvcHRpb24tPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiByZWFkIFBTSyBmaWxlICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKworTk9FWFBPUlQgUFNLX0tFWVMgKnBza19yZWFkKGNoYXIgKmtleV9maWxlKSB7CisgICAgRElTS19GSUxFICpkZjsKKyAgICBjaGFyIGxpbmVbQ09ORkxJTkVMRU5dLCAqa2V5X3ZhbDsKKyAgICBzaXplX3Qga2V5X2xlbjsKKyAgICBQU0tfS0VZUyAqaGVhZD1OVUxMLCAqdGFpbD1OVUxMLCAqY3VycjsKKyAgICBpbnQgbGluZV9udW1iZXI9MDsKKworICAgIGlmKGZpbGVfcGVybWlzc2lvbnMoa2V5X2ZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZj1maWxlX29wZW4oa2V5X2ZpbGUsIEZJTEVfTU9ERV9SRUFEKTsKKyAgICBpZighZGYpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkNhbm5vdCBvcGVuIFBTS3NlY3JldHMgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUoZmlsZV9nZXRsaW5lKGRmLCBsaW5lLCBDT05GTElORUxFTik+PTApIHsKKyAgICAgICAgKytsaW5lX251bWJlcjsKKyAgICAgICAgaWYoIWxpbmVbMF0pIC8qIGVtcHR5IGxpbmUgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBrZXlfdmFsPXN0cmNocihsaW5lLCAnOicpOworICAgICAgICBpZigha2V5X3ZhbCkgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAiUFNLc2VjcmV0cyBsaW5lICVkOiBOb3QgaW4gaWRlbnRpdHk6a2V5IGZvcm1hdCIsCisgICAgICAgICAgICAgICAgbGluZV9udW1iZXIpOworICAgICAgICAgICAgZmlsZV9jbG9zZShkZik7CisgICAgICAgICAgICBwc2tfZnJlZShoZWFkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICprZXlfdmFsKys9J1wwJzsKKyAgICAgICAga2V5X2xlbj1zdHJsZW4oa2V5X3ZhbCk7CisgICAgICAgIGlmKHN0cmxlbihsaW5lKSsxPlBTS19NQVhfSURFTlRJVFlfTEVOKSB7IC8qIHdpdGggdGhlIHRyYWlsaW5nICdcMCcgKi8KKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsCisgICAgICAgICAgICAgICAgIlBTS3NlY3JldHMgbGluZSAlZDogSWRlbnRpdHkgbG9uZ2VyIHRoYW4gJWQgY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsIFBTS19NQVhfSURFTlRJVFlfTEVOKTsKKyAgICAgICAgICAgIGZpbGVfY2xvc2UoZGYpOworICAgICAgICAgICAgcHNrX2ZyZWUoaGVhZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZihrZXlfbGVuPlBTS19NQVhfUFNLX0xFTikgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAiUFNLc2VjcmV0cyBsaW5lICVkOiBLZXkgbG9uZ2VyIHRoYW4gJWQgY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsIFBTS19NQVhfUFNLX0xFTik7CisgICAgICAgICAgICBmaWxlX2Nsb3NlKGRmKTsKKyAgICAgICAgICAgIHBza19mcmVlKGhlYWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYoa2V5X2xlbjwyMCkgeworICAgICAgICAgICAgLyogc2hvcnRlciBrZXlzIGFyZSB1bmxpa2VseSB0byBoYXZlIHN1ZmZpY2llbnQgZW50cm9weSAqLworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAiUFNLc2VjcmV0cyBsaW5lICVkOiBLZXkgc2hvcnRlciB0aGFuIDIwIGNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyKTsKKyAgICAgICAgICAgIGZpbGVfY2xvc2UoZGYpOworICAgICAgICAgICAgcHNrX2ZyZWUoaGVhZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjdXJyPXN0cl9hbGxvYyhzaXplb2YoUFNLX0tFWVMpKTsKKyAgICAgICAgY3Vyci0+aWRlbnRpdHk9c3RyX2R1cChsaW5lKTsKKyAgICAgICAgY3Vyci0+a2V5X3ZhbD0odW5zaWduZWQgY2hhciAqKXN0cl9kdXAoa2V5X3ZhbCk7CisgICAgICAgIGN1cnItPmtleV9sZW49a2V5X2xlbjsKKyAgICAgICAgY3Vyci0+bmV4dD1OVUxMOworICAgICAgICBpZihoZWFkKQorICAgICAgICAgICAgdGFpbC0+bmV4dD1jdXJyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkPWN1cnI7CisgICAgICAgIHRhaWw9Y3VycjsKKyAgICB9CisgICAgZmlsZV9jbG9zZShkZik7CisgICAgcmV0dXJuIGhlYWQ7Cit9CisKK05PRVhQT1JUIHZvaWQgcHNrX2ZyZWUoUFNLX0tFWVMgKmhlYWQpIHsKKyAgICBQU0tfS0VZUyAqbmV4dDsKKworICAgIHdoaWxlKGhlYWQpIHsKKyAgICAgICAgbmV4dD1oZWFkLT5uZXh0OworICAgICAgICBzdHJfZnJlZShoZWFkLT5pZGVudGl0eSk7CisgICAgICAgIHN0cl9mcmVlKGhlYWQtPmtleV92YWwpOworICAgICAgICBzdHJfZnJlZShoZWFkKTsKKyAgICAgICAgaGVhZD1uZXh0OworICAgIH0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHNvY2tldCBvcHRpb25zICovCisKK3N0YXRpYyBpbnQgb249MTsKKyNkZWZpbmUgREVGX09OICgodm9pZCAqKSZvbikKKworU09DS19PUFQgc29ja19vcHRzW10gPSB7CisgICAgeyJTT19ERUJVRyIsICAgICAgICBTT0xfU09DS0VULCAgU09fREVCVUcsICAgICAgICBUWVBFX0ZMQUcsICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19ET05UUk9VVEUiLCAgICBTT0xfU09DS0VULCAgU09fRE9OVFJPVVRFLCAgICBUWVBFX0ZMQUcsICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19LRUVQQUxJVkUiLCAgICBTT0xfU09DS0VULCAgU09fS0VFUEFMSVZFLCAgICBUWVBFX0ZMQUcsICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19MSU5HRVIiLCAgICAgICBTT0xfU09DS0VULCAgU09fTElOR0VSLCAgICAgICBUWVBFX0xJTkdFUiwgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19PT0JJTkxJTkUiLCAgICBTT0xfU09DS0VULCAgU09fT09CSU5MSU5FLCAgICBUWVBFX0ZMQUcsICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19SQ1ZCVUYiLCAgICAgICBTT0xfU09DS0VULCAgU09fUkNWQlVGLCAgICAgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisgICAgeyJTT19TTkRCVUYiLCAgICAgICBTT0xfU09DS0VULCAgU09fU05EQlVGLCAgICAgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjaWZkZWYgU09fUkNWTE9XQVQKKyAgICB7IlNPX1JDVkxPV0FUIiwgICAgIFNPTF9TT0NLRVQsICBTT19SQ1ZMT1dBVCwgICAgIFRZUEVfSU5ULCAgICAge05VTEwsIE5VTEwsIE5VTEx9fSwKKyNlbmRpZgorI2lmZGVmIFNPX1NORExPV0FUCisgICAgeyJTT19TTkRMT1dBVCIsICAgICBTT0xfU09DS0VULCAgU09fU05ETE9XQVQsICAgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjZW5kaWYKKyNpZmRlZiBTT19SQ1ZUSU1FTworICAgIHsiU09fUkNWVElNRU8iLCAgICAgU09MX1NPQ0tFVCwgIFNPX1JDVlRJTUVPLCAgICAgVFlQRV9USU1FVkFMLCB7TlVMTCwgTlVMTCwgTlVMTH19LAorI2VuZGlmCisjaWZkZWYgU09fU05EVElNRU8KKyAgICB7IlNPX1NORFRJTUVPIiwgICAgIFNPTF9TT0NLRVQsICBTT19TTkRUSU1FTywgICAgIFRZUEVfVElNRVZBTCwge05VTEwsIE5VTEwsIE5VTEx9fSwKKyNlbmRpZgorICAgIHsiU09fUkVVU0VBRERSIiwgICAgU09MX1NPQ0tFVCwgIFNPX1JFVVNFQUREUiwgICAgVFlQRV9GTEFHLCAgICB7REVGX09OLCBOVUxMLCBOVUxMfX0sCisjaWZkZWYgU09fQklORFRPREVWSUNFCisgICAgeyJTT19CSU5EVE9ERVZJQ0UiLCBTT0xfU09DS0VULCAgU09fQklORFRPREVWSUNFLCBUWVBFX1NUUklORywgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjZW5kaWYKKyNpZmRlZiBUQ1BfS0VFUENOVAorICAgIHsiVENQX0tFRVBDTlQiLCAgICAgU09MX1RDUCwgICAgIFRDUF9LRUVQQ05ULCAgICAgVFlQRV9JTlQsICAgICB7TlVMTCwgTlVMTCwgTlVMTH19LAorI2VuZGlmCisjaWZkZWYgVENQX0tFRVBJRExFCisgICAgeyJUQ1BfS0VFUElETEUiLCAgICBTT0xfVENQLCAgICAgVENQX0tFRVBJRExFLCAgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjZW5kaWYKKyNpZmRlZiBUQ1BfS0VFUElOVFZMCisgICAgeyJUQ1BfS0VFUElOVFZMIiwgICBTT0xfVENQLCAgICAgVENQX0tFRVBJTlRWTCwgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjZW5kaWYKKyNpZmRlZiBJUF9UT1MKKyAgICB7IklQX1RPUyIsICAgICAgICAgIElQUFJPVE9fSVAsICBJUF9UT1MsICAgICAgICAgIFRZUEVfSU5ULCAgICAge05VTEwsIE5VTEwsIE5VTEx9fSwKKyNlbmRpZgorI2lmZGVmIElQX1RUTAorICAgIHsiSVBfVFRMIiwgICAgICAgICAgSVBQUk9UT19JUCwgIElQX1RUTCwgICAgICAgICAgVFlQRV9JTlQsICAgICB7TlVMTCwgTlVMTCwgTlVMTH19LAorI2VuZGlmCisjaWZkZWYgSVBfTUFYU0VHCisgICAgeyJUQ1BfTUFYU0VHIiwgICAgICBJUFBST1RPX1RDUCwgVENQX01BWFNFRywgICAgICBUWVBFX0lOVCwgICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0sCisjZW5kaWYKKyAgICB7IlRDUF9OT0RFTEFZIiwgICAgIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgICAgIFRZUEVfRkxBRywgICAge05VTEwsIERFRl9PTiwgREVGX09OfX0sCisjaWZkZWYgSVBfRlJFRUJJTkQKKyAgICB7IklQX0ZSRUVCSU5EIiwgICAgIElQUFJPVE9fSVAsICBJUF9GUkVFQklORCwgICAgIFRZUEVfRkxBRywgICAge05VTEwsIE5VTEwsIE5VTEx9fSwKKyNlbmRpZgorI2lmZGVmIElQX0JJTkRBTlkKKyAgICB7IklQX0JJTkRBTlkiLCAgICAgIElQUFJPVE9fSVAsICBJUF9CSU5EQU5ZLCAgICAgIFRZUEVfRkxBRywgICAge05VTEwsIE5VTEwsIE5VTEx9fSwKKyNlbmRpZgorI2lmZGVmIElQVjZfQklOREFOWQorICAgIHsiSVBWNl9CSU5EQU5ZIiwgICAgSVBQUk9UT19JUFY2LElQVjZfQklOREFOWSwgICAgVFlQRV9GTEFHLCAgICB7TlVMTCwgTlVMTCwgTlVMTH19LAorI2VuZGlmCisgICAge05VTEwsICAgICAgICAgICAgICAwLCAgICAgICAgICAgMCwgICAgICAgICAgICAgICBUWVBFX05PTkUsICAgIHtOVUxMLCBOVUxMLCBOVUxMfX0KK307CisKK05PRVhQT1JUIGludCBwcmludF9zb2NrZXRfb3B0aW9ucyh2b2lkKSB7CisgICAgU09DS0VUIGZkOworICAgIHNvY2tsZW5fdCBvcHRsZW47CisgICAgU09DS19PUFQgKnB0cjsKKyAgICBPUFRfVU5JT04gdmFsOworICAgIGNoYXIgKnRhLCAqdGwsICp0ciwgKnRkOworCisgICAgZmQ9c29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKworICAgIHNfbG9nKExPR19OT1RJQ0UsICIgIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIlNvY2tldCBvcHRpb24gZGVmYXVsdHM6Iik7CisgICAgc19sb2coTE9HX05PVElDRSwKKyAgICAgICAgIiAgICBPcHRpb24gTmFtZSAgICAgfCAgQWNjZXB0ICB8ICAgTG9jYWwgIHwgIFJlbW90ZSAgfE9TIGRlZmF1bHQiKTsKKyAgICBzX2xvZyhMT0dfTk9USUNFLAorICAgICAgICAiICAgIC0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSIpOworICAgIGZvcihwdHI9c29ja19vcHRzOyBwdHItPm9wdF9zdHI7ICsrcHRyKSB7CisgICAgICAgIC8qIGdldCBPUyBkZWZhdWx0IHZhbHVlICovCisgICAgICAgIG9wdGxlbj1zaXplb2YgdmFsOworICAgICAgICBpZihnZXRzb2Nrb3B0KGZkLCBwdHItPm9wdF9sZXZlbCwKKyAgICAgICAgICAgICAgICBwdHItPm9wdF9uYW1lLCAodm9pZCAqKSZ2YWwsICZvcHRsZW4pKSB7CisgICAgICAgICAgICBpZihnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSE9U19FTk9QUk9UT09QVCkgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJGYWlsZWQgdG8gZ2V0ICVzIE9TIGRlZmF1bHQiLCBwdHItPm9wdF9zdHIpOworICAgICAgICAgICAgICAgIHNvY2tlcnJvcigiZ2V0c29ja29wdCIpOworICAgICAgICAgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZD1zdHJfZHVwKCJ3cml0ZS1vbmx5Iik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGQ9cHJpbnRfb3B0aW9uKHB0ci0+b3B0X3R5cGUsICZ2YWwpOworICAgICAgICAvKiBnZXQgc3R1bm5lbCBkZWZhdWx0IHZhbHVlcyAqLworICAgICAgICB0YT1wcmludF9vcHRpb24ocHRyLT5vcHRfdHlwZSwgcHRyLT5vcHRfdmFsWzBdKTsKKyAgICAgICAgdGw9cHJpbnRfb3B0aW9uKHB0ci0+b3B0X3R5cGUsIHB0ci0+b3B0X3ZhbFsxXSk7CisgICAgICAgIHRyPXByaW50X29wdGlvbihwdHItPm9wdF90eXBlLCBwdHItPm9wdF92YWxbMl0pOworICAgICAgICAvKiBwcmludCBjb2xsZWN0ZWQgZGF0YSBhbmQgZmVlIHRoZSBtZW1vcnkgKi8KKyAgICAgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAlLTE2c3wlMTBzfCUxMHN8JTEwc3wlMTBzIiwKKyAgICAgICAgICAgIHB0ci0+b3B0X3N0ciwgdGEsIHRsLCB0ciwgdGQpOworICAgICAgICBzdHJfZnJlZSh0YSk7IHN0cl9mcmVlKHRsKTsgc3RyX2ZyZWUodHIpOyBzdHJfZnJlZSh0ZCk7CisgICAgfQorICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICByZXR1cm4gMDsgLyogT0sgKi8KK30KKworTk9FWFBPUlQgY2hhciAqcHJpbnRfb3B0aW9uKGludCB0eXBlLCBPUFRfVU5JT04gKnZhbCkgeworICAgIGlmKCF2YWwpCisgICAgICAgIHJldHVybiBzdHJfZHVwKCIgICAgLS0gICAgIik7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIFRZUEVfRkxBRzoKKyAgICAgICAgcmV0dXJuIHN0cl9wcmludGYoIiVzIiwgdmFsLT5pX3ZhbCA/ICJ5ZXMiIDogIm5vIik7CisgICAgY2FzZSBUWVBFX0lOVDoKKyAgICAgICAgcmV0dXJuIHN0cl9wcmludGYoIiVkIiwgdmFsLT5pX3ZhbCk7CisgICAgY2FzZSBUWVBFX0xJTkdFUjoKKyAgICAgICAgcmV0dXJuIHN0cl9wcmludGYoIiVkOiVkIiwKKyAgICAgICAgICAgIHZhbC0+bGluZ2VyX3ZhbC5sX29ub2ZmLCB2YWwtPmxpbmdlcl92YWwubF9saW5nZXIpOworICAgIGNhc2UgVFlQRV9USU1FVkFMOgorICAgICAgICByZXR1cm4gc3RyX3ByaW50ZigiJWQ6JWQiLAorICAgICAgICAgICAgKGludCl2YWwtPnRpbWV2YWxfdmFsLnR2X3NlYywgKGludCl2YWwtPnRpbWV2YWxfdmFsLnR2X3VzZWMpOworICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBzdHJfcHJpbnRmKCIlcyIsIHZhbC0+Y192YWwpOworICAgIH0KKyAgICByZXR1cm4gc3RyX2R1cCgiICBPb29wcz8gICIpOyAvKiBpbnRlcm5hbCBlcnJvcj8gKi8KK30KKworTk9FWFBPUlQgaW50IHBhcnNlX3NvY2tldF9vcHRpb24oY2hhciAqYXJnKSB7CisgICAgaW50IHNvY2tldF90eXBlOyAvKiAwLWFjY2VwdCwgMS1sb2NhbCwgMi1yZW1vdGUgKi8KKyAgICBjaGFyICpvcHRfdmFsX3N0ciwgKm9wdF92YWwyX3N0ciwgKnRtcF9zdHI7CisgICAgU09DS19PUFQgKnB0cjsKKworICAgIGlmKGFyZ1sxXSE9JzonKQorICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgc3dpdGNoKGFyZ1swXSkgeworICAgIGNhc2UgJ2EnOgorICAgICAgICBzb2NrZXRfdHlwZT0wOyBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgICAgc29ja2V0X3R5cGU9MTsgYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgICAgIHNvY2tldF90eXBlPTI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICB9CisgICAgYXJnKz0yOworICAgIG9wdF92YWxfc3RyPXN0cmNocihhcmcsICc9Jyk7CisgICAgaWYoIW9wdF92YWxfc3RyKSAvKiBubyAnPSc/ICovCisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAqb3B0X3ZhbF9zdHIrKz0nXDAnOworICAgIHB0cj1zb2NrX29wdHM7CisgICAgZm9yKDs7KSB7CisgICAgICAgIGlmKCFwdHItPm9wdF9zdHIpCisgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgICAgIGlmKCFzdHJjbXAoYXJnLCBwdHItPm9wdF9zdHIpKQorICAgICAgICAgICAgYnJlYWs7IC8qIG9wdGlvbiBuYW1lIGZvdW5kICovCisgICAgICAgICsrcHRyOworICAgIH0KKyAgICBwdHItPm9wdF92YWxbc29ja2V0X3R5cGVdPXN0cl9hbGxvYyhzaXplb2YoT1BUX1VOSU9OKSk7CisgICAgc3dpdGNoKHB0ci0+b3B0X3R5cGUpIHsKKyAgICBjYXNlIFRZUEVfRkxBRzoKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAob3B0X3ZhbF9zdHIsICJ5ZXMiKSB8fCAhc3RyY21wKG9wdF92YWxfc3RyLCAiMSIpKSB7CisgICAgICAgICAgICBwdHItPm9wdF92YWxbc29ja2V0X3R5cGVdLT5pX3ZhbD0xOworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIE9LICovCisgICAgICAgIH0KKyAgICAgICAgaWYoIXN0cmNhc2VjbXAob3B0X3ZhbF9zdHIsICJubyIpIHx8ICFzdHJjbXAob3B0X3ZhbF9zdHIsICIwIikpIHsKKyAgICAgICAgICAgIHB0ci0+b3B0X3ZhbFtzb2NrZXRfdHlwZV0tPmlfdmFsPTA7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogT0sgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgY2FzZSBUWVBFX0lOVDoKKyAgICAgICAgcHRyLT5vcHRfdmFsW3NvY2tldF90eXBlXS0+aV92YWw9KGludClzdHJ0b2wob3B0X3ZhbF9zdHIsICZ0bXBfc3RyLCAxMCk7CisgICAgICAgIGlmKHRtcF9zdHI9PWFyZyB8fCAqdG1wX3N0cikgLyogbm90IGEgbnVtYmVyICovCisgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgICAgIHJldHVybiAwOyAvKiBPSyAqLworICAgIGNhc2UgVFlQRV9MSU5HRVI6CisgICAgICAgIG9wdF92YWwyX3N0cj1zdHJjaHIob3B0X3ZhbF9zdHIsICc6Jyk7CisgICAgICAgIGlmKG9wdF92YWwyX3N0cikgeworICAgICAgICAgICAgKm9wdF92YWwyX3N0cisrPSdcMCc7CisgICAgICAgICAgICBwdHItPm9wdF92YWxbc29ja2V0X3R5cGVdLT5saW5nZXJfdmFsLmxfbGluZ2VyPQorICAgICAgICAgICAgICAgICh1X3Nob3J0KXN0cnRvbChvcHRfdmFsMl9zdHIsICZ0bXBfc3RyLCAxMCk7CisgICAgICAgICAgICBpZih0bXBfc3RyPT1hcmcgfHwgKnRtcF9zdHIpIC8qIG5vdCBhIG51bWJlciAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB0ci0+b3B0X3ZhbFtzb2NrZXRfdHlwZV0tPmxpbmdlcl92YWwubF9saW5nZXI9MDsKKyAgICAgICAgfQorICAgICAgICBwdHItPm9wdF92YWxbc29ja2V0X3R5cGVdLT5saW5nZXJfdmFsLmxfb25vZmY9CisgICAgICAgICAgICAodV9zaG9ydClzdHJ0b2wob3B0X3ZhbF9zdHIsICZ0bXBfc3RyLCAxMCk7CisgICAgICAgIGlmKHRtcF9zdHI9PWFyZyB8fCAqdG1wX3N0cikgLyogbm90IGEgbnVtYmVyICovCisgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgICAgIHJldHVybiAwOyAvKiBPSyAqLworICAgIGNhc2UgVFlQRV9USU1FVkFMOgorICAgICAgICBvcHRfdmFsMl9zdHI9c3RyY2hyKG9wdF92YWxfc3RyLCAnOicpOworICAgICAgICBpZihvcHRfdmFsMl9zdHIpIHsKKyAgICAgICAgICAgICpvcHRfdmFsMl9zdHIrKz0nXDAnOworICAgICAgICAgICAgcHRyLT5vcHRfdmFsW3NvY2tldF90eXBlXS0+dGltZXZhbF92YWwudHZfdXNlYz0KKyAgICAgICAgICAgICAgICBzdHJ0b2wob3B0X3ZhbDJfc3RyLCAmdG1wX3N0ciwgMTApOworICAgICAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdHItPm9wdF92YWxbc29ja2V0X3R5cGVdLT50aW1ldmFsX3ZhbC50dl91c2VjPTA7CisgICAgICAgIH0KKyAgICAgICAgcHRyLT5vcHRfdmFsW3NvY2tldF90eXBlXS0+dGltZXZhbF92YWwudHZfc2VjPXN0cnRvbChvcHRfdmFsX3N0ciwgJnRtcF9zdHIsIDEwKTsKKyAgICAgICAgaWYodG1wX3N0cj09YXJnIHx8ICp0bXBfc3RyKSAvKiBub3QgYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAgICAgcmV0dXJuIDA7IC8qIE9LICovCisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgICAgaWYoc3RybGVuKG9wdF92YWxfc3RyKSsxPnNpemVvZihPUFRfVU5JT04pKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgICAgICBzdHJjcHkocHRyLT5vcHRfdmFsW3NvY2tldF90eXBlXS0+Y192YWwsIG9wdF92YWxfc3RyKTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIE9LICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgOyAvKiBBTlNJIEMgY29tcGlsZXIgbmVlZHMgaXQgKi8KKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBPQ1NQICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQCisKK05PRVhQT1JUIHVuc2lnbmVkIGxvbmcgcGFyc2Vfb2NzcF9mbGFnKGNoYXIgKmFyZykgeworICAgIHN0cnVjdCB7CisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgfSBvY3NwX29wdHNbXSA9IHsKKyAgICAgICAgeyJOT0NFUlRTIiwgT0NTUF9OT0NFUlRTfSwKKyAgICAgICAgeyJOT0lOVEVSTiIsIE9DU1BfTk9JTlRFUk59LAorICAgICAgICB7Ik5PU0lHUyIsIE9DU1BfTk9TSUdTfSwKKyAgICAgICAgeyJOT0NIQUlOIiwgT0NTUF9OT0NIQUlOfSwKKyAgICAgICAgeyJOT1ZFUklGWSIsIE9DU1BfTk9WRVJJRll9LAorICAgICAgICB7Ik5PRVhQTElDSVQiLCBPQ1NQX05PRVhQTElDSVR9LAorICAgICAgICB7Ik5PQ0FTSUdOIiwgT0NTUF9OT0NBU0lHTn0sCisgICAgICAgIHsiTk9ERUxFR0FURUQiLCBPQ1NQX05PREVMRUdBVEVEfSwKKyAgICAgICAgeyJOT0NIRUNLUyIsIE9DU1BfTk9DSEVDS1N9LAorICAgICAgICB7IlRSVVNUT1RIRVIiLCBPQ1NQX1RSVVNUT1RIRVJ9LAorICAgICAgICB7IlJFU1BJRF9LRVkiLCBPQ1NQX1JFU1BJRF9LRVl9LAorICAgICAgICB7Ik5PVElNRSIsIE9DU1BfTk9USU1FfSwKKyAgICAgICAge05VTEwsIDB9CisgICAgfSwgKm9wdGlvbjsKKworICAgIGZvcihvcHRpb249b2NzcF9vcHRzOyBvcHRpb24tPm5hbWU7ICsrb3B0aW9uKQorICAgICAgICBpZighc3RyY2FzZWNtcChvcHRpb24tPm5hbWUsIGFyZykpCisgICAgICAgICAgICByZXR1cm4gb3B0aW9uLT52YWx1ZTsKKyAgICByZXR1cm4gMDsgLyogRkFJTEVEICovCit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGVuZ2luZSAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisKKyNkZWZpbmUgTUFYX0VOR0lORVMgMjU2CitzdGF0aWMgRU5HSU5FICplbmdpbmVzW01BWF9FTkdJTkVTXTsgLyogdGFibGUgb2YgZW5naW5lcyBmb3IgY29uZmlnIHBhcnNlciAqLworc3RhdGljIGludCBjdXJyZW50X2VuZ2luZTsKK3N0YXRpYyBpbnQgZW5naW5lX2luaXRpYWxpemVkOworCitOT0VYUE9SVCB2b2lkIGVuZ2luZV9yZXNldF9saXN0KHZvaWQpIHsKKyAgICBjdXJyZW50X2VuZ2luZT0tMTsKK30KKworTk9FWFBPUlQgY2hhciAqZW5naW5lX2F1dG8odm9pZCkgeworICAgIEVOR0lORSAqZTsKKworICAgIHNfbG9nKExPR19ERUJVRywgIkVuYWJsaW5nIGF1dG9tYXRpYyBlbmdpbmUgc3VwcG9ydCIpOworICAgIEVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKKyAgICBjdXJyZW50X2VuZ2luZT0tMTsKKyAgICAvKiByZWJ1aWxkIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGVuZ2luZXMgKi8KKyAgICBmb3IoZT1FTkdJTkVfZ2V0X2ZpcnN0KCk7IGU7IGU9RU5HSU5FX2dldF9uZXh0KGUpKSB7CisgICAgICAgIGlmKCsrY3VycmVudF9lbmdpbmU+PU1BWF9FTkdJTkVTKQorICAgICAgICAgICAgcmV0dXJuICJUb28gbWFueSBvcGVuIGVuZ2luZXMiOworICAgICAgICBlbmdpbmVzW2N1cnJlbnRfZW5naW5lXT1lOworICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkVuZ2luZSAjJWQgKCVzKSByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgIGN1cnJlbnRfZW5naW5lKzEsIEVOR0lORV9nZXRfaWQoZSkpOworICAgIH0KKyAgICBlbmdpbmVfaW5pdGlhbGl6ZWQ9MTsKKyAgICBzX2xvZyhMT0dfREVCVUcsICJBdXRvbWF0aWMgZW5naW5lIHN1cHBvcnQgZW5hYmxlZCIpOworICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworfQorCitOT0VYUE9SVCBjaGFyICplbmdpbmVfb3Blbihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgZW5naW5lX25leHQoKTsKKyAgICBpZihjdXJyZW50X2VuZ2luZT49TUFYX0VOR0lORVMpCisgICAgICAgIHJldHVybiAiVG9vIG1hbnkgb3BlbiBlbmdpbmVzIjsKKyAgICBzX2xvZyhMT0dfREVCVUcsICJFbmFibGluZyBzdXBwb3J0IGZvciBlbmdpbmUgXCIlc1wiIiwgbmFtZSk7CisgICAgZW5naW5lc1tjdXJyZW50X2VuZ2luZV09RU5HSU5FX2J5X2lkKG5hbWUpOworICAgIGVuZ2luZV9pbml0aWFsaXplZD0wOworICAgIGlmKCFlbmdpbmVzW2N1cnJlbnRfZW5naW5lXSkgeworICAgICAgICBzc2xlcnJvcigiRU5HSU5FX2J5X2lkIik7CisgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIG9wZW4gdGhlIGVuZ2luZSI7CisgICAgfQorICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworfQorCitOT0VYUE9SVCBjaGFyICplbmdpbmVfY3RybChjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZykgeworICAgIGlmKGN1cnJlbnRfZW5naW5lPDApCisgICAgICAgIHJldHVybiAiTm8gZW5naW5lIHdhcyBkZWZpbmVkIjsKKyAgICBpZighc3RyY2FzZWNtcChjbWQsICJJTklUIikpIC8qIHNwZWNpYWwgY29udHJvbCBjb21tYW5kICovCisgICAgICAgIHJldHVybiBlbmdpbmVfaW5pdCgpOworICAgIGlmKGFyZykKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiRXhlY3V0aW5nIGVuZ2luZSBjb250cm9sIGNvbW1hbmQgJXM6JXMiLCBjbWQsIGFyZyk7CisgICAgZWxzZQorICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJFeGVjdXRpbmcgZW5naW5lIGNvbnRyb2wgY29tbWFuZCAlcyIsIGNtZCk7CisgICAgaWYoIUVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZW5naW5lc1tjdXJyZW50X2VuZ2luZV0sIGNtZCwgYXJnLCAwKSkgeworICAgICAgICBzc2xlcnJvcigiRU5HSU5FX2N0cmxfY21kX3N0cmluZyIpOworICAgICAgICByZXR1cm4gIkZhaWxlZCB0byBleGVjdXRlIHRoZSBlbmdpbmUgY29udHJvbCBjb21tYW5kIjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7IC8qIE9LICovCit9CisKK05PRVhQT1JUIGNoYXIgKmVuZ2luZV9kZWZhdWx0KGNvbnN0IGNoYXIgKmxpc3QpIHsKKyAgICBpZihjdXJyZW50X2VuZ2luZTwwKQorICAgICAgICByZXR1cm4gIk5vIGVuZ2luZSB3YXMgZGVmaW5lZCI7CisgICAgaWYoIUVOR0lORV9zZXRfZGVmYXVsdF9zdHJpbmcoZW5naW5lc1tjdXJyZW50X2VuZ2luZV0sIGxpc3QpKSB7CisgICAgICAgIHNzbGVycm9yKCJFTkdJTkVfc2V0X2RlZmF1bHRfc3RyaW5nIik7CisgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIHNldCBlbmdpbmUgYXMgZGVmYXVsdCI7CisgICAgfQorICAgIHNfbG9nKExPR19JTkZPLCAiRW5naW5lICMlZCAoJXMpIHNldCBhcyBkZWZhdWx0IGZvciAlcyIsCisgICAgICAgIGN1cnJlbnRfZW5naW5lKzEsIEVOR0lORV9nZXRfaWQoZW5naW5lc1tjdXJyZW50X2VuZ2luZV0pLCBsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTk9FWFBPUlQgY2hhciAqZW5naW5lX2luaXQodm9pZCkgeworICAgIGlmKGN1cnJlbnRfZW5naW5lPDApCisgICAgICAgIHJldHVybiAiTm8gZW5naW5lIHdhcyBkZWZpbmVkIjsKKyAgICBpZihlbmdpbmVfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworICAgIHNfbG9nKExPR19ERUJVRywgIkluaXRpYWxpemluZyBlbmdpbmUgIyVkICglcykiLAorICAgICAgICBjdXJyZW50X2VuZ2luZSsxLCBFTkdJTkVfZ2V0X2lkKGVuZ2luZXNbY3VycmVudF9lbmdpbmVdKSk7CisgICAgaWYoIUVOR0lORV9pbml0KGVuZ2luZXNbY3VycmVudF9lbmdpbmVdKSkgeworICAgICAgICBpZihFUlJfcGVla19sYXN0X2Vycm9yKCkpIC8qIHJlYWxseSBhbiBlcnJvciAqLworICAgICAgICAgICAgc3NsZXJyb3IoIkVOR0lORV9pbml0Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJFbmdpbmUgIyVkICglcykgbm90IGluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICBjdXJyZW50X2VuZ2luZSsxLCBFTkdJTkVfZ2V0X2lkKGVuZ2luZXNbY3VycmVudF9lbmdpbmVdKSk7CisgICAgICAgIHJldHVybiAiRW5naW5lIGluaXRpYWxpemF0aW9uIGZhaWxlZCI7CisgICAgfQorI2lmIDAKKyAgICAvKiBpdCBpcyBhIGJhZCBpZGVhIHRvIHNldCB0aGUgZW5naW5lIGFzIGRlZmF1bHQgZm9yIGFsbCBzZWN0aW9ucyAqLworICAgIC8qIHRoZSAiZW5naW5lPWF1dG8iIG9yICJlbmdpbmVEZWZhdWx0IiBvcHRpb25zIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgKi8KKyAgICBpZighRU5HSU5FX3NldF9kZWZhdWx0KGVuZ2luZXNbY3VycmVudF9lbmdpbmVdLCBFTkdJTkVfTUVUSE9EX0FMTCkpIHsKKyAgICAgICAgc3NsZXJyb3IoIkVOR0lORV9zZXRfZGVmYXVsdCIpOworICAgICAgICByZXR1cm4gIlNlbGVjdGluZyBkZWZhdWx0IGVuZ2luZSBmYWlsZWQiOworICAgIH0KKyNlbmRpZgorICAgIHNfbG9nKExPR19JTkZPLCAiRW5naW5lICMlZCAoJXMpIGluaXRpYWxpemVkIiwKKyAgICAgICAgY3VycmVudF9lbmdpbmUrMSwgRU5HSU5FX2dldF9pZChlbmdpbmVzW2N1cnJlbnRfZW5naW5lXSkpOworICAgIGVuZ2luZV9pbml0aWFsaXplZD0xOworICAgIHJldHVybiBOVUxMOyAvKiBPSyAqLworfQorCitOT0VYUE9SVCB2b2lkIGVuZ2luZV9uZXh0KHZvaWQpIHsKKyAgICBpZihjdXJyZW50X2VuZ2luZT49MCkKKyAgICAgICAgZW5naW5lX2luaXQoKTsKKyAgICArK2N1cnJlbnRfZW5naW5lOworfQorCitOT0VYUE9SVCBFTkdJTkUgKmVuZ2luZV9nZXRfYnlfaWQoY29uc3QgY2hhciAqaWQpIHsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8Y3VycmVudF9lbmdpbmU7ICsraSkKKyAgICAgICAgaWYoIXN0cmNtcChpZCwgRU5HSU5FX2dldF9pZChlbmdpbmVzW2ldKSkpCisgICAgICAgICAgICByZXR1cm4gZW5naW5lc1tpXTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTk9FWFBPUlQgRU5HSU5FICplbmdpbmVfZ2V0X2J5X251bShjb25zdCBpbnQgaSkgeworICAgIGlmKGk8MCB8fCBpPj1jdXJyZW50X2VuZ2luZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGVuZ2luZXNbaV07Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZmF0YWwgZXJyb3IgKi8KKworTk9FWFBPUlQgdm9pZCBwcmludF9zeW50YXgodm9pZCkgeworICAgIHNfbG9nKExPR19OT1RJQ0UsICIgIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIlN5bnRheDoiKTsKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAic3R1bm5lbCAiCisjaWZkZWYgVVNFX1dJTjMyCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgIlsgWy1pbnN0YWxsIHwgLXVuaW5zdGFsbCB8IC1yZWxvYWQgfCAtcmVvcGVuXSAiCisjZW5kaWYKKyAgICAgICAgIlstcXVpZXRdICIKKyNlbmRpZgorICAgICAgICAiWzxmaWxlbmFtZT5dIF0gIgorI2lmbmRlZiBVU0VfV0lOMzIKKyAgICAgICAgIi1mZCA8bj4gIgorI2VuZGlmCisgICAgICAgICJ8IC1oZWxwIHwgLXZlcnNpb24gfCAtc29ja2V0cyIpOworICAgIHNfbG9nKExPR19OT1RJQ0UsICIgICAgPGZpbGVuYW1lPiAgLSB1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlIik7CisjaWZkZWYgVVNFX1dJTjMyCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiICAgIC1pbnN0YWxsICAgIC0gaW5zdGFsbCBOVCBzZXJ2aWNlIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtdW5pbnN0YWxsICAtIHVuaW5zdGFsbCBOVCBzZXJ2aWNlIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtcmVsb2FkICAgICAtIHJlbG9hZCBjb25maWd1cmF0aW9uIGZvciBOVCBzZXJ2aWNlIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtcmVvcGVuICAgICAtIHJlb3BlbiBsb2cgZmlsZSBmb3IgTlQgc2VydmljZSIpOworI2VuZGlmCisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtcXVpZXQgICAgICAtIGRvbid0IGRpc3BsYXkgbWVzc2FnZSBib3hlcyIpOworI2Vsc2UKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiICAgIC1mZCA8bj4gICAgIC0gcmVhZCB0aGUgY29uZmlnIGZpbGUgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciIpOworI2VuZGlmCisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtaGVscCAgICAgICAtIGdldCBjb25maWcgZmlsZSBoZWxwIik7CisgICAgc19sb2coTE9HX05PVElDRSwgIiAgICAtdmVyc2lvbiAgICAtIGRpc3BsYXkgdmVyc2lvbiBhbmQgZGVmYXVsdHMiKTsKKyAgICBzX2xvZyhMT0dfTk9USUNFLCAiICAgIC1zb2NrZXRzICAgIC0gZGlzcGxheSBkZWZhdWx0IHNvY2tldCBvcHRpb25zIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHZhcmlvdXMgc3VwcG9ydGluZyBmdW5jdGlvbnMgKi8KKworTk9FWFBPUlQgdm9pZCBuYW1lX2xpc3RfYXBwZW5kKE5BTUVfTElTVCAqKnB0ciwgY2hhciAqbmFtZSkgeworICAgIHdoaWxlKCpwdHIpIC8qIGZpbmQgdGhlIG51bGwgcG9pbnRlciAqLworICAgICAgICBwdHI9JigqcHRyKS0+bmV4dDsKKyAgICAqcHRyPXN0cl9hbGxvYyhzaXplb2YoTkFNRV9MSVNUKSk7CisgICAgKCpwdHIpLT5uYW1lPXN0cl9kdXAobmFtZSk7CisgICAgKCpwdHIpLT5uZXh0PU5VTEw7Cit9CisKKyNpZm5kZWYgVVNFX1dJTjMyCisKK05PRVhQT1JUIGNoYXIgKiphcmdhbGxvYyhjaGFyICpzdHIpIHsgLyogYWxsb2NhdGUgJ2V4ZWMnIGFyZ3VtZXRzICovCisgICAgc2l6ZV90IG1heF9hcmcsIGk7CisgICAgY2hhciAqcHRyLCAqKnJldHZhbDsKKworICAgIG1heF9hcmc9c3RybGVuKHN0cikvMisxOworICAgIHB0cj1zdHJfZHVwKHN0cik7CisgICAgcmV0dmFsPXN0cl9hbGxvYygobWF4X2FyZysxKSpzaXplb2YoY2hhciAqKSk7CisgICAgaT0wOworICAgIHdoaWxlKCpwdHIgJiYgaTxtYXhfYXJnKSB7CisgICAgICAgIHJldHZhbFtpKytdPXB0cjsKKyAgICAgICAgd2hpbGUoKnB0ciAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcHRyKSkKKyAgICAgICAgICAgICsrcHRyOworICAgICAgICB3aGlsZSgqcHRyICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnB0cikpCisgICAgICAgICAgICAqcHRyKys9J1wwJzsKKyAgICB9CisgICAgcmV0dmFsW2ldPU5VTEw7IC8qIHRvIHNob3cgdGhhdCBpdCdzIG51bGwtdGVybWluYXRlZCAqLworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyogZW5kIG9mIG9wdGlvbnMuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zMi5tYWsgYi9zcmMvb3MyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zMi5tYWsKQEAgLTAsMCArMSw3OCBAQAorcHJlZml4PS4KK0RFRlMgPSAtRFBBQ0tBR0VfTkFNRT1cInN0dW5uZWxcIiBcCisJLURQQUNLQUdFX1RBUk5BTUU9XCJzdHVubmVsXCIgXAorCS1EUEFDS0FHRV9WRVJTSU9OPVwiNS4yMlwiIFwKKwktRFBBQ0tBR0VfU1RSSU5HPVwic3R1bm5lbFwgNS4yMlwiIFwKKwktRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgXAorCS1EUEFDS0FHRT1cInN0dW5uZWxcIiBcCisJLURWRVJTSU9OPVwiNS4yMlwiIFwKKwktRFNURENfSEVBREVSUz0xIFwKKwktREhBVkVfU1lTX1RZUEVTX0g9MSBcCisJLURIQVZFX1NZU19TVEFUX0g9MSBcCisJLURIQVZFX1NURExJQl9IPTEgXAorCS1ESEFWRV9TVFJJTkdfSD0xIFwKKwktREhBVkVfTUVNT1JZX0g9MSBcCisJLURIQVZFX1NUUklOR1NfSD0xIFwKKwktREhBVkVfVU5JU1REX0g9MSBcCisJLURIQVZFX09TU0xfRU5HSU5FX0g9MSBcCisJLURTU0xESVI9XCIvdXNyXCIgXAorCS1ESE9TVD1cImkzODYtcGMtb3MyLWVteFwiIFwKKwktREhBVkVfTElCU09DS0VUPTEgXAorCS1ESEFWRV9HUlBfSD0xIFwKKwktREhBVkVfVU5JU1REX0g9MSBcCisJLURIQVZFX1NZU19TRUxFQ1RfSD0xIFwKKwktREhBVkVfU1lTX0lPQ1RMX0g9MSBcCisJLURIQVZFX1NZU19SRVNPVVJDRV9IPTEgXAorCS1ESEFWRV9TTlBSSU5URj0xIFwKKwktREhBVkVfVlNOUFJJTlRGPTEgXAorCS1ESEFWRV9XQUlUUElEPTEgXAorCS1ESEFWRV9TWVNDT05GPTEgXAorCS1ESEFWRV9FTkRIT1NURU5UPTEgXAorICAgICAgICAtRFVTRV9PUzI9MSBcCisJLURTSVpFT0ZfVU5TSUdORURfQ0hBUj0xIFwKKwktRFNJWkVPRl9VTlNJR05FRF9TSE9SVD0yIFwKKwktRFNJWkVPRl9VTlNJR05FRF9JTlQ9NCBcCisJLURTSVpFT0ZfVU5TSUdORURfTE9ORz00IFwKKyAgICAgIAktRExJQkRJUj1cIiQocHJlZml4KS9saWJcIiBcCisgICAgICAgIC1EQ09ORkRJUj1cIiQocHJlZml4KS9ldGNcIgorCitDQyA9IGdjYworLlNVRkZJWEVTID0gLmMgLm8KK09QRU5TU0xESVIgPSB1Oi9leHRyYXMKKyNTWVNMT0dESVIgPSAvdW5peG9zMi93b3JrZGlyL3N5c2xvZworSU5DTFVERVMgPSAtSSQoT1BFTlNTTERJUikvb3V0aW5jCitMSUJTID0gLWxzb2NrZXQgLUwkKE9QRU5TU0xESVIpL291dCAtbHNzbCAtbGNyeXB0byAtbHogLWxzeXNsb2cKK09CSlMgPSBmaWxlLm8gY2xpZW50Lm8gbG9nLm8gb3B0aW9ucy5vIHByb3RvY29sLm8gbmV0d29yay5vIHNzbC5vIGN0eC5vIHZlcmlmeS5vIHN0aHJlYWRzLm8gc3R1bm5lbC5vIHB0eS5vIHJlc29sdmVyLm8gc3RyLm8gdGxzLm8gZmQubyBkaHBhcmFtLm8gY3Jvbi5vCitMSUJESVIgPSAuCitDRkxBR1MgPSAtTzIgLVdhbGwgLVdzaGFkb3cgLVdjYXN0LWFsaWduIC1XcG9pbnRlci1hcml0aAorCithbGw6IHN0dW5uZWwuZXhlCisKK3N0dW5uZWwuZXhlOiAkKE9CSlMpCisJJChDQykgLVptYXAgJChDRkxBR1MpIC1vICRAICQoT0JKUykgJChMSUJTKQorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAkKERFRlMpICQoSU5DTFVERVMpIC1vICRAIC1jICQ8CisKK2NsaWVudC5vOiBjbGllbnQuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKKyNlbnYubzogZW52LmMgY29tbW9uLmggcHJvdG90eXBlcy5oCisjZ3VpLm86IGd1aS5jIGNvbW1vbi5oIHByb3RvdHlwZXMuaAorZmlsZS5vOiBmaWxlLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCituZXR3b3JrLm86IG5ldHdvcmsuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK29wdGlvbnMubzogb3B0aW9ucy5jIGNvbW1vbi5oIHByb3RvdHlwZXMuaAorcHJvdG9jb2wubzogcHJvdG9jb2wuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK3B0eS5vOiBwdHkuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK3NzbC5vOiBzc2wuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK2N0eC5vOiBjdHguYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK3ZlcmlmeS5vOiB2ZXJpZnkuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK3N0aHJlYWRzLm86IHN0aHJlYWRzLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCitzdHVubmVsLm86IHN0dW5uZWwuYyBjb21tb24uaCBwcm90b3R5cGVzLmgKK3Jlc29sdmVyLm86IHJlc29sdmVyLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCitzdHIubzogc3RyLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCit0bHMubzogdGxzLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCitmZC5vOiBmZC5jIGNvbW1vbi5oIHByb3RvdHlwZXMuaAorZGhwYXJhbS5vOiBkaHBhcmFtLmMgY29tbW9uLmggcHJvdG90eXBlcy5oCitjcm9uLm86IGNyb24uYyBjb21tb24uaCBwcm90b3R5cGVzLmgKKworY2xlYW46CisJcm0gLWYgKi5vICouZXhlCmRpZmYgLS1naXQgYS9zcmMvcHJvdG9jb2wuYyBiL3NyYy9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MmM4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG9jb2wuYwpAQCAtMCwwICsxLDExMzkgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworI2RlZmluZSBpc19wcmVmaXgoYSwgYikgKHN0cm5jYXNlY21wKChhKSwgKGIpLCBzdHJsZW4oYikpPT0wKQorCisvKiBwcm90b2NvbC1zcGVjaWZpYyBmdW5jdGlvbiBwcm90b3R5cGVzICovCitOT0VYUE9SVCBjaGFyICpzb2Nrc19zZXJ2ZXIoQ0xJICosIFNFUlZJQ0VfT1BUSU9OUyAqLCBjb25zdCBQSEFTRSk7CitOT0VYUE9SVCB2b2lkIHNvY2tzNF9zZXJ2ZXIoQ0xJICopOworTk9FWFBPUlQgdm9pZCBzb2NrczVfc2VydmVyX21ldGhvZChDTEkgKik7CitOT0VYUE9SVCB2b2lkIHNvY2tzNV9zZXJ2ZXIoQ0xJICopOworTk9FWFBPUlQgY2hhciAqcHJveHlfc2VydmVyKENMSSAqLCBTRVJWSUNFX09QVElPTlMgKiwgY29uc3QgUEhBU0UpOworTk9FWFBPUlQgY2hhciAqY2lmc19jbGllbnQoQ0xJICosIFNFUlZJQ0VfT1BUSU9OUyAqLCBjb25zdCBQSEFTRSk7CitOT0VYUE9SVCBjaGFyICpjaWZzX3NlcnZlcihDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKK05PRVhQT1JUIGNoYXIgKnBnc3FsX2NsaWVudChDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKK05PRVhQT1JUIGNoYXIgKnBnc3FsX3NlcnZlcihDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKK05PRVhQT1JUIGNoYXIgKnNtdHBfY2xpZW50KENMSSAqLCBTRVJWSUNFX09QVElPTlMgKiwgY29uc3QgUEhBU0UpOworTk9FWFBPUlQgY2hhciAqc210cF9zZXJ2ZXIoQ0xJICosIFNFUlZJQ0VfT1BUSU9OUyAqLCBjb25zdCBQSEFTRSk7CitOT0VYUE9SVCBjaGFyICpwb3AzX2NsaWVudChDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKK05PRVhQT1JUIGNoYXIgKnBvcDNfc2VydmVyKENMSSAqLCBTRVJWSUNFX09QVElPTlMgKiwgY29uc3QgUEhBU0UpOworTk9FWFBPUlQgY2hhciAqaW1hcF9jbGllbnQoQ0xJICosIFNFUlZJQ0VfT1BUSU9OUyAqLCBjb25zdCBQSEFTRSk7CitOT0VYUE9SVCBjaGFyICppbWFwX3NlcnZlcihDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKK05PRVhQT1JUIGNoYXIgKm5udHBfY2xpZW50KENMSSAqLCBTRVJWSUNFX09QVElPTlMgKiwgY29uc3QgUEhBU0UpOworTk9FWFBPUlQgY2hhciAqY29ubmVjdF9zZXJ2ZXIoQ0xJICosIFNFUlZJQ0VfT1BUSU9OUyAqLCBjb25zdCBQSEFTRSk7CitOT0VYUE9SVCBjaGFyICpjb25uZWN0X2NsaWVudChDTEkgKiwgU0VSVklDRV9PUFRJT05TICosIGNvbnN0IFBIQVNFKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDQKK05PRVhQT1JUIHZvaWQgbnRsbShDTEkgKiwgU0VSVklDRV9PUFRJT05TICopOworTk9FWFBPUlQgY2hhciAqbnRsbTEoKTsKK05PRVhQT1JUIGNoYXIgKm50bG0zKGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworTk9FWFBPUlQgdm9pZCBjcnlwdF9ERVMoREVTX2NibG9jaywgREVTX2NibG9jaywgREVTX2NibG9jayk7CisjZW5kaWYKK05PRVhQT1JUIGNoYXIgKmJhc2U2NChpbnQsIGNoYXIgKiwgaW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZnJhbWV3b3JrICovCisKK2NoYXIgKnByb3RvY29sKENMSSAqYywgU0VSVklDRV9PUFRJT05TICpvcHQsIGNvbnN0IFBIQVNFIHBoYXNlKSB7CisgICAgaWYocGhhc2U9PVBST1RPQ09MX0NIRUNLKSAvKiBkZWZhdWx0IHRvIGJlIG92ZXJyaWRkZW4gYnkgcHJvdG9jb2xzICovCisgICAgICAgIG9wdC0+b3B0aW9uLmNvbm5lY3RfYmVmb3JlX3NzbD1vcHQtPm9wdGlvbi5jbGllbnQ7CisgICAgaWYoIW9wdC0+cHJvdG9jb2wpIC8qIG5vIHByb3RvY29sIHNwZWNpZmllZCAqLworICAgICAgICByZXR1cm4gTlVMTDsgLyogc2tpcCBmdXJ0aGVyIGFjdGlvbnMgKi8KKyAgICBpZighc3RyY2FzZWNtcChvcHQtPnByb3RvY29sLCAic29ja3MiKSkKKyAgICAgICAgcmV0dXJuIG9wdC0+b3B0aW9uLmNsaWVudCA/CisgICAgICAgICAgICAiVGhlICdzb2NrcycgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBpbiBjbGllbnQgbW9kZSIgOgorICAgICAgICAgICAgc29ja3Nfc2VydmVyKGMsIG9wdCwgcGhhc2UpOworICAgIGlmKCFzdHJjYXNlY21wKG9wdC0+cHJvdG9jb2wsICJwcm94eSIpKQorICAgICAgICByZXR1cm4gb3B0LT5vcHRpb24uY2xpZW50ID8KKyAgICAgICAgICAgICJUaGUgJ3Byb3h5JyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkIGluIGNsaWVudCBtb2RlIiA6CisgICAgICAgICAgICBwcm94eV9zZXJ2ZXIoYywgb3B0LCBwaGFzZSk7CisgICAgaWYoIXN0cmNhc2VjbXAob3B0LT5wcm90b2NvbCwgImNpZnMiKSkKKyAgICAgICAgcmV0dXJuIG9wdC0+b3B0aW9uLmNsaWVudCA/CisgICAgICAgICAgICBjaWZzX2NsaWVudChjLCBvcHQsIHBoYXNlKSA6CisgICAgICAgICAgICBjaWZzX3NlcnZlcihjLCBvcHQsIHBoYXNlKTsKKyAgICBpZighc3RyY2FzZWNtcChvcHQtPnByb3RvY29sLCAicGdzcWwiKSkKKyAgICAgICAgcmV0dXJuIG9wdC0+b3B0aW9uLmNsaWVudCA/CisgICAgICAgICAgICBwZ3NxbF9jbGllbnQoYywgb3B0LCBwaGFzZSkgOgorICAgICAgICAgICAgcGdzcWxfc2VydmVyKGMsIG9wdCwgcGhhc2UpOworICAgIGlmKCFzdHJjYXNlY21wKG9wdC0+cHJvdG9jb2wsICJzbXRwIikpCisgICAgICAgIHJldHVybiBvcHQtPm9wdGlvbi5jbGllbnQgPworICAgICAgICAgICAgc210cF9jbGllbnQoYywgb3B0LCBwaGFzZSkgOgorICAgICAgICAgICAgc210cF9zZXJ2ZXIoYywgb3B0LCBwaGFzZSk7CisgICAgaWYoIXN0cmNhc2VjbXAob3B0LT5wcm90b2NvbCwgInBvcDMiKSkKKyAgICAgICAgcmV0dXJuIG9wdC0+b3B0aW9uLmNsaWVudCA/CisgICAgICAgICAgICBwb3AzX2NsaWVudChjLCBvcHQsIHBoYXNlKSA6CisgICAgICAgICAgICBwb3AzX3NlcnZlcihjLCBvcHQsIHBoYXNlKTsKKyAgICBpZighc3RyY2FzZWNtcChvcHQtPnByb3RvY29sLCAiaW1hcCIpKQorICAgICAgICByZXR1cm4gb3B0LT5vcHRpb24uY2xpZW50ID8KKyAgICAgICAgICAgIGltYXBfY2xpZW50KGMsIG9wdCwgcGhhc2UpIDoKKyAgICAgICAgICAgIGltYXBfc2VydmVyKGMsIG9wdCwgcGhhc2UpOworICAgIGlmKCFzdHJjYXNlY21wKG9wdC0+cHJvdG9jb2wsICJubnRwIikpCisgICAgICAgIHJldHVybiBvcHQtPm9wdGlvbi5jbGllbnQgPworICAgICAgICAgICAgbm50cF9jbGllbnQoYywgb3B0LCBwaGFzZSkgOgorICAgICAgICAgICAgIlRoZSAnbm50cCcgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBpbiBzZXJ2ZXIgbW9kZSI7CisgICAgaWYoIXN0cmNhc2VjbXAob3B0LT5wcm90b2NvbCwgImNvbm5lY3QiKSkKKyAgICAgICAgcmV0dXJuIG9wdC0+b3B0aW9uLmNsaWVudCA/CisgICAgICAgICAgICBjb25uZWN0X2NsaWVudChjLCBvcHQsIHBoYXNlKSA6CisgICAgICAgICAgICBjb25uZWN0X3NlcnZlcihjLCBvcHQsIHBoYXNlKTsKKyAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzb2NrcyAqLworCisvKiBTT0NLUyBvdmVyIFNTTCAoU09DS1MgcHJvdG9jb2wgaXRzZWxmIGlzIGFsc28gZW5jcnlwdGVkKSAqLworLyogRklYTUU6IGNvbm5lY3QoKSBmYWlsdXJlcyBhcmUgbm90IGN1cnJlbnRseSByZXBvcnRlZCB3aXRoIFNPQ0tTIHByb3RvY29sICovCisKK05PRVhQT1JUIGNoYXIgKnNvY2tzX3NlcnZlcihDTEkgKmMsIFNFUlZJQ0VfT1BUSU9OUyAqb3B0LCBjb25zdCBQSEFTRSBwaGFzZSkgeworICAgIHVpbnQ4X3QgdmVyc2lvbjsKKworICAgICh2b2lkKW9wdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNfbG9nKExPR19ERUJVRywgIldhaXRpbmcgZm9yIHRoZSBTT0NLUyByZXF1ZXN0Iik7CisgICAgc19zc2xfcmVhZChjLCAmdmVyc2lvbiwgc2l6ZW9mIHZlcnNpb24pOworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgY2FzZSA0OgorICAgICAgICBzb2NrczRfc2VydmVyKGMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHNvY2tzNV9zZXJ2ZXJfbWV0aG9kKGMpOworICAgICAgICBzb2NrczVfc2VydmVyKGMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzX2xvZyhMT0dfRVJSLCAiVW5zdXBwb3J0ZWQgU09DS1MgdmVyc2lvbiAldSIsIHZlcnNpb24pOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBTT0NLUzQgb3IgU09DS1M0YSAqLworLyogQklORCBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKy8qIFVTRVJJRCBwYXJhbWV0ZXIgaXMgaWdub3JlZCAqLworCitOT0VYUE9SVCB2b2lkIHNvY2tzNF9zZXJ2ZXIoQ0xJICpjKSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCB2biwgY2Q7CisgICAgICAgIHVfc2hvcnQgc2luX3BvcnQ7CisgICAgICAgIHN0cnVjdCBpbl9hZGRyIHNpbl9hZGRyOworICAgIH0gc29ja3M7CisgICAgY2hhciAqdXNlcl9uYW1lLCAqaG9zdF9uYW1lLCAqcG9ydF9uYW1lOworICAgIFNPQ0tBRERSX1VOSU9OIGFkZHI7CisgICAgaW50IGNsb3NlX2Nvbm5lY3Rpb249MTsKKworICAgIHNfc3NsX3JlYWQoYywgJnNvY2tzLmNkLCBzaXplb2Ygc29ja3Mtc2l6ZW9mIHNvY2tzLnZuKTsKKyAgICBzb2Nrcy52bj0wOyAvKiByZXNwb25zZSB2ZXJzaW9uIDAgKi8KKyAgICB1c2VyX25hbWU9c3NsX2dldHN0cmluZyhjKTsgLyogaWdub3JlIHRoZSB1c2VybmFtZSAqLworICAgIHN0cl9mcmVlKHVzZXJfbmFtZSk7CisKKyAgICBpZihzb2Nrcy5jZD09MHgwMSkgeyAvKiBDT05ORUNUICovCisgICAgICAgIGlmKG50b2hsKHNvY2tzLnNpbl9hZGRyLnNfYWRkcik+MCAmJgorICAgICAgICAgICAgICAgIG50b2hsKHNvY2tzLnNpbl9hZGRyLnNfYWRkcik8MjU2KSB7IC8qIDAuMC4wLnggKi8KKyAgICAgICAgICAgIGhvc3RfbmFtZT1zc2xfZ2V0c3RyaW5nKGMpOworICAgICAgICAgICAgcG9ydF9uYW1lPXN0cl9wcmludGYoIiV1IiwgbnRvaHMoc29ja3Muc2luX3BvcnQpKTsKKyAgICAgICAgICAgIGhvc3Rwb3J0MmFkZHJsaXN0KCZjLT5jb25uZWN0X2FkZHIsIGhvc3RfbmFtZSwgcG9ydF9uYW1lKTsKKyAgICAgICAgICAgIHN0cl9mcmVlKHBvcnRfbmFtZSk7CisgICAgICAgICAgICBpZihjLT5jb25uZWN0X2FkZHIubnVtKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJTT0NLUzRhIHJlc29sdmVkIFwiJXNcIiB0byAldSBob3N0KHMpIiwKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9uYW1lLCBjLT5jb25uZWN0X2FkZHIubnVtKTsKKyAgICAgICAgICAgICAgICBzb2Nrcy5jZD05MDsKKyAgICAgICAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uPTA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJTT0NLUzRhIGZhaWxlZCB0byByZXNvbHZlIFwiJXNcIiIsIGhvc3RfbmFtZSk7CisgICAgICAgICAgICAgICAgc29ja3MuY2Q9OTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJfZnJlZShob3N0X25hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLm51bT0xOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHI9c3RyX2FsbG9jKHNpemVvZihTT0NLQUREUl9VTklPTikpOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW4uc2luX2ZhbWlseT1BRl9JTkVUOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW4uc2luX3BvcnQ9c29ja3Muc2luX3BvcnQ7CisgICAgICAgICAgICBjLT5jb25uZWN0X2FkZHIuYWRkclswXS5pbi5zaW5fYWRkci5zX2FkZHI9c29ja3Muc2luX2FkZHIuc19hZGRyOworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJTT0NLUzQgYWRkcmVzcyByZWNlaXZlZCIpOworICAgICAgICAgICAgc29ja3MuY2Q9OTA7CisgICAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uPTA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoc29ja3MuY2Q9PTB4ZjApIHsgLyogUkVTT0xWRSAoYSBUT1IgZXh0ZW5zaW9uKSAqLworICAgICAgICBob3N0X25hbWU9c3NsX2dldHN0cmluZyhjKTsKKyAgICAgICAgaWYoaG9zdHBvcnQyYWRkcigmYWRkciwgaG9zdF9uYW1lLCAiMCIsIDApICYmIGFkZHIuc2Euc2FfZmFtaWx5PT1BRl9JTkVUKSB7CisgICAgICAgICAgICBtZW1jcHkoJnNvY2tzLnNpbl9hZGRyLCAmYWRkci5pbi5zaW5fYWRkciwgNCk7CisgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNPQ0tTNGEvVE9SIHJlc29sdmVkIFwiJXNcIiIsIGhvc3RfbmFtZSk7CisgICAgICAgICAgICBzb2Nrcy5jZD05MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJTT0NLUzRhL1RPUiBmYWlsZWQgdG8gcmVzb2x2ZSBcIiVzXCIiLCBob3N0X25hbWUpOworICAgICAgICAgICAgc29ja3MuY2Q9OTE7CisgICAgICAgIH0KKyAgICAgICAgc3RyX2ZyZWUoaG9zdF9uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiVW5zdXBwb3J0ZWQgU09DS1M0L1NPQ0tTNGEgY29tbWFuZCAldSIsIHNvY2tzLmNkKTsKKyAgICAgICAgc29ja3MuY2Q9OTE7CisgICAgfQorICAgIHNfc3NsX3dyaXRlKGMsICZzb2Nrcywgc2l6ZW9mIHNvY2tzKTsKKyAgICBpZihjbG9zZV9jb25uZWN0aW9uKQorICAgICAgICBsb25nam1wKGMtPmVyciwgMik7IC8qIGRvbid0IHJlc2V0ICovCit9CisKK05PRVhQT1JUIHZvaWQgc29ja3M1X3NlcnZlcl9tZXRob2QoQ0xJICpjKSB7CisgICAgdWludDhfdCBubWV0aG9kcywgKm1ldGhvZHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCB2ZXIsIG1ldGhvZDsKKyAgICB9IHJlc3BvbnNlOworICAgIGludCBpOworCisgICAgcmVzcG9uc2UudmVyPTB4MDU7CisgICAgcmVzcG9uc2UubWV0aG9kPTB4ZmY7IC8qIE5PIEFDQ0VQVEFCTEUgTUVUSE9EUyAqLworICAgIHNfc3NsX3JlYWQoYywgJm5tZXRob2RzLCBzaXplb2Ygbm1ldGhvZHMpOworICAgIG1ldGhvZHM9c3RyX2FsbG9jKG5tZXRob2RzKTsKKyAgICBzX3NzbF9yZWFkKGMsIG1ldGhvZHMsIG5tZXRob2RzKTsKKyAgICBmb3IoaT0wOyBpPG5tZXRob2RzOyArK2kpCisgICAgICAgIGlmKG1ldGhvZHNbaV09PTB4MDApIHsgLyogTk8gQVVUSEVOVElDQVRJT04gUkVRVUlSRUQgKi8KKyAgICAgICAgICAgIHJlc3BvbnNlLm1ldGhvZD0weDAwOyAvKiB1c2UgdGhpcyBtZXRob2QgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgc3RyX2ZyZWUobWV0aG9kcyk7CisgICAgc19zc2xfd3JpdGUoYywgJnJlc3BvbnNlLCBzaXplb2YgcmVzcG9uc2UpOworICAgIGlmKHJlc3BvbnNlLm1ldGhvZCkgeyAvKiByZXF1ZXN0IGZhaWxlZCAqLworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTm8gc3VwcG9ydGVkIFNPQ0tTNSBhdXRoZW50aWNhdGlvbiBtZXRob2QgcmVjZWl2ZWQiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDIpOyAvKiBkb24ndCByZXNldCAqLworICAgIH0KK30KKworLyogQ09OTkVDVCBkb2VzIG5vdCByZXR1cm4gdmFsaWQgQk5ELkFERFIgYW5kIEJORC5QT1JUIHZhbHVlcyAqLworCitOT0VYUE9SVCB2b2lkIHNvY2tzNV9zZXJ2ZXIoQ0xJICpjKSB7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCB2ZXIsIGNtZCwgcnN2LCBhdHlwOworICAgICAgICB9IHJlcTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyLCBjbWQsIHJzdiwgYXR5cCwgYWRkcls0XSwgcG9ydFsyXTsKKyAgICAgICAgfSB2NDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyLCBjbWQsIHJzdiwgYXR5cCwgYWRkclsxNl0sIHBvcnRbMl07CisgICAgICAgIH0gdjY7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHZlciwgcmVwLCByc3YsIGF0eXA7CisgICAgICAgIH0gcmVzcDsKKyAgICB9IHNvY2tzOworICAgIHVpbnQ4X3QgaG9zdF9sZW47CisgICAgY2hhciAqaG9zdF9uYW1lLCAqcG9ydF9uYW1lOworICAgIHVfc2hvcnQgcG9ydF9udW1iZXI7CisgICAgU09DS0FERFJfVU5JT04gYWRkcjsKKyAgICBpbnQgY2xvc2VfY29ubmVjdGlvbj0xOworCisgICAgLyogcGFyc2UgcmVxdWVzdCAqLworICAgIG1lbXNldCgmc29ja3MsIDAsIHNpemVvZiBzb2Nrcyk7CisgICAgc19zc2xfcmVhZChjLCAmc29ja3MsIHNpemVvZiBzb2Nrcy5yZXEpOworICAgIGlmKHNvY2tzLnJlcS52ZXIhPTB4MDUpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkludmFsaWQgU09DS1M1IG1lc3NhZ2UgdmVyc2lvbiAldSIsIHNvY2tzLnJlcS52ZXIpOworICAgICAgICBzb2Nrcy5yZXNwLnZlcj0weDA1OyAvKiByZXNwb25zZSB2ZXJzaW9uIDUgKi8KKyAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMTsgLyogZ2VuZXJhbCBTT0NLUyBzZXJ2ZXIgZmFpbHVyZSAqLworICAgIH0gZWxzZSBpZihzb2Nrcy5yZXEuY21kPT0weDAxKSB7IC8qIENPTk5FQ1QgKi8KKyAgICAgICAgaWYoc29ja3MucmVxLmF0eXA9PTB4MDEpIHsgLyogSVAgdjQgYWRkcmVzcyAqLworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLm51bT0xOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHI9c3RyX2FsbG9jKHNpemVvZihTT0NLQUREUl9VTklPTikpOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW4uc2luX2ZhbWlseT1BRl9JTkVUOworICAgICAgICAgICAgc19zc2xfcmVhZChjLCAmc29ja3MudjQuYWRkciwgNCsyKTsKKyAgICAgICAgICAgIG1lbWNweSgmYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW4uc2luX2FkZHIsICZzb2Nrcy52NC5hZGRyLCA0KTsKKyAgICAgICAgICAgIG1lbWNweSgmYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW4uc2luX3BvcnQsICZzb2Nrcy52NC5wb3J0LCAyKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiU09DS1M1IElQdjQgYWRkcmVzcyByZWNlaXZlZCIpOworICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMDsgLyogc3VjY2VlZGVkICovCisgICAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uPTA7CisgICAgICAgIH0gZWxzZSBpZihzb2Nrcy5yZXEuYXR5cD09MHgwMykgeyAvKiBET01BSU5OQU1FICovCisgICAgICAgICAgICBzX3NzbF9yZWFkKGMsICZob3N0X2xlbiwgc2l6ZW9mIGhvc3RfbGVuKTsKKyAgICAgICAgICAgIGhvc3RfbmFtZT1zdHJfYWxsb2MoKHNpemVfdClob3N0X2xlbisxKTsKKyAgICAgICAgICAgIHNfc3NsX3JlYWQoYywgaG9zdF9uYW1lLCBob3N0X2xlbik7CisgICAgICAgICAgICBob3N0X25hbWVbaG9zdF9sZW5dPSdcMCc7CisgICAgICAgICAgICBzX3NzbF9yZWFkKGMsICZwb3J0X251bWJlciwgMik7CisgICAgICAgICAgICBwb3J0X25hbWU9c3RyX3ByaW50ZigiJXUiLCBudG9ocyhwb3J0X251bWJlcikpOworICAgICAgICAgICAgaG9zdHBvcnQyYWRkcmxpc3QoJmMtPmNvbm5lY3RfYWRkciwgaG9zdF9uYW1lLCBwb3J0X25hbWUpOworICAgICAgICAgICAgc3RyX2ZyZWUocG9ydF9uYW1lKTsKKyAgICAgICAgICAgIGlmKGMtPmNvbm5lY3RfYWRkci5udW0pIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNPQ0tTNSByZXNvbHZlZCBcIiVzXCIgdG8gJXUgaG9zdChzKSIsCisgICAgICAgICAgICAgICAgICAgIGhvc3RfbmFtZSwgYy0+Y29ubmVjdF9hZGRyLm51bSk7CisgICAgICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMDsgLyogc3VjY2VlZGVkICovCisgICAgICAgICAgICAgICAgY2xvc2VfY29ubmVjdGlvbj0wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiU09DS1M1IGZhaWxlZCB0byByZXNvbHZlIFwiJXNcIiIsIGhvc3RfbmFtZSk7CisgICAgICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwNDsgLyogSG9zdCB1bnJlYWNoYWJsZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyX2ZyZWUoaG9zdF9uYW1lKTsKKyNpZmRlZiBVU0VfSVB2NgorICAgICAgICB9IGVsc2UgaWYoc29ja3MucmVxLmF0eXA9PTB4MDQpIHsgLyogSVAgdjYgYWRkcmVzcyAqLworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLm51bT0xOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHI9c3RyX2FsbG9jKHNpemVvZihTT0NLQUREUl9VTklPTikpOworICAgICAgICAgICAgYy0+Y29ubmVjdF9hZGRyLmFkZHJbMF0uaW42LnNpbjZfZmFtaWx5PUFGX0lORVQ2OworICAgICAgICAgICAgc19zc2xfcmVhZChjLCAmc29ja3MudjYuYWRkciwgMTYrMik7CisgICAgICAgICAgICBtZW1jcHkoJmMtPmNvbm5lY3RfYWRkci5hZGRyWzBdLmluNi5zaW42X2FkZHIsICZzb2Nrcy52Ni5hZGRyLCAxNik7CisgICAgICAgICAgICBtZW1jcHkoJmMtPmNvbm5lY3RfYWRkci5hZGRyWzBdLmluNi5zaW42X3BvcnQsICZzb2Nrcy52Ni5wb3J0LCAyKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiU09DS1M1IElQdjYgYWRkcmVzcyByZWNlaXZlZCIpOworICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMDsgLyogc3VjY2VlZGVkICovCisgICAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uPTA7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJVbnN1cHBvcnRlZCBTT0NLUzUgYWRkcmVzcyB0eXBlICV1Iiwgc29ja3MucmVxLmF0eXApOworICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwNzsgLyogQWRkcmVzcyB0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZihzb2Nrcy5yZXEuY21kPT0weGYwKSB7IC8qIFJFU09MVkUgKGEgVE9SIGV4dGVuc2lvbikgKi8KKyAgICAgICAgaG9zdF9uYW1lPXNzbF9nZXRzdHJpbmcoYyk7CisgICAgICAgIGlmKGhvc3Rwb3J0MmFkZHIoJmFkZHIsIGhvc3RfbmFtZSwgIjAiLCAwKSkgeworICAgICAgICAgICAgaWYoYWRkci5zYS5zYV9mYW1pbHk9PUFGX0lORVQpIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNPQ0tTNS9UT1IgcmVzb2x2ZWQgXCIlc1wiIHRvIElQdjQiLCBob3N0X25hbWUpOworICAgICAgICAgICAgICAgIG1lbWNweSgmc29ja3MudjQuYWRkciwgJmFkZHIuaW4uc2luX2FkZHIsIDQpOworICAgICAgICAgICAgICAgIHNvY2tzLnJlc3AuYXR5cD0weDAxOyAvKiBJUCB2NCBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMDsgLyogc3VjY2VlZGVkICovCisjaWZkZWYgVVNFX0lQdjYKKyAgICAgICAgICAgIH0gZWxzZSBpZihhZGRyLnNhLnNhX2ZhbWlseT09QUZfSU5FVDYpIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlNPQ0tTNS9UT1IgcmVzb2x2ZWQgXCIlc1wiIHRvIElQdjYiLCBob3N0X25hbWUpOworICAgICAgICAgICAgICAgIG1lbWNweSgmc29ja3MudjYuYWRkciwgJmFkZHIuaW42LnNpbjZfYWRkciwgMTYpOworICAgICAgICAgICAgICAgIHNvY2tzLnJlc3AuYXR5cD0weDA0OyAvKiBJUCB2NiBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwMDsgLyogc3VjY2VlZGVkICovCisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIlNPQ0tTNS9UT1IgdW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkgZm9yIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGhvc3RfbmFtZSk7CisgICAgICAgICAgICAgICAgc29ja3MucmVzcC5yZXA9MHgwNDsgLyogSG9zdCB1bnJlYWNoYWJsZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIlNPQ0tTNS9UT1IgZmFpbGVkIHRvIHJlc29sdmUgXCIlc1wiIiwgaG9zdF9uYW1lKTsKKyAgICAgICAgICAgIHNvY2tzLnJlc3AucmVwPTB4MDQ7IC8qIEhvc3QgdW5yZWFjaGFibGUgKi8KKyAgICAgICAgfQorICAgICAgICBzdHJfZnJlZShob3N0X25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbnN1cHBvcnRlZCBTT0NLUzUgY29tbWFuZCAldSIsIHNvY2tzLnJlcS5jbWQpOworICAgICAgICBzb2Nrcy5yZXNwLnJlcD0weDA3OyAvKiBDb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICB9CisKKyAgICAvKiBzZW5kIHJlc3BvbnNlICovCisgICAgLyogYnJva2VuIGNsaWVudHMgdGVuZCB0byBleHBlY3QgdGhlIHNhbWUgYWRkcmVzcyBmYW1pbHkgZm9yIHJlc3BvbnNlLAorICAgICAqIHNvIHN0dW5uZWwgdHJpZXMgdG8gcHJlc2VydmUgdGhlIGFkZHJlc3MgZmFtaWx5IGlmIHBvc3NpYmxlICovCisgICAgaWYoc29ja3MucmVzcC5hdHlwPT0weDA0KSB7IC8qIElQIFY2IGFkZHJlc3MgKi8KKyAgICAgICAgc19zc2xfd3JpdGUoYywgJnNvY2tzLCBzaXplb2Ygc29ja3MudjYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tzLnJlc3AuYXR5cD0weDAxOyAvKiBJUCB2NCBhZGRyZXNzICovCisgICAgICAgIHNfc3NsX3dyaXRlKGMsICZzb2Nrcywgc2l6ZW9mIHNvY2tzLnY0KTsKKyAgICB9CisgICAgaWYoY2xvc2VfY29ubmVjdGlvbikgLyogcmVxdWVzdCBmYWlsZWQgKi8KKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDIpOyAvKiBkb24ndCByZXNldCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm94eSAqLworCisvKgorICogUFJPWFkgcHJvdG9jb2w6IGh0dHA6Ly9oYXByb3h5LjF3dC5ldS9kb3dubG9hZC8xLjUvZG9jL3Byb3h5LXByb3RvY29sLnR4dAorICogdGhpcyBpcyBhIHByb3RvY29sIGNsaWVudCBzdXBwb3J0IGZvciBzdHVubmVsIGFjdGluZyBhcyBhbiBTU0wgc2VydmVyCisgKiBJIGRvbid0IHRoaW5rIGFueXRoaW5nIGVsc2UgaXMgdXNlZnVsLCBidXQgZmVlbCBmcmVlIHRvIGRpc2N1c3Mgb24gdGhlCisgKiBzdHVubmVsLXVzZXJzIG1haWxpbmcgbGlzdCBpZiB5b3UgZGlzYWdyZWUKKyAqLworCisvKiBJUCBhZGRyZXNzIHRleHR1YWwgcmVwcmVzZW50YXRpb24gbGVuZ3RoICovCisvKiAxMjM0OjY3ODk6MTIzNDo2Nzg5OjEyMzQ6Njc4OToxMjM0OjY3ODkgLT4gNDAgY2hhcnMgd2l0aCAnXDAnICovCisjZGVmaW5lIElQX0xFTiA0MAorI2RlZmluZSBQT1JUX0xFTiA2CisKK05PRVhQT1JUIGNoYXIgKnByb3h5X3NlcnZlcihDTEkgKmMsIFNFUlZJQ0VfT1BUSU9OUyAqb3B0LCBjb25zdCBQSEFTRSBwaGFzZSkgeworICAgIFNPQ0tBRERSX1VOSU9OIGFkZHI7CisgICAgc29ja2xlbl90IGFkZHJsZW47CisgICAgY2hhciBzcmNfaG9zdFtJUF9MRU5dLCBkc3RfaG9zdFtJUF9MRU5dOworICAgIGNoYXIgc3JjX3BvcnRbUE9SVF9MRU5dLCBkc3RfcG9ydFtQT1JUX0xFTl0sICpwcm90bzsKKyAgICBpbnQgZXJyOworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlIT1QUk9UT0NPTF9MQVRFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhZGRybGVuPXNpemVvZiBhZGRyOworICAgIGlmKGdldHBlZXJuYW1lKGMtPmxvY2FsX3JmZC5mZCwgJmFkZHIuc2EsICZhZGRybGVuKSkgeworICAgICAgICBzb2NrZXJyb3IoImdldHBlZXJuYW1lIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgZXJyPWdldG5hbWVpbmZvKCZhZGRyLnNhLCBhZGRyX2xlbigmYWRkciksIHNyY19ob3N0LCBJUF9MRU4sCisgICAgICAgIHNyY19wb3J0LCBQT1JUX0xFTiwgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworICAgIGlmKGVycikgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiZ2V0bmFtZWluZm86ICVzIiwgc19nYWlfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisKKyAgICBhZGRybGVuPXNpemVvZiBhZGRyOworICAgIGlmKGdldHNvY2tuYW1lKGMtPmxvY2FsX3JmZC5mZCwgJmFkZHIuc2EsICZhZGRybGVuKSkgeworICAgICAgICBzb2NrZXJyb3IoImdldHNvY2tuYW1lIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgZXJyPWdldG5hbWVpbmZvKCZhZGRyLnNhLCBhZGRyX2xlbigmYWRkciksIGRzdF9ob3N0LCBJUF9MRU4sCisgICAgICAgIGRzdF9wb3J0LCBQT1JUX0xFTiwgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworICAgIGlmKGVycikgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiZ2V0bmFtZWluZm86ICVzIiwgc19nYWlfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisKKyAgICBzd2l0Y2goYWRkci5zYS5zYV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHByb3RvPSJUQ1A0IjsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVVNFX0lQdjYKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBwcm90bz0iVENQNiI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDogLyogQUZfVU5JWCAqLworICAgICAgICBwcm90bz0iVU5LTk9XTiI7CisgICAgfQorICAgIGZkX3ByaW50ZihjLCBjLT5yZW1vdGVfZmQuZmQsICJQUk9YWSAlcyAlcyAlcyAlcyAlcyIsCisgICAgICAgIHByb3RvLCBzcmNfaG9zdCwgZHN0X2hvc3QsIHNyY19wb3J0LCBkc3RfcG9ydCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNpZnMgKi8KKworTk9FWFBPUlQgY2hhciAqY2lmc19jbGllbnQoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICB1aW50OF90IGJ1ZmZlcls1XTsKKyAgICB1aW50OF90IHJlcXVlc3RfZHVtbXlbNF0gPSB7MHg4MSwgMCwgMCwgMH07IC8qIGEgemVyby1sZW5ndGggcmVxdWVzdCAqLworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlIT1QUk9UT0NPTF9NSURETEUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfd3JpdGUoYywgYy0+cmVtb3RlX2ZkLmZkLCByZXF1ZXN0X2R1bW15LCA0KTsKKyAgICBzX3JlYWQoYywgYy0+cmVtb3RlX2ZkLmZkLCBidWZmZXIsIDUpOworICAgIGlmKGJ1ZmZlclswXSE9MHg4MykgeyAvKiBOQl9TU05fTkVHUkVTUCAqLworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTmVnYXRpdmUgcmVzcG9uc2UgZXhwZWN0ZWQiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBpZihidWZmZXJbMl0hPTAgfHwgYnVmZmVyWzNdIT0xKSB7IC8qIGxlbmd0aCAhPSAxICovCisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIE5ldEJJT1MgcmVzcG9uc2Ugc2l6ZSIpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIGlmKGJ1ZmZlcls0XSE9MHg4ZSkgeyAvKiB1c2UgU1NMICovCisgICAgICAgIHNfbG9nKExPR19FUlIsICJSZW1vdGUgc2VydmVyIGRvZXMgbm90IHJlcXVpcmUgU1NMIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK05PRVhQT1JUIGNoYXIgKmNpZnNfc2VydmVyKENMSSAqYywgU0VSVklDRV9PUFRJT05TICpvcHQsIGNvbnN0IFBIQVNFIHBoYXNlKSB7CisgICAgdWludDhfdCBidWZmZXJbMTI4XTsKKyAgICB1aW50OF90IHJlc3BvbnNlX2FjY2Vzc19kZW5pZWRbNV0gPSB7MHg4MywgMCwgMCwgMSwgMHg4MX07CisgICAgdWludDhfdCByZXNwb25zZV91c2Vfc3NsWzVdID0gezB4ODMsIDAsIDAsIDEsIDB4OGV9OworICAgIHVpbnQxNl90IGxlbjsKKworICAgICh2b2lkKW9wdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfRUFSTFkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfcmVhZChjLCBjLT5sb2NhbF9yZmQuZmQsIGJ1ZmZlciwgNCkgOy8qIE5ldEJJT1MgaGVhZGVyICovCisgICAgbGVuPSh1aW50MTZfdCkoKCh1aW50MTZfdCkoYnVmZmVyWzJdKTw8OCl8YnVmZmVyWzNdKTsKKyAgICBpZihsZW4+c2l6ZW9mIGJ1ZmZlci00KSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJSZWNlaXZlZCBibG9jayB0b28gbG9uZyIpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHNfcmVhZChjLCBjLT5sb2NhbF9yZmQuZmQsIGJ1ZmZlcis0LCBsZW4pOworICAgIGlmKGJ1ZmZlclswXSE9MHg4MSkgeyAvKiBOQl9TU05fUkVRVUVTVCAqLworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiQ2xpZW50IGRpZCBub3Qgc2VuZCBzZXNzaW9uIHNldHVwIik7CisgICAgICAgIHNfd3JpdGUoYywgYy0+bG9jYWxfd2ZkLmZkLCByZXNwb25zZV9hY2Nlc3NfZGVuaWVkLCA1KTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBzX3dyaXRlKGMsIGMtPmxvY2FsX3dmZC5mZCwgcmVzcG9uc2VfdXNlX3NzbCwgNSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHBnc3FsICovCisKKy8qIGh0dHA6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy84LjMvc3RhdGljL3Byb3RvY29sLWZsb3cuaHRtbCNBRU43Mzk4MiAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3NsX3JlcXVlc3RbOF09ezAsIDAsIDAsIDgsIDB4MDQsIDB4ZDIsIDB4MTYsIDB4MmZ9OworCitOT0VYUE9SVCBjaGFyICpwZ3NxbF9jbGllbnQoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICB1aW50OF90IGJ1ZmZlclsxXTsKKworICAgICh2b2lkKW9wdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX3dyaXRlKGMsIGMtPnJlbW90ZV9mZC5mZCwgc3NsX3JlcXVlc3QsIHNpemVvZiBzc2xfcmVxdWVzdCk7CisgICAgc19yZWFkKGMsIGMtPnJlbW90ZV9mZC5mZCwgYnVmZmVyLCAxKTsKKyAgICAvKiBTIC0gYWNjZXB0ZWQsIE4gLSByZWplY3RlZCwgbm9uLVNTTCBwcmVmZXJyZWQgKi8KKyAgICBpZihidWZmZXJbMF0hPSdTJykgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiUG9zdGdyZVNRTCBzZXJ2ZXIgcmVqZWN0ZWQgU1NMIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK05PRVhQT1JUIGNoYXIgKnBnc3FsX3NlcnZlcihDTEkgKmMsIFNFUlZJQ0VfT1BUSU9OUyAqb3B0LCBjb25zdCBQSEFTRSBwaGFzZSkgeworICAgIHVpbnQ4X3QgYnVmZmVyWzhdLCBzc2xfb2tbMV09eydTJ307CisKKyAgICAodm9pZClvcHQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgaWYocGhhc2UhPVBST1RPQ09MX0VBUkxZKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YgYnVmZmVyKTsKKyAgICBzX3JlYWQoYywgYy0+bG9jYWxfcmZkLmZkLCBidWZmZXIsIHNpemVvZiBidWZmZXIpOworICAgIGlmKHNhZmVfbWVtY21wKGJ1ZmZlciwgc3NsX3JlcXVlc3QsIHNpemVvZiBzc2xfcmVxdWVzdCkpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlBvc3RncmVTUUwgY2xpZW50IGRpZCBub3QgcmVxdWVzdCBTU0wsIHJlamVjdGluZyIpOworICAgICAgICAvKiBubyB3YXkgdG8gc2VuZCBlcnJvciBvbiBzdGFydHVwLCBzbyBqdXN0IGRyb3AgdGhlIGNsaWVudCAqLworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHNfd3JpdGUoYywgYy0+bG9jYWxfd2ZkLmZkLCBzc2xfb2ssIHNpemVvZiBzc2xfb2spOworICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzbXRwICovCisKK05PRVhQT1JUIGNoYXIgKnNtdHBfY2xpZW50KENMSSAqYywgU0VSVklDRV9PUFRJT05TICpvcHQsIGNvbnN0IFBIQVNFIHBoYXNlKSB7CisgICAgY2hhciAqbGluZTsKKworICAgICh2b2lkKW9wdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsaW5lPXN0cl9kdXAoIiIpOworICAgIGRvIHsgLyogY29weSBtdWx0aWxpbmUgZ3JlZXRpbmcgKi8KKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgbGluZSk7CisgICAgfSB3aGlsZShpc19wcmVmaXgobGluZSwgIjIyMC0iKSk7CisKKyAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgIkVITE8gbG9jYWxob3N0Iik7CisgICAgZG8geyAvKiBza2lwIG11bHRpbGluZSByZXBseSAqLworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgfSB3aGlsZShpc19wcmVmaXgobGluZSwgIjI1MC0iKSk7CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAiMjUwICIpKSB7IC8qIGVycm9yICovCisgICAgICAgIHNfbG9nKExPR19FUlIsICJSZW1vdGUgc2VydmVyIGlzIG5vdCBSRkMgMTQyNSBjb21wbGlhbnQiKTsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisKKyAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgIlNUQVJUVExTIik7CisgICAgZG8geyAvKiBza2lwIG11bHRpbGluZSByZXBseSAqLworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgfSB3aGlsZShpc19wcmVmaXgobGluZSwgIjIyMC0iKSk7CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAiMjIwICIpKSB7IC8qIGVycm9yICovCisgICAgICAgIHNfbG9nKExPR19FUlIsICJSZW1vdGUgc2VydmVyIGlzIG5vdCBSRkMgMjQ4NyBjb21wbGlhbnQiKTsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK05PRVhQT1JUIGNoYXIgKnNtdHBfc2VydmVyKENMSSAqYywgU0VSVklDRV9PUFRJT05TICpvcHQsIGNvbnN0IFBIQVNFIHBoYXNlKSB7CisgICAgY2hhciAqbGluZSwgKmRvbWFpbiwgKmdyZWV0aW5nOworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlPT1QUk9UT0NPTF9DSEVDSykKKyAgICAgICAgb3B0LT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsPTE7IC8qIGMtPnJlbW90ZV9mZCBuZWVkZWQgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGRldGVjdCBSRkMgMjQ4NyAqLworICAgIHNfcG9sbF9pbml0KGMtPmZkcyk7CisgICAgc19wb2xsX2FkZChjLT5mZHMsIGMtPmxvY2FsX3JmZC5mZCwgMSwgMCk7CisgICAgc3dpdGNoKHNfcG9sbF93YWl0KGMtPmZkcywgMCwgMjAwKSkgeyAvKiB3YWl0IHVwIHRvIDIwMG1zICovCisgICAgY2FzZSAwOiAvKiBmZCBub3QgcmVhZHkgdG8gcmVhZCAqLworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJSRkMgMjQ4NyBkZXRlY3RlZCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIGZkIHJlYWR5IHRvIHJlYWQgKi8KKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiUkZDIDI0ODcgbm90IGRldGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOyAvKiByZXR1cm4gaWYgUkZDIDI0ODcgaXMgbm90IHVzZWQgKi8KKyAgICBkZWZhdWx0OiAvKiAtMSAqLworICAgICAgICBzb2NrZXJyb3IoIlJGQzI0ODcgKHNfcG9sbF93YWl0KSIpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorCisgICAgLyogcHJvY2VzcyBzZXJ2ZXIncyBncmVldGluZyAqLworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIGlmKCEoaXNfcHJlZml4KGxpbmUsICIyMjAgIikgfHwgaXNfcHJlZml4KGxpbmUsICIyMjAtIikpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmtub3duIHNlcnZlciB3ZWxjb21lIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIGRvbWFpbj1zdHJfZHVwKGxpbmUrNCk7IC8qIHNraXAgIjIyMCIgYW5kIHRoZSBzZXBhcmF0b3IgKi8KKyAgICBsaW5lWzRdPSdcMCc7ICAgICAvKiBvbmx5IGxlYXZlICIyMjAiIGFuZCB0aGUgc2VwYXJhdG9yICovCisgICAgZ3JlZXRpbmc9c3RyY2hyKGRvbWFpbiwgJyAnKTsKKyAgICBpZihncmVldGluZykgeworICAgICAgICAqZ3JlZXRpbmcrKz0nXDAnOyAvKiB0cnVuY2F0ZSBhbnl0aGluZyBhZnRlciB0aGUgZG9tYWluIG5hbWUgKi8KKyAgICAgICAgZmRfcHJpbnRmKGMsIGMtPmxvY2FsX3dmZC5mZCwgIiVzJXMgc3R1bm5lbCBmb3IgJXMiLAorICAgICAgICAgICAgbGluZSwgZG9tYWluLCBncmVldGluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmRfcHJpbnRmKGMsIGMtPmxvY2FsX3dmZC5mZCwgIiVzJXMgc3R1bm5lbCIsIGxpbmUsIGRvbWFpbik7CisgICAgfQorICAgIHdoaWxlKGlzX3ByZWZpeChsaW5lLCAiMjIwLSIpKSB7IC8qIGNvcHkgbXVsdGlsaW5lIGdyZWV0aW5nICovCisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsIGxpbmUpOworICAgIH0KKyAgICBzdHJfZnJlZShsaW5lKTsKKworICAgIC8qIHByb2Nlc3MgY2xpZW50J3MgRUhMTyAqLworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5sb2NhbF9yZmQuZmQpOworICAgIGlmKCFpc19wcmVmaXgobGluZSwgIkVITE8gIikpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlVua25vd24gY2xpZW50IEVITE8iKTsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIHN0cl9mcmVlKGRvbWFpbik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgZmRfcHJpbnRmKGMsIGMtPmxvY2FsX3dmZC5mZCwgIjI1MC0lcyIsIGRvbWFpbik7CisgICAgc3RyX2ZyZWUoZG9tYWluKTsKKyAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIjI1MCBTVEFSVFRMUyIpOworCisgICAgLyogcHJvY2VzcyBjbGllbnQncyBTVEFSVFRMUyAqLworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5sb2NhbF9yZmQuZmQpOworICAgIGlmKCFpc19wcmVmaXgobGluZSwgIlNUQVJUVExTIikpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlNUQVJUVExTIGV4cGVjdGVkIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiMjIwIEdvIGFoZWFkIik7CisgICAgc3RyX2ZyZWUobGluZSk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcG9wMyAqLworCitOT0VYUE9SVCBjaGFyICpwb3AzX2NsaWVudChDTEkgKmMsIFNFUlZJQ0VfT1BUSU9OUyAqb3B0LCBjb25zdCBQSEFTRSBwaGFzZSkgeworICAgIGNoYXIgKmxpbmU7CisKKyAgICAodm9pZClvcHQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgaWYocGhhc2UhPVBST1RPQ09MX01JRERMRSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAiK09LICIpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmtub3duIHNlcnZlciB3ZWxjb21lIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCBsaW5lKTsKKyAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgIlNUTFMiKTsKKyAgICBzdHJfZnJlZShsaW5lKTsKKyAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICBpZighaXNfcHJlZml4KGxpbmUsICIrT0sgIikpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFRMUyIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBzdHJfZnJlZShsaW5lKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTk9FWFBPUlQgY2hhciAqcG9wM19zZXJ2ZXIoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICBjaGFyICpsaW5lOworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlPT1QUk9UT0NPTF9DSEVDSykKKyAgICAgICAgb3B0LT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsPTE7IC8qIGMtPnJlbW90ZV9mZCBuZWVkZWQgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICBmZF9wcmludGYoYywgYy0+bG9jYWxfd2ZkLmZkLCAiJXMgKyBzdHVubmVsIiwgbGluZSk7CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPmxvY2FsX3JmZC5mZCk7CisgICAgaWYoaXNfcHJlZml4KGxpbmUsICJDQVBBIikpIHsgLyogY2xpZW50IHdhbnRzIFJGQyAyNDQ5IGV4dGVuc2lvbnMgKi8KKyAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIrT0sgU3R1bm5lbCBjYXBhYmlsaXR5IGxpc3QgZm9sbG93cyIpOworICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIlNUTFMiKTsKKyAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIuIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+bG9jYWxfcmZkLmZkKTsKKyAgICB9CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAiU1RMUyIpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJDbGllbnQgZG9lcyBub3Qgd2FudCBUTFMiKTsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIrT0sgU3R1bm5lbCBzdGFydHMgVExTIG5lZ290aWF0aW9uIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGltYXAgKi8KKworTk9FWFBPUlQgY2hhciAqaW1hcF9jbGllbnQoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICBjaGFyICpsaW5lOworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlIT1QUk9UT0NPTF9NSURETEUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIGlmKCFpc19wcmVmaXgobGluZSwgIiogT0siKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiVW5rbm93biBzZXJ2ZXIgd2VsY29tZSIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgbGluZSk7CisgICAgZmRfcHV0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQsICJzdHVubmVsIFNUQVJUVExTIik7CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAic3R1bm5lbCBPSyIpKSB7CisgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLAorICAgICAgICAgICAgIiogQllFIHN0dW5uZWw6IFNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFRMUyIpOworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgVExTIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMik7IC8qIGRvbid0IHJlc2V0ICovCisgICAgfQorICAgIHN0cl9mcmVlKGxpbmUpOworICAgIHJldHVybiBOVUxMOworfQorCitOT0VYUE9SVCBjaGFyICppbWFwX3NlcnZlcihDTEkgKmMsIFNFUlZJQ0VfT1BUSU9OUyAqb3B0LCBjb25zdCBQSEFTRSBwaGFzZSkgeworICAgIGNoYXIgKmxpbmUsICppZCwgKnRhaWwsICpjYXBhOworCisgICAgKHZvaWQpb3B0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKHBoYXNlPT1QUk9UT0NPTF9DSEVDSykKKyAgICAgICAgb3B0LT5vcHRpb24uY29ubmVjdF9iZWZvcmVfc3NsPTE7IC8qIGMtPnJlbW90ZV9mZCBuZWVkZWQgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX3BvbGxfaW5pdChjLT5mZHMpOworICAgIHNfcG9sbF9hZGQoYy0+ZmRzLCBjLT5sb2NhbF9yZmQuZmQsIDEsIDApOworICAgIHN3aXRjaChzX3BvbGxfd2FpdChjLT5mZHMsIDAsIDIwMCkpIHsKKyAgICBjYXNlIDA6IC8qIGZkIG5vdCByZWFkeSB0byByZWFkICovCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlJGQyAyNTk1IGRldGVjdGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogZmQgcmVhZHkgdG8gcmVhZCAqLworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJSRkMgMjU5NSBub3QgZGV0ZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIHJldHVybiBpZiBSRkMgMjU5NSBpcyBub3QgdXNlZCAqLworICAgIGRlZmF1bHQ6IC8qIC0xICovCisgICAgICAgIHNvY2tlcnJvcigiUkZDMjU5NSAoc19wb2xsX3dhaXQpIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHNlcnZlciB3ZWxjb21lIGFuZCBzZW5kIGl0IHRvIGNsaWVudCAqLworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIGlmKCFpc19wcmVmaXgobGluZSwgIiogT0siKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiVW5rbm93biBzZXJ2ZXIgd2VsY29tZSIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBjYXBhPXN0cnN0cihsaW5lLCAiQ0FQQUJJTElUWSIpOworICAgIGlmKCFjYXBhKQorICAgICAgICBjYXBhPXN0cnN0cihsaW5lLCAiY2FwYWJpbGl0eSIpOworICAgIGlmKGNhcGEpCisgICAgICAgICpjYXBhPSdLJzsgLyogZGlzYWJsZSBDQVBBQklMSVRZIHdpdGhpbiBncmVldGluZyAqLworICAgIGZkX3ByaW50ZihjLCBjLT5sb2NhbF93ZmQuZmQsICIlcyAoc3R1bm5lbCkiLCBsaW5lKTsKKworICAgIGlkPXN0cl9kdXAoIiIpOworICAgIHdoaWxlKDEpIHsgLyogcHJvY2VzcyBjbGllbnQgY29tbWFuZHMgKi8KKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5sb2NhbF9yZmQuZmQpOworICAgICAgICAvKiBzcGxpdCBsaW5lIGludG8gaWQgYW5kIHRhaWwgKi8KKyAgICAgICAgc3RyX2ZyZWUoaWQpOworICAgICAgICBpZD1zdHJfZHVwKGxpbmUpOworICAgICAgICB0YWlsPXN0cmNocihpZCwgJyAnKTsKKyAgICAgICAgaWYoIXRhaWwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKnRhaWwrKz0nXDAnOworCisgICAgICAgIGlmKGlzX3ByZWZpeCh0YWlsLCAiU1RBUlRUTFMiKSkgeworICAgICAgICAgICAgZmRfcHJpbnRmKGMsIGMtPmxvY2FsX3dmZC5mZCwKKyAgICAgICAgICAgICAgICAiJXMgT0sgQmVnaW4gVExTIG5lZ290aWF0aW9uIG5vdyIsIGlkKTsKKyAgICAgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICAgICAgc3RyX2ZyZWUoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgfSBlbHNlIGlmKGlzX3ByZWZpeCh0YWlsLCAiQ0FQQUJJTElUWSIpKSB7CisgICAgICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgbGluZSk7IC8qIHNlbmQgaXQgdG8gc2VydmVyICovCisgICAgICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOyAvKiBnZXQgdGhlIGNhcGFiaWxpdGVzICovCisgICAgICAgICAgICBpZigqbGluZT09JyonKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBhcHBlbmQgU1RBUlRUTFMKKyAgICAgICAgICAgICAgICAgKiBzaG91bGQgYWxzbyBhZGQgTE9HSU5ESVNBQkxFRCwgYnV0IGNhbid0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiBvZiBNb3ppbGxhIGJ1ZyAjMzI0MTM4LyMzMTIwMDkKKyAgICAgICAgICAgICAgICAgKiBMT0dJTiB3b3VsZCBmYWlsIGFzICJ1bmV4cGVjdGVkIGNvbW1hbmQiLCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmZF9wcmludGYoYywgYy0+bG9jYWxfd2ZkLmZkLCAiJXMgU1RBUlRUTFMiLCBsaW5lKTsKKyAgICAgICAgICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgICAgICAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+cmVtb3RlX2ZkLmZkKTsgLyogbmV4dCBsaW5lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgbGluZSk7IC8qIGZvcndhcmQgdG8gdGhlIGNsaWVudCAqLworICAgICAgICAgICAgdGFpbD1zdHJjaHIobGluZSwgJyAnKTsKKyAgICAgICAgICAgIGlmKCF0YWlsIHx8ICFpc19wcmVmaXgodGFpbCsxLCAiT0siKSkgeyAvKiBub3QgT0s/ICovCisgICAgICAgICAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsCisgICAgICAgICAgICAgICAgICAgICIqIEJZRSB1bmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSIpOworICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZTogJXMiLCBsaW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKGlzX3ByZWZpeCh0YWlsLCAiTE9HT1VUIikpIHsKKyAgICAgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiKiBCWUUgc2VydmVyIHRlcm1pbmF0aW5nIik7CisgICAgICAgICAgICBmZF9wcmludGYoYywgYy0+bG9jYWxfd2ZkLmZkLCAiJXMgT0sgTE9HT1VUIGNvbXBsZXRlZCIsIGlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIqIEJZRSBzdHVubmVsOiB1bmV4cGVjdGVkIGNvbW1hbmQiKTsKKyAgICAgICAgICAgIGZkX3ByaW50ZihjLCBjLT5sb2NhbF93ZmQuZmQsICIlcyBCQUQgJXMgdW5leHBlY3RlZCIsIGlkLCB0YWlsKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIGNsaWVudCBjb21tYW5kICVzIiwgdGFpbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBjbGVhbiBzZXJ2ZXIgc2h1dGRvd24gKi8KKyAgICBzdHJfZnJlZShpZCk7CisgICAgZmRfcHV0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQsICJzdHVubmVsIExPR09VVCIpOworICAgIHN0cl9mcmVlKGxpbmUpOworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIGlmKCpsaW5lPT0nKicpIHsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIH0KKyAgICBzdHJfZnJlZShsaW5lKTsKKyAgICBsb25nam1wKGMtPmVyciwgMik7IC8qIGRvbid0IHJlc2V0ICovCisgICAgcmV0dXJuIE5VTEw7IC8qIHNvbWUgQyBjb21waWxlcnMgcmVxdWlyZSBhIHJldHVybiB2YWx1ZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBubnRwICovCisKK05PRVhQT1JUIGNoYXIgKm5udHBfY2xpZW50KENMSSAqYywgU0VSVklDRV9PUFRJT05TICpvcHQsIGNvbnN0IFBIQVNFIHBoYXNlKSB7CisgICAgY2hhciAqbGluZTsKKworICAgICh2b2lkKW9wdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihwaGFzZSE9UFJPVE9DT0xfTUlERExFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsaW5lPWZkX2dldGxpbmUoYywgYy0+cmVtb3RlX2ZkLmZkKTsKKyAgICBpZighaXNfcHJlZml4KGxpbmUsICIyMDAgIikgJiYgIWlzX3ByZWZpeChsaW5lLCAiMjAxICIpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmtub3duIHNlcnZlciB3ZWxjb21lIik7CisgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCBsaW5lKTsKKyAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgIlNUQVJUVExTIik7CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgaWYoIWlzX3ByZWZpeChsaW5lLCAiMzgyICIpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBUTFMiKTsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNvbm5lY3QgKi8KKworTk9FWFBPUlQgY2hhciAqY29ubmVjdF9zZXJ2ZXIoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICBjaGFyICpyZXF1ZXN0LCAqcHJvdG8sICpoZWFkZXI7CisKKyAgICAodm9pZClvcHQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgaWYocGhhc2UhPVBST1RPQ09MX0VBUkxZKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXF1ZXN0PWZkX2dldGxpbmUoYywgYy0+bG9jYWxfcmZkLmZkKTsKKyAgICBpZighaXNfcHJlZml4KHJlcXVlc3QsICJDT05ORUNUICIpKSB7CisgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiSFRUUC8xLjAgNDAwIEJhZCBSZXF1ZXN0IE1ldGhvZCIpOworICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIlNlcnZlcjogc3R1bm5lbC8iIFNUVU5ORUxfVkVSU0lPTik7CisgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiIik7CisgICAgICAgIHN0cl9mcmVlKHJlcXVlc3QpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgIHByb3RvPXN0cmNocihyZXF1ZXN0KzgsICcgJyk7CisgICAgaWYoIXByb3RvIHx8ICFpc19wcmVmaXgocHJvdG8sICIgSFRUUC8iKSkgeworICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIkhUVFAvMS4wIDQwMCBCYWQgUmVxdWVzdCBQcm90b2NvbCIpOworICAgICAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIlNlcnZlcjogc3R1bm5lbC8iIFNUVU5ORUxfVkVSU0lPTik7CisgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiIik7CisgICAgICAgIHN0cl9mcmVlKHJlcXVlc3QpOworICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgfQorICAgICpwcm90bz0nXDAnOworCisgICAgaGVhZGVyPXN0cl9kdXAoIiIpOworICAgIGRvIHsgLyogaWdub3JlIGFueSBoZWFkZXJzICovCisgICAgICAgIHN0cl9mcmVlKGhlYWRlcik7CisgICAgICAgIGhlYWRlcj1mZF9nZXRsaW5lKGMsIGMtPmxvY2FsX3JmZC5mZCk7CisgICAgfSB3aGlsZSgqaGVhZGVyKTsgLyogbm90IGVtcHR5ICovCisgICAgc3RyX2ZyZWUoaGVhZGVyKTsKKworICAgIGlmKCFuYW1lMmFkZHJsaXN0KCZjLT5jb25uZWN0X2FkZHIsIHJlcXVlc3QrOCkpIHsKKyAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICJIVFRQLzEuMCA0MDQgTm90IEZvdW5kIik7CisgICAgICAgIGZkX3B1dGxpbmUoYywgYy0+bG9jYWxfd2ZkLmZkLCAiU2VydmVyOiBzdHVubmVsLyIgU1RVTk5FTF9WRVJTSU9OKTsKKyAgICAgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIiKTsKKyAgICAgICAgc3RyX2ZyZWUocmVxdWVzdCk7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgc3RyX2ZyZWUocmVxdWVzdCk7CisgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICJIVFRQLzEuMCAyMDAgT0siKTsKKyAgICBmZF9wdXRsaW5lKGMsIGMtPmxvY2FsX3dmZC5mZCwgIlNlcnZlcjogc3R1bm5lbC8iIFNUVU5ORUxfVkVSU0lPTik7CisgICAgZmRfcHV0bGluZShjLCBjLT5sb2NhbF93ZmQuZmQsICIiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTk9FWFBPUlQgY2hhciAqY29ubmVjdF9jbGllbnQoQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UgcGhhc2UpIHsKKyAgICBjaGFyICpsaW5lLCAqZW5jb2RlZDsKKworICAgIGlmKHBoYXNlIT1QUk9UT0NPTF9NSURETEUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmKCFvcHQtPnByb3RvY29sX2hvc3QpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgInByb3RvY29sSG9zdCBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIGxvbmdqbXAoYy0+ZXJyLCAxKTsKKyAgICB9CisgICAgZmRfcHJpbnRmKGMsIGMtPnJlbW90ZV9mZC5mZCwgIkNPTk5FQ1QgJXMgSFRUUC8xLjEiLAorICAgICAgICBvcHQtPnByb3RvY29sX2hvc3QpOworICAgIGZkX3ByaW50ZihjLCBjLT5yZW1vdGVfZmQuZmQsICJIb3N0OiAlcyIsIG9wdC0+cHJvdG9jb2xfaG9zdCk7CisgICAgaWYob3B0LT5wcm90b2NvbF91c2VybmFtZSAmJiBvcHQtPnByb3RvY29sX3Bhc3N3b3JkKSB7CisgICAgICAgIGlmKCFzdHJjYXNlY21wKG9wdC0+cHJvdG9jb2xfYXV0aGVudGljYXRpb24sICJudGxtIikpIHsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDQKKyAgICAgICAgICAgIG50bG0oYywgb3B0KTsKKyNlbHNlCisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTlRMTSBhdXRoZW50aWNhdGlvbiBpcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsgLyogYmFzaWMgYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGxpbmU9c3RyX3ByaW50ZigiJXM6JXMiLAorICAgICAgICAgICAgICAgIG9wdC0+cHJvdG9jb2xfdXNlcm5hbWUsIG9wdC0+cHJvdG9jb2xfcGFzc3dvcmQpOworICAgICAgICAgICAgZW5jb2RlZD1iYXNlNjQoMSwgbGluZSwgKGludClzdHJsZW4obGluZSkpOworICAgICAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgICAgICBpZighZW5jb2RlZCkgeworICAgICAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJCYXNlNjQgZW5jb2RlciBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBsb25nam1wKGMtPmVyciwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZF9wcmludGYoYywgYy0+cmVtb3RlX2ZkLmZkLCAiUHJveHktQXV0aG9yaXphdGlvbjogYmFzaWMgJXMiLAorICAgICAgICAgICAgICAgIGVuY29kZWQpOworICAgICAgICAgICAgc3RyX2ZyZWUoZW5jb2RlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZmRfcHV0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQsICIiKTsgLyogZW1wdHkgbGluZSAqLworICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgIGlmKCFpc19wcmVmaXgobGluZSwgIkhUVFAvMS4wIDIiKSAmJiAhaXNfcHJlZml4KGxpbmUsICJIVFRQLzEuMSAyIikpIHsKKyAgICAgICAgLyogbm90ICJIVFRQLzEueCAyeHggQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCIgKi8KKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkNPTk5FQ1QgcmVxdWVzdCByZWplY3RlZCIpOworICAgICAgICBkbyB7IC8qIHJlYWQgYWxsIGhlYWRlcnMgKi8KKyAgICAgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICAgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgICAgIH0gd2hpbGUoKmxpbmUpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBzX2xvZyhMT0dfSU5GTywgIkNPTk5FQ1QgcmVxdWVzdCBhY2NlcHRlZCIpOworICAgIGRvIHsKKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOyAvKiByZWFkIGFsbCBoZWFkZXJzICovCisgICAgfSB3aGlsZSgqbGluZSk7CisgICAgc3RyX2ZyZWUobGluZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDQKKworLyoKKyAqIE5UTE0gY29kZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGRvY3VtZW50YXRpb246CisgKiBodHRwOi8vZGF2ZW5wb3J0LnNvdXJjZWZvcmdlLm5ldC9udGxtLmh0bWwKKyAqIGh0dHA6Ly93d3cuaW5ub3ZhdGlvbi5jaC9wZXJzb25hbC9yb25hbGQvbnRsbS5odG1sCisgKi8KKworI2RlZmluZSBzX21pbihhLCBiKSAoKGEpPihiKT8oYik6KGEpKQorCitOT0VYUE9SVCB2b2lkIG50bG0oQ0xJICpjLCBTRVJWSUNFX09QVElPTlMgKm9wdCkgeworICAgIGNoYXIgKmxpbmUsIGJ1ZltCVUZTSVpdLCAqbnRsbTFfdHh0LCAqbnRsbTJfdHh0LCAqbnRsbTNfdHh0LCAqdG1wc3RyOworICAgIGxvbmcgY29udGVudF9sZW5ndGg9MDsgLyogbm8gSFRUUCBjb250ZW50ICovCisKKyAgICAvKiBzZW5kIFByb3h5LUF1dGhvcml6YXRpb24gKHBoYXNlIDEpICovCisgICAgZmRfcHJpbnRmKGMsIGMtPnJlbW90ZV9mZC5mZCwgIlByb3h5LUNvbm5lY3Rpb246IGtlZXAtYWxpdmUiKTsKKyAgICBudGxtMV90eHQ9bnRsbTEoKTsKKyAgICBpZighbnRsbTFfdHh0KSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJQcm94eS1BdXRoZW50aWNhdGU6IEZhaWxlZCB0byBidWlsZCBOVExNIHJlcXVlc3QiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBmZF9wcmludGYoYywgYy0+cmVtb3RlX2ZkLmZkLCAiUHJveHktQXV0aG9yaXphdGlvbjogTlRMTSAlcyIsIG50bG0xX3R4dCk7CisgICAgc3RyX2ZyZWUobnRsbTFfdHh0KTsKKyAgICBmZF9wdXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCwgIiIpOyAvKiBlbXB0eSBsaW5lICovCisgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisKKyAgICAvKiByZWNlaXZlIFByb3h5LUF1dGhlbnRpY2F0ZSAocGhhc2UgMikgKi8KKyAgICBpZighaXNfcHJlZml4KGxpbmUsICJIVFRQLzEuMCA0MDciKSAmJiAhaXNfcHJlZml4KGxpbmUsICJIVFRQLzEuMSA0MDciKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiUHJveHktQXV0aGVudGljYXRlOiBOVExNIGF1dGhvcml6YXRpb24gcmVxdWVzdCByZWplY3RlZCIpOworICAgICAgICBkbyB7IC8qIHJlYWQgYWxsIGhlYWRlcnMgKi8KKyAgICAgICAgICAgIHN0cl9mcmVlKGxpbmUpOworICAgICAgICAgICAgbGluZT1mZF9nZXRsaW5lKGMsIGMtPnJlbW90ZV9mZC5mZCk7CisgICAgICAgIH0gd2hpbGUoKmxpbmUpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBudGxtMl90eHQ9TlVMTDsKKyAgICBkbyB7IC8qIHJlYWQgYWxsIGhlYWRlcnMgKi8KKyAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgIGxpbmU9ZmRfZ2V0bGluZShjLCBjLT5yZW1vdGVfZmQuZmQpOworICAgICAgICBpZihpc19wcmVmaXgobGluZSwgIlByb3h5LUF1dGhlbnRpY2F0ZTogTlRMTSAiKSkKKyAgICAgICAgICAgIG50bG0yX3R4dD1zdHJfZHVwKGxpbmUrMjUpOworICAgICAgICBlbHNlIGlmKGlzX3ByZWZpeChsaW5lLCAiQ29udGVudC1MZW5ndGg6ICIpKSB7CisgICAgICAgICAgICBjb250ZW50X2xlbmd0aD1zdHJ0b2wobGluZSsxNiwgJnRtcHN0ciwgMTApOworICAgICAgICAgICAgaWYodG1wc3RyPmxpbmUrMTYpIC8qIGZvdW5kIHNvbWUgZGlnaXRzICovCisgICAgICAgICAgICAgICAgd2hpbGUoKnRtcHN0ciAmJiBpc3NwYWNlKCp0bXBzdHIpKQorICAgICAgICAgICAgICAgICAgICArK3RtcHN0cjsKKyAgICAgICAgICAgIGlmKHRtcHN0cj09bGluZSsxNiB8fCAqdG1wc3RyIHx8IGNvbnRlbnRfbGVuZ3RoPDApIHsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiUHJveHktQXV0aGVudGljYXRlOiBJbnZhbGlkIENvbnRlbnQtTGVuZ3RoIik7CisgICAgICAgICAgICAgICAgc3RyX2ZyZWUobGluZSk7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSgqbGluZSk7CisgICAgaWYoIW50bG0yX3R4dCkgeyAvKiBubyBQcm94eS1BdXRoZW50aWNhdGU6IE5UTE0gaGVhZGVyICovCisgICAgICAgIHNfbG9nKExPR19FUlIsICJQcm94eS1BdXRoZW50aWNhdGU6IE5UTE0gaGVhZGVyIG5vdCBmb3VuZCIpOworICAgICAgICBzdHJfZnJlZShsaW5lKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKworICAgIC8qIHJlYWQgYW5kIGlnbm9yZSBIVFRQIGNvbnRlbnQgKGlmIGFueSkgKi8KKyAgICB3aGlsZShjb250ZW50X2xlbmd0aD4wKSB7CisgICAgICAgIHNpemVfdCBuPXNfbWluKChzaXplX3QpY29udGVudF9sZW5ndGgsIEJVRlNJWik7CisgICAgICAgIHNfcmVhZChjLCBjLT5yZW1vdGVfZmQuZmQsIGJ1Ziwgbik7CisgICAgICAgIGNvbnRlbnRfbGVuZ3RoLT0obG9uZyluOworICAgIH0KKworICAgIC8qIHNlbmQgUHJveHktQXV0aG9yaXphdGlvbiAocGhhc2UgMykgKi8KKyAgICBmZF9wcmludGYoYywgYy0+cmVtb3RlX2ZkLmZkLCAiQ09OTkVDVCAlcyBIVFRQLzEuMSIsIG9wdC0+cHJvdG9jb2xfaG9zdCk7CisgICAgZmRfcHJpbnRmKGMsIGMtPnJlbW90ZV9mZC5mZCwgIkhvc3Q6ICVzIiwgb3B0LT5wcm90b2NvbF9ob3N0KTsKKyAgICBudGxtM190eHQ9bnRsbTMob3B0LT5wcm90b2NvbF91c2VybmFtZSwgb3B0LT5wcm90b2NvbF9wYXNzd29yZCwgbnRsbTJfdHh0KTsKKyAgICBzdHJfZnJlZShudGxtMl90eHQpOworICAgIGlmKCFudGxtM190eHQpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIlByb3h5LUF1dGhlbnRpY2F0ZTogRmFpbGVkIHRvIGJ1aWxkIE5UTE0gcmVzcG9uc2UiKTsKKyAgICAgICAgbG9uZ2ptcChjLT5lcnIsIDEpOworICAgIH0KKyAgICBmZF9wcmludGYoYywgYy0+cmVtb3RlX2ZkLmZkLCAiUHJveHktQXV0aG9yaXphdGlvbjogTlRMTSAlcyIsIG50bG0zX3R4dCk7CisgICAgc3RyX2ZyZWUobnRsbTNfdHh0KTsKK30KKworTk9FWFBPUlQgY2hhciAqbnRsbTEoKSB7CisgICAgY2hhciBwaGFzZTFbMTZdOworCisgICAgbWVtc2V0KHBoYXNlMSwgMCwgc2l6ZW9mIHBoYXNlMSk7CisgICAgc3RyY3B5KHBoYXNlMSwgIk5UTE1TU1AiKTsKKyAgICBwaGFzZTFbOF09MTsgLyogdHlwZTogMSAqLworICAgIHBoYXNlMVsxMl09MjsgLyogZmxhZzogbmVnb3RpYXRlIE9FTSAqLworICAgIHBoYXNlMVsxM109MjsgLyogZmxhZzogbmVnb3RpYXRlIE5UTE0gKi8KKyAgICByZXR1cm4gYmFzZTY0KDEsIHBoYXNlMSwgc2l6ZW9mIHBoYXNlMSk7IC8qIGVuY29kZSAqLworfQorCitOT0VYUE9SVCBjaGFyICpudGxtMyhjaGFyICp1c2VybmFtZSwgY2hhciAqcGFzc3dvcmQsIGNoYXIgKnBoYXNlMikgeworICAgIE1ENF9DVFggbWQ0OworICAgIHVpbnQ4X3QgKmRlY29kZWQ7IC8qIGRlY29kZWQgcmVwbHkgZnJvbSBwcm94eSAqLworICAgIHVpbnQ4X3QgcGhhc2UzWzE0Nl07CisgICAgdWludDhfdCBtZDRfaGFzaFsyMV07CisgICAgc2l6ZV90IHVzZXJsZW49c3RybGVuKHVzZXJuYW1lKTsKKyAgICBzaXplX3QgcGhhc2UzbGVuPXNfbWluKDg4K3VzZXJsZW4sIHNpemVvZiBwaGFzZTMpOworCisgICAgLyogc2V0dXAgcGhhc2UzIHN0cnVjdHVyZSAqLworICAgIG1lbXNldChwaGFzZTMsIDAsIHNpemVvZiBwaGFzZTMpOworICAgIHN0cmNweSgoY2hhciAqKXBoYXNlMywgIk5UTE1TU1AiKTsKKyAgICBwaGFzZTNbOF09MzsgICAgICAgICAgICAgICAgICAgIC8qIHR5cGU6IDMgKi8KKyAgICBwaGFzZTNbMTZdPSh1aW50OF90KXBoYXNlM2xlbjsgIC8qIExNLXJlc3Agb2ZmICovCisgICAgcGhhc2UzWzIwXT0yNDsgICAgICAgICAgICAgICAgICAvKiBOVC1yZXNwIGxlbiAqLworICAgIHBoYXNlM1syMl09MjQ7ICAgICAgICAgICAgICAgICAgLyogTlQtUmVzcCBsZW4gKi8KKyAgICBwaGFzZTNbMjRdPTY0OyAgICAgICAgICAgICAgICAgIC8qIE5ULXJlc3Agb2ZmICovCisgICAgcGhhc2UzWzMyXT0odWludDhfdClwaGFzZTNsZW47ICAvKiBkb21haW4gb2Zmc2V0ICovCisgICAgcGhhc2UzWzM2XT0odWludDhfdCl1c2VybGVuOyAgICAvKiB1c2VyIGxlbmd0aCAqLworICAgIHBoYXNlM1szOF09KHVpbnQ4X3QpdXNlcmxlbjsgICAgLyogdXNlciBsZW5ndGggKi8KKyAgICBwaGFzZTNbNDBdPTg4OyAgICAgICAgICAgICAgICAgIC8qIHVzZXIgb2Zmc2V0ICovCisgICAgcGhhc2UzWzQ4XT0odWludDhfdClwaGFzZTNsZW47ICAvKiBob3N0IG9mZnNldCAqLworICAgIHBoYXNlM1s1Nl09KHVpbnQ4X3QpcGhhc2UzbGVuOyAgLyogbWVzc2FnZSBsZW4gKi8KKyAgICBwaGFzZTNbNjBdPTI7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IG5lZ290aWF0ZSBPRU0gKi8KKyAgICBwaGFzZTNbNjFdPTI7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IG5lZ290aWF0ZSBOVExNICovCisKKyAgICAvKiBjYWxjdWxhdGUgTUQ0IG9mIFVURi0xNiBlbmNvZGVkIHBhc3N3b3JkICovCisgICAgTUQ0X0luaXQoJm1kNCk7CisgICAgd2hpbGUoKnBhc3N3b3JkKSB7CisgICAgICAgIE1ENF9VcGRhdGUoJm1kNCwgcGFzc3dvcmQrKywgMSk7CisgICAgICAgIE1ENF9VcGRhdGUoJm1kNCwgIiIsIDEpOyAvKiBVVEYtMTYgKi8KKyAgICB9CisgICAgTUQ0X0ZpbmFsKG1kNF9oYXNoLCAmbWQ0KTsKKyAgICBtZW1zZXQobWQ0X2hhc2grMTYsIDAsIDUpOyAvKiBwYWQgdG8gMjEgYnl0ZXMgKi8KKworICAgIC8qIGRlY29kZSBjaGFsbGVuZ2UgYW5kIGNhbGN1bGF0ZSByZXNwb25zZSAqLworICAgIGRlY29kZWQ9KHVpbnQ4X3QgKiliYXNlNjQoMCwgcGhhc2UyLCAoaW50KXN0cmxlbihwaGFzZTIpKTsgLyogZGVjb2RlICovCisgICAgaWYoIWRlY29kZWQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNyeXB0X0RFUyhwaGFzZTMrNjQsIGRlY29kZWQrMjQsIG1kNF9oYXNoKTsKKyAgICBjcnlwdF9ERVMocGhhc2UzKzcyLCBkZWNvZGVkKzI0LCBtZDRfaGFzaCs3KTsKKyAgICBjcnlwdF9ERVMocGhhc2UzKzgwLCBkZWNvZGVkKzI0LCBtZDRfaGFzaCsxNCk7CisgICAgc3RyX2ZyZWUoZGVjb2RlZCk7CisKKyAgICBzdHJuY3B5KChjaGFyICopcGhhc2UzKzg4LCB1c2VybmFtZSwgc2l6ZW9mIHBoYXNlMy04OCk7CisKKyAgICByZXR1cm4gYmFzZTY0KDEsIChjaGFyICopcGhhc2UzLCAoaW50KXBoYXNlM2xlbik7IC8qIGVuY29kZSAqLworfQorCitOT0VYUE9SVCB2b2lkIGNyeXB0X0RFUyhERVNfY2Jsb2NrIGRzdCwgY29uc3RfREVTX2NibG9jayBzcmMsIERFU19jYmxvY2sgaGFzaCkgeworICAgIERFU19jYmxvY2sga2V5OworICAgIERFU19rZXlfc2NoZWR1bGUgc2NoZWQ7CisKKyAgICAvKiBjb252ZXJ0IGtleSBmcm9tIDU2IHRvIDY0IGJpdHMgKi8KKyAgICBrZXlbMF09aGFzaFswXTsKKyAgICBrZXlbMV09KHVuc2lnbmVkIGNoYXIpKCgoaGFzaFswXSYxKTw8Nyl8KGhhc2hbMV0+PjEpKTsKKyAgICBrZXlbMl09KHVuc2lnbmVkIGNoYXIpKCgoaGFzaFsxXSYzKTw8Nil8KGhhc2hbMl0+PjIpKTsKKyAgICBrZXlbM109KHVuc2lnbmVkIGNoYXIpKCgoaGFzaFsyXSY3KTw8NSl8KGhhc2hbM10+PjMpKTsKKyAgICBrZXlbNF09KHVuc2lnbmVkIGNoYXIpKCgoaGFzaFszXSYxNSk8PDQpfChoYXNoWzRdPj40KSk7CisgICAga2V5WzVdPSh1bnNpZ25lZCBjaGFyKSgoKGhhc2hbNF0mMzEpPDwzKXwoaGFzaFs1XT4+NSkpOworICAgIGtleVs2XT0odW5zaWduZWQgY2hhcikoKChoYXNoWzVdJjYzKTw8Mil8KGhhc2hbNl0+PjYpKTsKKyAgICBrZXlbN109KHVuc2lnbmVkIGNoYXIpKCgoaGFzaFs2XSYxMjcpPDwxKSk7CisgICAgREVTX3NldF9vZGRfcGFyaXR5KCZrZXkpOworCisgICAgLyogZW5jcnlwdCAqLworICAgIERFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5LCAmc2NoZWQpOworICAgIERFU19lY2JfZW5jcnlwdCgoY29uc3RfREVTX2NibG9jayAqKXNyYywKKyAgICAgICAgKERFU19jYmxvY2sgKilkc3QsICZzY2hlZCwgREVTX0VOQ1JZUFQpOworfQorCisjZW5kaWYKKworTk9FWFBPUlQgY2hhciAqYmFzZTY0KGludCBlbmNvZGUsIGNoYXIgKmluLCBpbnQgbGVuKSB7CisgICAgQklPICpiaW8sICpiNjQ7CisgICAgY2hhciAqb3V0OworICAgIGludCBuOworCisgICAgYjY0PUJJT19uZXcoQklPX2ZfYmFzZTY0KCkpOworICAgIGlmKCFiNjQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJJT19zZXRfZmxhZ3MoYjY0LCBCSU9fRkxBR1NfQkFTRTY0X05PX05MKTsKKyAgICBiaW89QklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgaWYoIWJpbykgeworICAgICAgICBzdHJfZnJlZShiNjQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYoZW5jb2RlKQorICAgICAgICBiaW89QklPX3B1c2goYjY0LCBiaW8pOworICAgIEJJT193cml0ZShiaW8sIGluLCBsZW4pOworICAgICh2b2lkKUJJT19mbHVzaChiaW8pOyAvKiBpZ25vcmUgdGhlIGVycm9yIGlmIGFueSAqLworICAgIGlmKGVuY29kZSkgeworICAgICAgICBiaW89QklPX3BvcChiaW8pOworICAgICAgICBCSU9fZnJlZShiNjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJpbz1CSU9fcHVzaChiNjQsIGJpbyk7CisgICAgfQorICAgIG49QklPX3BlbmRpbmcoYmlvKTsKKyAgICAvKiAzMiBieXRlcyBhcyBhIHNhZmV0eSBwcmVjYXV0aW9uIGZvciBwYXNzaW5nIGRlY29kZWQgZGF0YSB0byBjcnlwdF9ERVMgKi8KKyAgICAvKiBuKzEgdG8gZ2V0IG51bGwtdGVybWluYXRlZCBzdHJpbmcgb24gZW5jb2RlICovCisgICAgb3V0PXN0cl9hbGxvYyhuPDMyPzMyOihzaXplX3QpbisxKTsKKyAgICBuPUJJT19yZWFkKGJpbywgb3V0LCBuKTsKKyAgICBpZihuPDApIHsKKyAgICAgICAgQklPX2ZyZWVfYWxsKGJpbyk7CisgICAgICAgIHN0cl9mcmVlKG91dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBCSU9fZnJlZV9hbGwoYmlvKTsKKyAgICByZXR1cm4gb3V0OworfQorCisvKiBlbmQgb2YgcHJvdG9jb2wuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvdHlwZXMuaCBiL3NyYy9wcm90b3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwY2Y3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90b3R5cGVzLmgKQEAgLTAsMCArMSw3NjAgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICogCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICogCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqIAorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaWZuZGVmIFBST1RPVFlQRVNfSAorI2RlZmluZSBQUk9UT1RZUEVTX0gKKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB0bHNfZGF0YV9zdHJ1Y3QgVExTX0RBVEE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRhdGEgc3RydWN0dXJlcyAqLworCisvKiBub24temVybyBjb25zdGFudHMgZm9yIHRoZSAicmVkaXJlY3QiIG9wdGlvbiAqLworI2RlZmluZSBSRURJUkVDVF9PTiAgICAgICAgIDEKKyNkZWZpbmUgUkVESVJFQ1RfT0ZGICAgICAgICAyCisKKyNpZiBkZWZpbmVkIChVU0VfV0lOMzIpCisjZGVmaW5lIElDT05fSU1BR0UgSElDT04KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBJQ09OX0lNQUdFIHZvaWQgKgorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgSUNPTl9FUlJPUiwKKyAgICBJQ09OX0lETEUsCisgICAgSUNPTl9BQ1RJVkUsCisgICAgSUNPTl9OT05FIC8qIGl0IGhhcyB0byBiZSB0aGUgbGFzdCBvbmUgKi8KK30gSUNPTl9UWVBFOworCit0eXBlZGVmIGVudW0geworICAgIExPR19NT0RFX05PTkUsCisgICAgTE9HX01PREVfRVJST1IsCisgICAgTE9HX01PREVfSU5GTywKKyAgICBMT0dfTU9ERV9DT05GSUdVUkVECit9IExPR19NT0RFOworCit0eXBlZGVmIGVudW0geworICAgIExPR19JRF9TRVFFTlRJQUwsCisgICAgTE9HX0lEX1VOSVFVRSwKKyAgICBMT0dfSURfVEhSRUFECit9IExPR19JRDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBGSUxFX01PREVfUkVBRCwKKyAgICBGSUxFX01PREVfQVBQRU5ELAorICAgIEZJTEVfTU9ERV9PVkVSV1JJVEUKK30gRklMRV9NT0RFOworCit0eXBlZGVmIHVuaW9uIHNvY2thZGRyX3VuaW9uIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGluOworI2lmZGVmIFVTRV9JUHY2CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBpbjY7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9VTgorICAgIHN0cnVjdCBzb2NrYWRkcl91biB1bjsKKyNlbmRpZgorfSBTT0NLQUREUl9VTklPTjsKKwordHlwZWRlZiBzdHJ1Y3QgbmFtZV9saXN0X3N0cnVjdCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgbmFtZV9saXN0X3N0cnVjdCAqbmV4dDsKK30gTkFNRV9MSVNUOworCit0eXBlZGVmIHN0cnVjdCBzb2NrYWRkcl9saXN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpc3Qgb2YgYWRkcmVzc2VzICovCisgICAgU09DS0FERFJfVU5JT04gKmFkZHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGxpc3Qgb2YgYWRkcmVzc2VzICovCisgICAgdW5zaWduZWQgKnJyX3B0ciwgcnJfdmFsOyAgICAgICAgICAgICAvKiBjdXJyZW50IGFkZHJlc3MgZm9yIHJvdW5kLXJvYmluICovCisgICAgdW5zaWduZWQgbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG93IG1hbnkgYWRkcmVzc2VzIGFyZSB1c2VkICovCisgICAgaW50IHBhc3NpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXN0ZW5pbmcgc29ja2V0ICovCisgICAgTkFNRV9MSVNUICpuYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEgbGlzdCBvZiB1bnJlc29sdmVkIG5hbWVzICovCit9IFNPQ0tBRERSX0xJU1Q7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCit0eXBlZGVmIGVudW0geworICAgIENPTVBfTk9ORSwgQ09NUF9ERUZMQVRFLCBDT01QX1pMSUIKK30gQ09NUF9UWVBFOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fQ09NUCkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAvKiBzb21lIGRhdGEgZm9yIFNTTCBpbml0aWFsaXphdGlvbiBpbiBzc2wuYyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyAgICBDT01QX1RZUEUgY29tcHJlc3Npb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIHR5cGUgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0NPTVApICovCisgICAgY2hhciAqZWdkX3NvY2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyb3B5IGdhdGhlcmluZyBkYWVtb24gc29ja2V0ICovCisgICAgY2hhciAqcmFuZF9maWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSB3aXRoIHJhbmRvbSBkYXRhICovCisgICAgbG9uZyByYW5kb21fYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGhvdyBtYW55IHJhbmRvbSBieXRlcyB0byByZWFkICovCisKKyAgICAgICAgLyogc29tZSBnbG9iYWwgZGF0YSBmb3Igc3R1bm5lbC5jICovCisjaWZuZGVmIFVTRV9XSU4zMgorI2lmZGVmIEhBVkVfQ0hST09UCisgICAgY2hhciAqY2hyb290X2RpcjsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgZHBpZDsKKyAgICBjaGFyICpwaWRmaWxlOworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CisjZW5kaWYKKworICAgICAgICAvKiBsb2dnaW5nLXN1cHBvcnQgZGF0YSBmb3IgbG9nLmMgKi8KKyNpZm5kZWYgVVNFX1dJTjMyCisgICAgaW50IGxvZ19mYWNpbGl0eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWJ1ZyBmYWNpbGl0eSBmb3Igc3lzbG9nICovCisjZW5kaWYKKyAgICBjaGFyICpvdXRwdXRfZmlsZTsKKyAgICBGSUxFX01PREUgbG9nX2ZpbGVfbW9kZTsKKworICAgICAgICAvKiB1c2VyIGludGVyZmFjZSBjb25maWd1cmFpb24gKi8KKyNpZmRlZiBJQ09OX0lNQUdFCisgICAgSUNPTl9JTUFHRSBpY29uW0lDT05fTk9ORV07ICAgICAgICAgICAgICAgICAgLyogdXNlci1zcGVjaWZpZWQgR1VJIGljb25zICovCisjZW5kaWYKKworICAgICAgICAvKiBvbi9vZmYgc3dpdGNoZXMgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCByYW5kX3dyaXRlOjE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogb3ZlcndyaXRlIHJhbmRfZmlsZSAqLworI2lmZGVmIFVTRV9XSU4zMgorICAgICAgICB1bnNpZ25lZCB0YXNrYmFyOjE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgdGhlIHRhc2tiYXIgaWNvbiAqLworI2Vsc2UgLyogIVVTRV9XSU4zMiAqLworICAgICAgICB1bnNpZ25lZCBmb3JlZ3JvdW5kOjE7CisgICAgICAgIHVuc2lnbmVkIHN5c2xvZzoxOworI2VuZGlmCisjaWZkZWYgVVNFX0ZJUFMKKyAgICAgICAgdW5zaWduZWQgZmlwczoxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBGSVBTIDE0MC0yIG1vZGUgKi8KKyNlbmRpZgorICAgIH0gb3B0aW9uOworfSBHTE9CQUxfT1BUSU9OUzsKKworZXh0ZXJuIEdMT0JBTF9PUFRJT05TIGdsb2JhbF9vcHRpb25zOworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCit0eXBlZGVmIHN0cnVjdCBzZXJ2ZXJuYW1lX2xpc3Rfc3RydWN0IFNFUlZFUk5BTUVfTElTVDsvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19UTFNFWFQpICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKK3R5cGVkZWYgc3RydWN0IHBza19rZXlzX3N0cnVjdCB7CisgICAgY2hhciAqaWRlbnRpdHk7CisgICAgdW5zaWduZWQgY2hhciAqa2V5X3ZhbDsKKyAgICBzaXplX3Qga2V5X2xlbjsKKyAgICBzdHJ1Y3QgcHNrX2tleXNfc3RydWN0ICpuZXh0OworfSBQU0tfS0VZUzsKK3R5cGVkZWYgc3RydWN0IHBza190YWJsZV9zdHJ1Y3QgeworICAgIFBTS19LRVlTICoqdmFsOworICAgIHNpemVfdCBudW07Cit9IFBTS19UQUJMRTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1BTSykgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2VydmljZV9vcHRpb25zX3N0cnVjdCB7CisgICAgc3RydWN0IHNlcnZpY2Vfb3B0aW9uc19zdHJ1Y3QgKm5leHQ7ICAgLyogbmV4dCBub2RlIGluIHRoZSBzZXJ2aWNlcyBsaXN0ICovCisgICAgU1NMX0NUWCAqY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFNTTCBjb250ZXh0ICovCisgICAgY2hhciAqc2Vydm5hbWU7ICAgICAgICAvKiBzZXJ2aWNlIG5hbWUgZm9yIGxvZ2dpbmcgJiBwZXJtaXNzaW9uIGNoZWNraW5nICovCisKKyAgICAgICAgLyogc2VydmljZS1zcGVjaWZpYyBkYXRhIGZvciBsb2cuYyAqLworICAgIGludCBsb2dfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWJ1ZyBsZXZlbCBmb3IgbG9nZ2luZyAqLworICAgIExPR19JRCBsb2dfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnaW5nIHNlc3Npb24gaWQgdHlwZSAqLworCisgICAgICAgIC8qIHNlcnZpY2Utc3BlY2lmaWMgZGF0YSBmb3Igc3RocmVhZHMuYyAqLworI2lmbmRlZiBVU0VfRk9SSworICAgIHNpemVfdCBzdGFja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCAqLworI2VuZGlmCisKKyAgICAgICAgLyogc2VydmljZS1zcGVjaWZpYyBkYXRhIGZvciB2ZXJpZnkuYyAqLworICAgIGNoYXIgKmNhX2RpcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXJlY3RvcnkgZm9yIGhhc2hlZCBjZXJ0cyAqLworICAgIGNoYXIgKmNhX2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIGNvbnRhaW5pbmcgYnVuY2hlcyBvZiBjZXJ0cyAqLworICAgIGNoYXIgKmNybF9kaXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyZWN0b3J5IGZvciBoYXNoZWQgQ1JMcyAqLworICAgIGNoYXIgKmNybF9maWxlOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBjb250YWluaW5nIGJ1bmNoZXMgb2YgQ1JMcyAqLworICAgIGludCB2ZXJpZnlfbGV2ZWw7CisgICAgWDUwOV9TVE9SRSAqcmV2b2NhdGlvbl9zdG9yZTsgICAgICAgICAgICAgLyogY2VydCBzdG9yZSBmb3IgQ1JMIGNoZWNraW5nICovCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorICAgIGNoYXIgKm9jc3BfdXJsOworICAgIHVuc2lnbmVkIGxvbmcgb2NzcF9mbGFnczsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApICovCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgxMDAwMjAwMEwKKyAgICBOQU1FX0xJU1QgKmNoZWNrX2hvc3QsICpjaGVja19lbWFpbCwgKmNoZWNrX2lwOyAgIC8qIGNlcnQgc3ViamVjdCBjaGVja3MgKi8KKyNlbmRpZiAvKiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAyMDAwTCAqLworCisgICAgICAgIC8qIHNlcnZpY2Utc3BlY2lmaWMgZGF0YSBmb3IgY3R4LmMgKi8KKyAgICBjaGFyICpjaXBoZXJfbGlzdDsKKyAgICBjaGFyICpjZXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlcnQgZmlsZW5hbWUgKi8KKyAgICBjaGFyICprZXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlbSAocHJpdiBrZXkvY2VydCkgZmlsZW5hbWUgKi8KKyAgICBsb25nIHNlc3Npb25fc2l6ZSwgc2Vzc2lvbl90aW1lb3V0OworICAgIGxvbmcgc3NsX29wdGlvbnNfc2V0OworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MDA5MDgwZGZMCisgICAgbG9uZyBzc2xfb3B0aW9uc19jbGVhcjsKKyNlbmRpZiAvKiBPcGVuU1NMIDAuOS44bSBvciBsYXRlciAqLworICAgIFNTTF9NRVRIT0QgKmNsaWVudF9tZXRob2QsICpzZXJ2ZXJfbWV0aG9kOworICAgIFNPQ0tBRERSX1VOSU9OIHNlc3Npb25kX2FkZHI7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisgICAgY2hhciAqc25pOworICAgIFNFUlZFUk5BTUVfTElTVCAqc2VydmVybmFtZV9saXN0X2hlYWQsICpzZXJ2ZXJuYW1lX2xpc3RfdGFpbDsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1RMU0VYVCkgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKyAgICBjaGFyICpwc2tfaWRlbnRpdHk7CisgICAgUFNLX0tFWVMgKnBza19rZXlzLCAqcHNrX3NlbGVjdGVkOworICAgIFBTS19UQUJMRSBwc2tfc29ydGVkOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fUFNLKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKyAgICBpbnQgY3VydmU7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19FQ0RIKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgIEVOR0lORSAqZW5naW5lOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZ2luZSB0byByZWFkIHRoZSBwcml2YXRlIGtleSAqLworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fRU5HSU5FKSAqLworCisgICAgICAgIC8qIHNlcnZpY2Utc3BlY2lmaWMgZGF0YSBmb3IgY2xpZW50LmMgKi8KKyAgICBTT0NLRVQgZmQ7ICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGZvciB0aGlzIHNlcnZpY2UgKi8KKyAgICBTU0xfU0VTU0lPTiAqc2Vzc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWNlbnRseSB1c2VkIHNlc3Npb24gKi8KKyAgICBjaGFyICpleGVjX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9ncmFtIG5hbWUgZm9yIGxvY2FsIG1vZGUgKi8KKyNpZmRlZiBVU0VfV0lOMzIKKyAgICBjaGFyICpleGVjX2FyZ3M7ICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3JhbSBhcmd1bWVudHMgZm9yIGxvY2FsIG1vZGUgKi8KKyNlbHNlCisgICAgY2hhciAqKmV4ZWNfYXJnczsgICAgICAgICAgICAgICAgICAgIC8qIHByb2dyYW0gYXJndW1lbnRzIGZvciBsb2NhbCBtb2RlICovCisjZW5kaWYKKyAgICBTT0NLQUREUl9VTklPTiBsb2NhbF9hZGRyLCBzb3VyY2VfYWRkcjsKKyAgICBTT0NLQUREUl9MSVNUIGNvbm5lY3RfYWRkciwgcmVkaXJlY3RfYWRkcjsKKyAgICBpbnQgdGltZW91dF9idXN5OyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSB3YWl0aW5nIGZvciBkYXRhIHRpbWUgKi8KKyAgICBpbnQgdGltZW91dF9jbG9zZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY2xvc2Vfbm90aWZ5IHRpbWUgKi8KKyAgICBpbnQgdGltZW91dF9jb25uZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29ubmVjdCgpIHRpbWUgKi8KKyAgICBpbnQgdGltZW91dF9pZGxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gaWRsZSBjb25uZWN0aW9uIHRpbWUgKi8KKyAgICBlbnVtIHtGQUlMT1ZFUl9SUiwgRkFJTE9WRVJfUFJJT30gZmFpbG92ZXI7ICAgICAgICAgLyogZmFpbG92ZXIgc3RyYXRlZ3kgKi8KKyAgICBjaGFyICp1c2VybmFtZTsKKworICAgICAgICAvKiBzZXJ2aWNlLXNwZWNpZmljIGRhdGEgZm9yIHByb3RvY29sLmMgKi8KKyAgICBjaGFyICogcHJvdG9jb2w7CisgICAgY2hhciAqcHJvdG9jb2xfaG9zdDsKKyAgICBjaGFyICpwcm90b2NvbF91c2VybmFtZTsKKyAgICBjaGFyICpwcm90b2NvbF9wYXNzd29yZDsKKyAgICBjaGFyICpwcm90b2NvbF9hdXRoZW50aWNhdGlvbjsKKworICAgICAgICAvKiBzZXJ2aWNlLXNwZWNpZmljIGRhdGEgZm9yIHVpXyouYyAqLworI2lmZGVmIFVTRV9XSU4zMgorICAgIExQVFNUUiBmaWxlLCBoZWxwOworI2VuZGlmCisgICAgdW5zaWduZWQgc2VjdGlvbl9udW1iZXI7CisgICAgY2hhciAqY2hhaW47CisKKyAgICAgICAgLyogb24vb2ZmIHN3aXRjaGVzICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgYWNjZXB0OjE7ICAgICAgICAgICAgICAvKiBlbmRwb2ludDogYWNjZXB0ICovCisgICAgICAgIHVuc2lnbmVkIGNsaWVudDoxOworICAgICAgICB1bnNpZ25lZCBkZWxheWVkX2xvb2t1cDoxOworI2lmZGVmIFVTRV9MSUJXUkFQCisgICAgICAgIHVuc2lnbmVkIGxpYndyYXA6MTsKKyNlbmRpZgorICAgICAgICB1bnNpZ25lZCBsb2NhbDoxOyAgICAgICAgICAgICAgIC8qIG91dGdvaW5nIGludGVyZmFjZSBzcGVjaWZpZWQgKi8KKyAgICAgICAgdW5zaWduZWQgcmV0cnk6MTsgICAgICAgICAgICAgICAvKiBsb29wIHJlbW90ZStwcm9ncmFtICovCisgICAgICAgIHVuc2lnbmVkIHNlc3Npb25kOjE7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisgICAgICAgIHVuc2lnbmVkIHNuaToxOyAgICAgICAgICAgICAgICAgLyogZW5kcG9pbnQ6IHNuaSAqLworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAqLworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICAgICAgdW5zaWduZWQgcHR5OjE7CisgICAgICAgIHVuc2lnbmVkIHRyYW5zcGFyZW50X3NyYzoxOworICAgICAgICB1bnNpZ25lZCB0cmFuc3BhcmVudF9kc3Q6MTsgICAgIC8qIGVuZHBvaW50OiB0cmFuc3BhcmVudCBkZXN0aW5hdGlvbiAqLworI2VuZGlmCisgICAgICAgIHVuc2lnbmVkIHJlc2V0OjE7ICAgICAgICAgICAgICAgLyogcmVzZXQgc29ja2V0cyBvbiBlcnJvciAqLworICAgICAgICB1bnNpZ25lZCByZW5lZ290aWF0aW9uOjE7CisgICAgICAgIHVuc2lnbmVkIGNvbm5lY3RfYmVmb3JlX3NzbDoxOworI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKyAgICAgICAgdW5zaWduZWQgYWlhOjE7ICAgICAgICAgICAgICAgICAvKiBBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzICovCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RICisgICAgICAgIHVuc2lnbmVkIGRoX25lZWRlZDoxOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKyAgICB9IG9wdGlvbjsKK30gU0VSVklDRV9PUFRJT05TOworCitleHRlcm4gU0VSVklDRV9PUFRJT05TIHNlcnZpY2Vfb3B0aW9uczsKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorc3RydWN0IHNlcnZlcm5hbWVfbGlzdF9zdHJ1Y3QgeworICAgIGNoYXIgKnNlcnZlcm5hbWU7CisgICAgU0VSVklDRV9PUFRJT05TICpvcHQ7CisgICAgc3RydWN0IHNlcnZlcm5hbWVfbGlzdF9zdHJ1Y3QgKm5leHQ7Cit9OworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAqLworCit0eXBlZGVmIGVudW0geworICAgIFRZUEVfTk9ORSwgVFlQRV9GTEFHLCBUWVBFX0lOVCwgVFlQRV9MSU5HRVIsIFRZUEVfVElNRVZBTCwgVFlQRV9TVFJJTkcKK30gVkFMX1RZUEU7CisKK3R5cGVkZWYgdW5pb24geworICAgIGludCAgICAgICAgICAgIGlfdmFsOworICAgIGxvbmcgICAgICAgICAgIGxfdmFsOworICAgIGNoYXIgICAgICAgICAgIGNfdmFsWzE2XTsKKyAgICBzdHJ1Y3QgbGluZ2VyICBsaW5nZXJfdmFsOworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWxfdmFsOworfSBPUFRfVU5JT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICpvcHRfc3RyOworICAgIGludCAgb3B0X2xldmVsOworICAgIGludCAgb3B0X25hbWU7CisgICAgVkFMX1RZUEUgb3B0X3R5cGU7CisgICAgT1BUX1VOSU9OICpvcHRfdmFsWzNdOworfSBTT0NLX09QVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDT05GX1JFTE9BRCwgQ09ORl9GSUxFLCBDT05GX0ZECit9IENPTkZfVFlQRTsKKworICAgICAgICAvKiBzX3BvbGxfc2V0IGRlZmluaXRpb24gZm9yIG5ldHdvcmsuYyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgVVNFX1BPTEwKKyAgICBzdHJ1Y3QgcG9sbGZkICp1ZmRzOworICAgIHVuc2lnbmVkIG5mZHM7CisgICAgdW5zaWduZWQgYWxsb2NhdGVkOworI2Vsc2UgLyogc2VsZWN0ICovCisgICAgZmRfc2V0ICppcmZkcywgKml3ZmRzLCAqaXhmZHMsICpvcmZkcywgKm93ZmRzLCAqb3hmZHM7CisgICAgU09DS0VUIG1heDsKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICB1bnNpZ25lZCBhbGxvY2F0ZWQ7CisjZW5kaWYKKyNlbmRpZgorfSBzX3BvbGxfc2V0OworCit0eXBlZGVmIHN0cnVjdCBkaXNrX2ZpbGUgeworI2lmZGVmIFVTRV9XSU4zMgorICAgIEhBTkRMRSBmaDsKKyNlbHNlCisgICAgaW50IGZkOworI2VuZGlmCisgICAgLyogdGhlIGludGVmYWNlIGlzIHByZXBhcmVkIHRvIGVhc2lseSBpbXBsZW1lbnQgYnVmZmVyaW5nIGlmIG5lZWRlZCAqLworfSBESVNLX0ZJTEU7CisKKyAgICAvKiBkZWZpbml0aW9ucyBmb3IgY2xpZW50LmMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNPQ0tFVCBmZDsgLyogZmlsZSBkZXNjcmlwdG9yICovCisgICAgaW50IGlzX3NvY2tldDsgLyogZmlsZSBkZXNjcmlwdG9yIGlzIGEgc29ja2V0ICovCit9IEZEOworCit0eXBlZGVmIGVudW0geworICAgIFJFTkVHX0lOSVQsIC8qIGluaXRpYWwgc3RhdGUgKi8KKyAgICBSRU5FR19FU1RBQkxJU0hFRCwgLyogaW5pdGlhbCBoYW5kc2hha2UgY29tcGxldGVkICovCisgICAgUkVORUdfREVURUNURUQgLyogcmVuZWdvdGlhdGlvbiBkZXRlY3RlZCAqLworfSBSRU5FR19TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGptcF9idWYgZXJyOyAvKiBleGNlcHRpb24gaGFuZGxlciBuZWVkcyB0byBiZSAxNi1ieXRlIGFsaWduZWQgb24gSXRhbml1bSAqLworICAgIFNTTCAqc3NsOyAvKiBTU0wgY29ubm5lY3Rpb24gKi8KKyAgICBTRVJWSUNFX09QVElPTlMgKm9wdDsKKyAgICBUTFNfREFUQSAqdGxzOworCisgICAgU09DS0FERFJfVU5JT04gcGVlcl9hZGRyOyAvKiBwZWVyIGFkZHJlc3MgKi8KKyAgICBzb2NrbGVuX3QgcGVlcl9hZGRyX2xlbjsKKyAgICBTT0NLQUREUl9VTklPTiAqYmluZF9hZGRyOyAvKiBhZGRyZXNzIHRvIGJpbmQoKSB0aGUgc29ja2V0ICovCisgICAgU09DS0FERFJfTElTVCBjb25uZWN0X2FkZHI7IC8qIGVpdGhlciBjb3BpZWQgb3IgcmVzb2x2ZWQgZHluYW1pY2FsbHkgKi8KKyAgICBGRCBsb2NhbF9yZmQsIGxvY2FsX3dmZDsgLyogcmVhZCBhbmQgd3JpdGUgbG9jYWwgZGVzY3JpcHRvcnMgKi8KKyAgICBGRCByZW1vdGVfZmQ7IC8qIHJlbW90ZSBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgLyogSVAgZm9yIGV4cGxpY2l0IGxvY2FsIGJpbmQgb3IgdHJhbnNwYXJlbnQgcHJveHkgKi8KKyAgICB1bnNpZ25lZCBsb25nIHBpZDsgLyogUElEIG9mIHRoZSBsb2NhbCBwcm9jZXNzICovCisgICAgU09DS0VUIGZkOyAvKiB0ZW1wb3JhcnkgZmlsZSBkZXNjcmlwdG9yICovCisgICAgUkVORUdfU1RBVEUgcmVuZWdfc3RhdGU7IC8qIHVzZWQgdG8gdHJhY2sgcmVuZWdvdGlhdGlvbiBhdHRlbXB0cyAqLworCisgICAgLyogZGF0YSBmb3IgdHJhbnNmZXIoKSBmdW5jdGlvbiAqLworICAgIGNoYXIgc29ja19idWZmW0JVRkZTSVpFXTsgLyogc29ja2V0IHJlYWQgYnVmZmVyICovCisgICAgY2hhciBzc2xfYnVmZltCVUZGU0laRV07IC8qIFNTTCByZWFkIGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGxvbmcgc29ja19wdHIsIHNzbF9wdHI7IC8qIGluZGV4IG9mIHRoZSBmaXJzdCB1bnVzZWQgYnl0ZSAqLworICAgIEZEICpzb2NrX3JmZCwgKnNvY2tfd2ZkOyAvKiByZWFkIGFuZCB3cml0ZSBzb2NrZXQgZGVzY3JpcHRvcnMgKi8KKyAgICBGRCAqc3NsX3JmZCwgKnNzbF93ZmQ7IC8qIHJlYWQgYW5kIHdyaXRlIFNTTCBkZXNjcmlwdG9ycyAqLworICAgIHVpbnQ2NF90IHNvY2tfYnl0ZXMsIHNzbF9ieXRlczsgLyogYnl0ZXMgd3JpdHRlbiB0byBzb2NrZXQgYW5kIFNTTCAqLworICAgIHNfcG9sbF9zZXQgKmZkczsgLyogZmlsZSBkZXNjcmlwdG9ycyAqLworICAgIHVpbnRwdHJfdCByZWRpcmVjdDsgLyogcmVkaXJlY3QgdG8gYW5vdGhlciBkZXN0aW5hdGlvbiBhZnRlciBmYWlsZWQgYXV0aCAqLworfSBDTEk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIHN0dW5uZWwuYyAqLworCisjaWZuZGVmIFVTRV9GT1JLCitleHRlcm4gbG9uZyBtYXhfY2xpZW50czsKK2V4dGVybiB2b2xhdGlsZSBsb25nIG51bV9jbGllbnRzOworI2VuZGlmCisKK3ZvaWQgbWFpbl9pbml0KHZvaWQpOworaW50IG1haW5fY29uZmlndXJlKGNoYXIgKiwgY2hhciAqKTsKK3ZvaWQgbWFpbl9jbGVhbnVwKHZvaWQpOworaW50IGRyb3BfcHJpdmlsZWdlcyhpbnQpOwordm9pZCBkYWVtb25fbG9vcCh2b2lkKTsKK3ZvaWQgdW5iaW5kX3BvcnRzKHZvaWQpOworaW50IGJpbmRfcG9ydHModm9pZCk7Cit2b2lkIHNpZ25hbF9wb3N0KGludCk7CisjaWYgIWRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChVU0VfT1MyKQordm9pZCBjaGlsZF9zdGF0dXModm9pZCk7ICAvKiBkZWFkIGxpYndyYXAgb3IgJ2V4ZWMnIHByb2Nlc3MgZGV0ZWN0ZWQgKi8KKyNlbmRpZgordm9pZCBzdHVubmVsX2luZm8oaW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3Igb3B0aW9ucy5jICovCisKK2V4dGVybiBjaGFyICpjb25maWd1cmF0aW9uX2ZpbGU7CisKK2ludCBvcHRpb25zX2NtZGxpbmUoY2hhciAqLCBjaGFyICopOworaW50IG9wdGlvbnNfcGFyc2UoQ09ORl9UWVBFKTsKK3ZvaWQgb3B0aW9uc19kZWZhdWx0cyh2b2lkKTsKK3ZvaWQgb3B0aW9uc19hcHBseSh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3IgZmQuYyAqLworCisjaWZuZGVmIFVTRV9GT1JLCit2b2lkIGdldF9saW1pdHModm9pZCk7IC8qIHNldHVwIGdsb2JhbCBtYXhfY2xpZW50cyBhbmQgbWF4X2ZkcyAqLworI2VuZGlmCitTT0NLRVQgc19zb2NrZXQoaW50LCBpbnQsIGludCwgaW50LCBjaGFyICopOworaW50IHNfcGlwZShpbnRbMl0sIGludCwgY2hhciAqKTsKK2ludCBzX3NvY2tldHBhaXIoaW50LCBpbnQsIGludCwgU09DS0VUWzJdLCBpbnQsIGNoYXIgKik7CitTT0NLRVQgc19hY2NlcHQoU09DS0VULCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICosIGludCwgY2hhciAqKTsKK3ZvaWQgc2V0X25vbmJsb2NrKFNPQ0tFVCwgdW5zaWduZWQgbG9uZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIGxvZy5jICovCisKKyNpZiAhZGVmaW5lZChVU0VfV0lOMzIpICYmICFkZWZpbmVkKF9fdm1zKQordm9pZCBzeXNsb2dfb3Blbih2b2lkKTsKK3ZvaWQgc3lzbG9nX2Nsb3NlKHZvaWQpOworI2VuZGlmCitpbnQgbG9nX29wZW4odm9pZCk7Cit2b2lkIGxvZ19jbG9zZSh2b2lkKTsKK3ZvaWQgbG9nX2ZsdXNoKExPR19NT0RFKTsKK3ZvaWQgc19sb2coaW50LCBjb25zdCBjaGFyICosIC4uLikKKyNpZmRlZiBfX0dOVUNfXworICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisjZWxzZQorICAgIDsKKyNlbmRpZgorY2hhciAqbG9nX2lkKENMSSAqKTsKK3ZvaWQgZmF0YWxfZGVidWcoY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZGVmaW5lIGZhdGFsKGEpIGZhdGFsX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCBpb2Vycm9yKGNvbnN0IGNoYXIgKik7Cit2b2lkIHNvY2tlcnJvcihjb25zdCBjaGFyICopOwordm9pZCBsb2dfZXJyb3IoaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CitjaGFyICpzX3N0cmVycm9yKGludCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIHB0eS5jICovCisKK2ludCBwdHlfYWxsb2NhdGUoaW50ICosIGludCAqLCBjaGFyICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm90b3R5cGVzIGZvciBkaHBhcmFtLmMgKi8KKworREggKmdldF9kaDIwNDgodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIGNyb24uYyAqLworCitpbnQgY3Jvbl9pbml0KHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm90b3R5cGVzIGZvciBzc2wuYyAqLworCitleHRlcm4gaW50IGluZGV4X2NsaSwgaW5kZXhfb3B0LCBpbmRleF9yZWRpcmVjdCwgaW5kZXhfYWRkcjsKKworaW50IHNzbF9pbml0KHZvaWQpOworaW50IHNzbF9jb25maWd1cmUoR0xPQkFMX09QVElPTlMgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIGN0eC5jICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTRVJWSUNFX09QVElPTlMgKnNlY3Rpb247CisgICAgY2hhciBwYXNzW1BFTV9CVUZTSVpFXTsKK30gVUlfREFUQTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICitleHRlcm4gREggKmRoX3BhcmFtczsKK2V4dGVybiBpbnQgZGhfbmVlZGVkOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKworaW50IGNvbnRleHRfaW5pdChTRVJWSUNFX09QVElPTlMgKik7CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCit2b2lkIHBza19zb3J0KFBTS19UQUJMRSAqLCBQU0tfS0VZUyAqKTsKK1BTS19LRVlTICpwc2tfZmluZChjb25zdCBQU0tfVEFCTEUgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX1BTSykgKi8KK3ZvaWQgc3NsZXJyb3IoY2hhciAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3IgdmVyaWZ5LmMgKi8KKworaW50IHZlcmlmeV9pbml0KFNFUlZJQ0VfT1BUSU9OUyAqKTsKK2NoYXIgKlg1MDlfTkFNRTJ0ZXh0KFg1MDlfTkFNRSAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3IgbmV0d29yay5jICovCisKK3NfcG9sbF9zZXQgKnNfcG9sbF9hbGxvYyh2b2lkKTsKK3ZvaWQgc19wb2xsX2ZyZWUoc19wb2xsX3NldCAqKTsKK3ZvaWQgc19wb2xsX2luaXQoc19wb2xsX3NldCAqKTsKK3ZvaWQgc19wb2xsX2FkZChzX3BvbGxfc2V0ICosIFNPQ0tFVCwgaW50LCBpbnQpOwordm9pZCBzX3BvbGxfcmVtb3ZlKHNfcG9sbF9zZXQgKiwgU09DS0VUKTsKK2ludCBzX3BvbGxfY2FucmVhZChzX3BvbGxfc2V0ICosIFNPQ0tFVCk7CitpbnQgc19wb2xsX2NhbndyaXRlKHNfcG9sbF9zZXQgKiwgU09DS0VUKTsKK2ludCBzX3BvbGxfaHVwKHNfcG9sbF9zZXQgKiwgU09DS0VUKTsKK2ludCBzX3BvbGxfcmRodXAoc19wb2xsX3NldCAqLCBTT0NLRVQpOworaW50IHNfcG9sbF93YWl0KHNfcG9sbF9zZXQgKiwgaW50LCBpbnQpOwordm9pZCBzX3BvbGxfZHVtcChzX3BvbGxfc2V0ICosIGludCk7CisKKyNpZmRlZiBVU0VfV0lOMzIKKyNkZWZpbmUgU0lHTkFMX1JFTE9BRF9DT05GSUcgICAgMQorI2RlZmluZSBTSUdOQUxfUkVPUEVOX0xPRyAgICAgICAyCisjZGVmaW5lIFNJR05BTF9URVJNSU5BVEUgICAgICAgIDMKKyNlbHNlCisjZGVmaW5lIFNJR05BTF9SRUxPQURfQ09ORklHICAgIFNJR0hVUAorI2RlZmluZSBTSUdOQUxfUkVPUEVOX0xPRyAgICAgICBTSUdVU1IxCisjZGVmaW5lIFNJR05BTF9URVJNSU5BVEUgICAgICAgIFNJR1RFUk0KKyNlbmRpZgorCitpbnQgc2V0X3NvY2tldF9vcHRpb25zKFNPQ0tFVCwgaW50KTsKK2ludCBtYWtlX3NvY2tldHMoU09DS0VUWzJdKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3IgY2xpZW50LmMgKi8KKworQ0xJICphbGxvY19jbGllbnRfc2Vzc2lvbihTRVJWSUNFX09QVElPTlMgKiwgU09DS0VULCBTT0NLRVQpOwordm9pZCAqY2xpZW50X3RocmVhZCh2b2lkICopOwordm9pZCBjbGllbnRfbWFpbihDTEkgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIG5ldHdvcmsuYyAqLworCitpbnQgc19jb25uZWN0KENMSSAqLCBTT0NLQUREUl9VTklPTiAqLCBzb2NrbGVuX3QpOwordm9pZCBzX3dyaXRlKENMSSAqLCBTT0NLRVQgZmQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgc19yZWFkKENMSSAqLCBTT0NLRVQgZmQsIHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgZmRfcHV0bGluZShDTEkgKiwgU09DS0VULCBjb25zdCBjaGFyICopOworY2hhciAqZmRfZ2V0bGluZShDTEkgKiwgU09DS0VUKTsKKy8qIGRlc2NyaXB0b3IgdmVyc2lvbnMgb2YgZnByaW50Zi9mc2NhbmYgKi8KK3ZvaWQgZmRfcHJpbnRmKENMSSAqLCBTT0NLRVQsIGNvbnN0IGNoYXIgKiwgLi4uKQorI2lmZGVmIF9fR05VQ19fCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKKyNlbHNlCisgICAgOworI2VuZGlmCit2b2lkIHNfc3NsX3dyaXRlKENMSSAqLCBjb25zdCB2b2lkICosIGludCk7Cit2b2lkIHNfc3NsX3JlYWQoQ0xJICosIHZvaWQgKiwgaW50KTsKK2NoYXIgKnNzbF9nZXRzdHJpbmcoQ0xJICpjKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlIGZvciBwcm90b2NvbC5jICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgUFJPVE9DT0xfQ0hFQ0ssCisgICAgUFJPVE9DT0xfRUFSTFksCisgICAgUFJPVE9DT0xfTUlERExFLAorICAgIFBST1RPQ09MX0xBVEUKK30gUEhBU0U7CisKK2NoYXIgKnByb3RvY29sKENMSSAqLCBTRVJWSUNFX09QVElPTlMgKm9wdCwgY29uc3QgUEhBU0UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm90b3R5cGVzIGZvciByZXNvbHZlci5jICovCisKK3ZvaWQgcmVzb2x2ZXJfaW5pdCgpOworCit1bnNpZ25lZCBuYW1lMmFkZHIoU09DS0FERFJfVU5JT04gKiwgY2hhciAqLCBpbnQpOwordW5zaWduZWQgaG9zdHBvcnQyYWRkcihTT0NLQUREUl9VTklPTiAqLCBjaGFyICosIGNoYXIgKiwgaW50KTsKKwordW5zaWduZWQgbmFtZTJhZGRybGlzdChTT0NLQUREUl9MSVNUICosIGNoYXIgKik7Cit1bnNpZ25lZCBob3N0cG9ydDJhZGRybGlzdChTT0NLQUREUl9MSVNUICosIGNoYXIgKiwgY2hhciAqKTsKKwordm9pZCBhZGRybGlzdF9jbGVhcihTT0NLQUREUl9MSVNUICosIGludCk7Cit1bnNpZ25lZCBhZGRybGlzdF9kdXAoU09DS0FERFJfTElTVCAqLCBjb25zdCBTT0NLQUREUl9MSVNUICopOwordW5zaWduZWQgYWRkcmxpc3RfcmVzb2x2ZShTT0NLQUREUl9MSVNUICopOworCitjaGFyICpzX250b3AoU09DS0FERFJfVU5JT04gKiwgc29ja2xlbl90KTsKK3NvY2tsZW5fdCBhZGRyX2xlbihjb25zdCBTT0NLQUREUl9VTklPTiAqKTsKK2NvbnN0IGNoYXIgKnNfZ2FpX3N0cmVycm9yKGludCk7CisKKyNpZm5kZWYgSEFWRV9HRVROQU1FSU5GTworCisjaWZuZGVmIE5JX05VTUVSSUNIT1NUCisjZGVmaW5lIE5JX05VTUVSSUNIT1NUICAyCisjZW5kaWYKKyNpZm5kZWYgTklfTlVNRVJJQ1NFUlYKKyNkZWZpbmUgTklfTlVNRVJJQ1NFUlYgIDgKKyNlbmRpZgorCisjaWZkZWYgVVNFX1dJTjMyCisKKy8qIHJlbmFtZSBzb21lIGxvY2FsbHkgc2hhZG93ZWQgZGVjbGFyYXRpb25zICovCisjZGVmaW5lIGdldG5hbWVpbmZvICAgICBsb2NhbF9nZXRuYW1laW5mbworCisjaWZuZGVmIF9XSU4zMl9XQ0UKK3R5cGVkZWYgaW50IChDQUxMQkFDSyAqIEdFVEFERFJJTkZPKSAoY29uc3QgY2hhciAqLAorICAgIGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIHN0cnVjdCBhZGRyaW5mbyAqKik7Cit0eXBlZGVmIHZvaWQgKENBTExCQUNLICogRlJFRUFERFJJTkZPKSAoc3RydWN0IGFkZHJpbmZvIEZBUiAqKTsKK3R5cGVkZWYgaW50IChDQUxMQkFDSyAqIEdFVE5BTUVJTkZPKSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCwKKyAgICBjaGFyICosIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIGludCk7CitleHRlcm4gR0VUQUREUklORk8gc19nZXRhZGRyaW5mbzsKK2V4dGVybiBGUkVFQUREUklORk8gc19mcmVlYWRkcmluZm87CitleHRlcm4gR0VUTkFNRUlORk8gc19nZXRuYW1laW5mbzsKKyNlbmRpZiAvKiAhIF9XSU4zMl9XQ0UgKi8KKworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCitpbnQgZ2V0bmFtZWluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCwKKyAgICBjaGFyICosIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIGludCk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZCBIQVZFX0dFVE5BTUVJTkZPICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIHN0aHJlYWRzLmMgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBDUklUX1NFU1NJT04sIENSSVRfQUREUiwKKyAgICBDUklUX0NMSUVOVFMsIENSSVRfU1NMLCAgICAgICAgICAgICAgICAgLyogY2xpZW50LmMgKi8KKyAgICBDUklUX0lORVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb2x2ZXIuYyAqLworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBDUklUX0xJQldSQVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGlid3JhcC5jICovCisjZW5kaWYKKyAgICBDUklUX0xPRywgQ1JJVF9JRCwgQ1JJVF9MRUFLLCAgICAgICAgICAgLyogbG9nLmMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorICAgIENSSVRfREgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHguYyAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fREggKi8KKyAgICBDUklUX1NFQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNyaXRpY2FsIHNlY3Rpb25zICovCit9IFNFQ1RJT05fQ09ERTsKKwordm9pZCBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKFNFQ1RJT05fQ09ERSk7Cit2b2lkIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oU0VDVElPTl9DT0RFKTsKK2ludCBzdGhyZWFkc19pbml0KHZvaWQpOwordW5zaWduZWQgbG9uZyBzdHVubmVsX3Byb2Nlc3NfaWQodm9pZCk7Cit1bnNpZ25lZCBsb25nIHN0dW5uZWxfdGhyZWFkX2lkKHZvaWQpOworaW50IGNyZWF0ZV9jbGllbnQoU09DS0VULCBTT0NLRVQsIENMSSAqLCB2b2lkICooKikodm9pZCAqKSk7CisjaWZkZWYgVVNFX1VDT05URVhUCit0eXBlZGVmIHN0cnVjdCBDT05URVhUX1NUUlVDVFVSRSB7CisgICAgY2hhciAqc3RhY2s7IC8qIENQVSBzdGFjayBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGlkOworICAgIHVjb250ZXh0X3QgY29udGV4dDsKKyAgICBzX3BvbGxfc2V0ICpmZHM7CisgICAgaW50IHJlYWR5OyAvKiBudW1iZXIgb2YgcmVhZHkgZmlsZSBkZXNjcmlwdG9ycyAqLworICAgIHRpbWVfdCBmaW5pc2g7IC8qIHdoZW4gdG8gZmluaXNoIHBvbGwoKSBmb3IgdGhpcyBjb250ZXh0ICovCisgICAgc3RydWN0IENPTlRFWFRfU1RSVUNUVVJFICpuZXh0OyAvKiBuZXh0IGNvbnRleHQgb24gYSBsaXN0ICovCisgICAgdm9pZCAqdGxzOyAvKiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgdGxzLmMgKi8KK30gQ09OVEVYVDsKK2V4dGVybiBDT05URVhUICpyZWFkeV9oZWFkLCAqcmVhZHlfdGFpbDsKK2V4dGVybiBDT05URVhUICp3YWl0aW5nX2hlYWQsICp3YWl0aW5nX3RhaWw7CisjZW5kaWYKKyNpZmRlZiBfV0lOMzJfV0NFCitsb25nIF9iZWdpbnRocmVhZCh2b2lkICgqKSh2b2lkICopLCBpbnQsIHZvaWQgKik7Cit2b2lkIF9lbmR0aHJlYWQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBERUJVR19TVEFDS19TSVpFCit2b2lkIHN0YWNrX2luZm8oaW50KTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm90b3R5cGVzIGZvciBmaWxlLmMgKi8KKworI2lmbmRlZiBVU0VfV0lOMzIKK0RJU0tfRklMRSAqZmlsZV9mZG9wZW4oaW50KTsKKyNlbmRpZgorRElTS19GSUxFICpmaWxlX29wZW4oY2hhciAqLCBGSUxFX01PREUgbW9kZSk7Cit2b2lkIGZpbGVfY2xvc2UoRElTS19GSUxFICopOworc3NpemVfdCBmaWxlX2dldGxpbmUoRElTS19GSUxFICosIGNoYXIgKiwgaW50KTsKK3NzaXplX3QgZmlsZV9wdXRsaW5lKERJU0tfRklMRSAqLCBjaGFyICopOworaW50IGZpbGVfcGVybWlzc2lvbnMoY29uc3QgY2hhciAqKTsKKworI2lmZGVmIFVTRV9XSU4zMgorTFBUU1RSIHN0cjJ0c3RyKExQQ1NUUik7CitMUFNUUiB0c3RyMnN0cihMUENUU1RSKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBwcm90b3R5cGVzIGZvciBsaWJ3cmFwLmMgKi8KKworaW50IGxpYndyYXBfaW5pdCgpOwordm9pZCBsaWJ3cmFwX2F1dGgoQ0xJICosIGNoYXIgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIHRscy5jICovCisKK2V4dGVybiB2b2xhdGlsZSBpbnQgdGxzX2luaXRpYWxpemVkOworCit2b2lkIHRsc19pbml0KCk7CitUTFNfREFUQSAqdGxzX2FsbG9jKENMSSAqLCBUTFNfREFUQSAqLCBjaGFyICopOwordm9pZCB0bHNfY2xlYW51cCgpOwordm9pZCB0bHNfc2V0KFRMU19EQVRBICopOworVExTX0RBVEEgKnRsc19nZXQoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyBmb3Igc3RyLmMgKi8KKworZXh0ZXJuIFRMU19EQVRBICp1aV90bHM7Cit0eXBlZGVmIHN0cnVjdCBhbGxvY19saXN0X3N0cnVjdCBBTExPQ19MSVNUOworCitzdHJ1Y3QgdGxzX2RhdGFfc3RydWN0IHsKKyAgICBBTExPQ19MSVNUICphbGxvY19oZWFkOworICAgIHNpemVfdCBhbGxvY19ieXRlcywgYWxsb2NfYmxvY2tzOworICAgIENMSSAqYzsKKyAgICBTRVJWSUNFX09QVElPTlMgKm9wdDsKKyAgICBjaGFyICppZDsKK307CisKK3ZvaWQgc3RyX2luaXQoVExTX0RBVEEgKik7Cit2b2lkIHN0cl9jbGVhbnVwKFRMU19EQVRBICopOworY2hhciAqc3RyX2R1cF9kZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNkZWZpbmUgc3RyX2R1cChhKSBzdHJfZHVwX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQorY2hhciAqc3RyX3ZwcmludGYoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK2NoYXIgKnN0cl9wcmludGYoY29uc3QgY2hhciAqLCAuLi4pCisjaWZkZWYgX19HTlVDX18KKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworI2Vsc2UKKyAgICA7CisjZW5kaWYKKyNpZmRlZiBVU0VfV0lOMzIKK0xQVFNUUiBzdHJfdHByaW50ZihMUENUU1RSLCAuLi4pOworI2VuZGlmCisKK3ZvaWQgc3RyX2NhbmFyeV9pbml0KCk7Cit2b2lkIHN0cl9zdGF0cygpOwordm9pZCAqc3RyX2FsbG9jX2RlYnVnKHNpemVfdCwgY29uc3QgY2hhciAqLCBpbnQpOworI2RlZmluZSBzdHJfYWxsb2MoYSkgc3RyX2FsbG9jX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCAqc3RyX2FsbG9jX2RldGFjaGVkX2RlYnVnKHNpemVfdCwgY29uc3QgY2hhciAqLCBpbnQpOworI2RlZmluZSBzdHJfYWxsb2NfZGV0YWNoZWQoYSkgc3RyX2FsbG9jX2RldGFjaGVkX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCAqc3RyX3JlYWxsb2NfZGVidWcodm9pZCAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNkZWZpbmUgc3RyX3JlYWxsb2MoYSwgYikgc3RyX3JlYWxsb2NfZGVidWcoKGEpLCAoYiksIF9fRklMRV9fLCBfX0xJTkVfXykKK3ZvaWQgc3RyX2RldGFjaF9kZWJ1Zyh2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNkZWZpbmUgc3RyX2RldGFjaChhKSBzdHJfZGV0YWNoX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCBzdHJfZnJlZV9kZWJ1Zyh2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNkZWZpbmUgc3RyX2ZyZWUoYSkgc3RyX2ZyZWVfZGVidWcoKGEpLCBfX0ZJTEVfXywgX19MSU5FX18pLCAoYSk9TlVMTAorI2RlZmluZSBzdHJfZnJlZV9leHByZXNzaW9uKGEpIHN0cl9mcmVlX2RlYnVnKChhKSwgX19GSUxFX18sIF9fTElORV9fKQorCitpbnQgc2FmZV9tZW1jbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgZm9yIHVpXyouYyAqLworCit2b2lkIHVpX2NvbmZpZ19yZWxvYWRlZCh2b2lkKTsKK3ZvaWQgdWlfbmV3X2NoYWluKGNvbnN0IHVuc2lnbmVkKTsKK3ZvaWQgdWlfY2xpZW50cyhjb25zdCBsb25nKTsKKwordm9pZCB1aV9uZXdfbG9nKGNvbnN0IGNoYXIgKik7CisjaWZkZWYgVVNFX1dJTjMyCit2b2lkIG1lc3NhZ2VfYm94KExQQ1RTVFIsIGNvbnN0IFVJTlQpOworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCitpbnQgcGFzc3dkX2NiKGNoYXIgKiwgaW50LCBpbnQsIHZvaWQgKik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitpbnQgcGluX2NiKFVJICosIFVJX1NUUklORyAqKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgKi8KKworI2lmZGVmIElDT05fSU1BR0UKK0lDT05fSU1BR0UgbG9hZF9pY29uX2RlZmF1bHQoSUNPTl9UWVBFKTsKK0lDT05fSU1BR0UgbG9hZF9pY29uX2ZpbGUoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjZW5kaWYgLyogZGVmaW5lZCBQUk9UT1RZUEVTX0ggKi8KKworLyogZW5kIG9mIHByb3RvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3B0eS5jIGIvc3JjL3B0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2JjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHR5LmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworI2lmZGVmIEhBVkVfVVRJTF9ICisjaW5jbHVkZSA8dXRpbC5oPgorI2VuZGlmIC8qIEhBVkVfVVRJTF9IICovCisKKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYgLyogSEFWRV9TWVNfSU9DVExfSCAqLworCisvKiBwdHkgYWxsb2NhdGVkIHdpdGggX2dldHB0eSBnZXRzIGJyb2tlbiBpZiB3ZSBkbyBJX1BVU0g6ZXMgdG8gaXQuICovCisjaWYgZGVmaW5lZChIQVZFX19HRVRQVFkpIHx8IGRlZmluZWQoSEFWRV9PUEVOUFRZKQorI3VuZGVmIEhBVkVfREVWX1BUTVgKKyNlbmRpZiAvKiBIQVZFX19HRVRQVFkgfHwgSEFWRV9PUEVOUFRZICovCisKKyNpZmRlZiBIQVZFX1BUWV9ICisjaW5jbHVkZSA8cHR5Lmg+CisjZW5kaWYgLyogSEFWRV9QVFlfSCAqLworCisjaWZkZWYgSEFWRV9MSUJVVElMX0gKKyNpbmNsdWRlIDxsaWJ1dGlsLmg+CisjZW5kaWYgLyogSEFWRV9MSUJVVElMX0ggKi8KKworI2lmbmRlZiBPX05PQ1RUWQorI2RlZmluZSBPX05PQ1RUWSAwCisjZW5kaWYgLyogT19OT0NUVFkgKi8KKworLyoKKyAqIGFsbG9jYXRlcyBhbmQgb3BlbnMgYSBwdHkKKyAqIHJldHVybnMgLTEgaWYgbm8gcHR5IGNvdWxkIGJlIGFsbG9jYXRlZCwgb3IgemVybyBpZiBhIHB0eSB3YXMgc3VjY2Vzc2Z1bGx5CisgKiBhbGxvY2F0ZWQKKyAqIG9uIHN1Y2Nlc3MsIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIHB0eSBhbmQgdHR5IHNpZGVzIGFuZCB0aGUgbmFtZSBvZgorICogdGhlIHR0eSBzaWRlIGFyZSByZXR1cm5lZAorICogdGhlIGJ1ZmZlciBtdXN0IGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdCA2NCBjaGFyYWN0ZXJzCisgKi8KKworaW50IHB0eV9hbGxvY2F0ZShpbnQgKnB0eWZkLCBpbnQgKnR0eWZkLCBjaGFyICpuYW1lYnVmKSB7CisjaWYgZGVmaW5lZChIQVZFX09QRU5QVFkpIHx8IGRlZmluZWQoQlNENF80KSAmJiAhZGVmaW5lZChfX0lOTk9URUtfTElCQ19fKQorICAgIC8qIG9wZW5wdHkoMykgZXhpc3RzIGluIE9TRi8xIGFuZCBzb21lIG90aGVyIG9zJ2VzICovCisgICAgY2hhciBidWZbNjRdOworICAgIGludCBpOworCisgICAgaT1vcGVucHR5KHB0eWZkLCB0dHlmZCwgYnVmLCBOVUxMLCBOVUxMKTsKKyAgICBpZihpPDApIHsKKyAgICAgICAgaW9lcnJvcigib3BlbnB0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0cmNweShuYW1lYnVmLCBidWYpOyAvKiBwb3NzaWJsZSB0cnVuY2F0aW9uICovCisgICAgcmV0dXJuIDA7CisjZWxzZSAvKiBIQVZFX09QRU5QVFkgKi8KKyNpZmRlZiBIQVZFX19HRVRQVFkKKyAgICAvKgorICAgICAqIF9nZXRwdHkoMykgZXhpc3RzIGluIFNHSSBJcml4IDQueCwgNS54ICYgNi54IC0tIGl0IGdlbmVyYXRlcyBtb3JlCisgICAgICogcHR5J3MgYXV0b21hZ2ljYWxseSB3aGVuIG5lZWRlZAorICAgICAqLworICAgIGNoYXIgKnNsYXZlOworCisgICAgc2xhdmU9X2dldHB0eShwdHlmZCwgT19SRFdSLCAwNjIyLCAwKTsKKyAgICBpZihzbGF2ZT09TlVMTCkgeworICAgICAgICBpb2Vycm9yKCJfZ2V0cHR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RyY3B5KG5hbWVidWYsIHNsYXZlKTsKKyAgICAvKiBvcGVuIHRoZSBzbGF2ZSBzaWRlICovCisgICAgKnR0eWZkPW9wZW4obmFtZWJ1ZiwgT19SRFdSfE9fTk9DVFRZKTsKKyAgICBpZigqdHR5ZmQ8MCkgeworICAgICAgICBpb2Vycm9yKG5hbWVidWYpOworICAgICAgICBjbG9zZSgqcHR5ZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworI2Vsc2UgLyogSEFWRV9fR0VUUFRZICovCisjaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKQorICAgIC8qCisgICAgICogdGhpcyBjb2RlIGlzIHVzZWQgZS5nLiBvbiBTb2xhcmlzIDIueAorICAgICAqIG5vdGUgdGhhdCBTb2xhcmlzIDIuMyAqIGFsc28gaGFzIGJzZC1zdHlsZSBwdHlzLCBidXQgdGhleSBzaW1wbHkgZG8gbm90CisgICAgICogd29yaworICAgICAqLworICAgIGludCBwdG07IGNoYXIgKnB0czsKKworICAgIHB0bT1vcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1J8T19OT0NUVFkpOworICAgIGlmKHB0bTwwKSB7CisgICAgICAgIGlvZXJyb3IoIi9kZXYvcHRteCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKGdyYW50cHQocHRtKTwwKSB7CisgICAgICAgIGlvZXJyb3IoImdyYW50cHQiKTsKKyAgICAgICAgLyogcmV0dXJuIC0xOyAqLworICAgICAgICAvKiBjYW4geW91IHRlbGwgbWUgd2h5IGl0IGRvZXNuJ3Qgd29yaz8gKi8KKyAgICB9CisgICAgaWYodW5sb2NrcHQocHRtKTwwKSB7CisgICAgICAgIGlvZXJyb3IoInVubG9ja3B0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHRzPXB0c25hbWUocHRtKTsKKyAgICBpZihwdHM9PU5VTEwpCisgICAgICAgIHNfbG9nKExPR19FUlIsICJTbGF2ZSBwdHkgc2lkZSBuYW1lIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCIpOworICAgIHN0cmNweShuYW1lYnVmLCBwdHMpOworICAgICpwdHlmZD1wdG07CisKKyAgICAvKiBvcGVuIHRoZSBzbGF2ZSBzaWRlICovCisgICAgKnR0eWZkPW9wZW4obmFtZWJ1ZiwgT19SRFdSfE9fTk9DVFRZKTsKKyAgICBpZigqdHR5ZmQ8MCkgeworICAgICAgICBpb2Vycm9yKG5hbWVidWYpOworICAgICAgICBjbG9zZSgqcHR5ZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIHB1c2ggdGhlIGFwcHJvcHJpYXRlIHN0cmVhbXMgbW9kdWxlcywgYXMgZGVzY3JpYmVkIGluIFNvbGFyaXMgcHRzKDcpICovCisgICAgaWYoaW9jdGwoKnR0eWZkLCBJX1BVU0gsICJwdGVtIik8MCkKKyAgICAgICAgaW9lcnJvcigiaW9jdGwgSV9QVVNIIHB0ZW0iKTsKKyAgICBpZihpb2N0bCgqdHR5ZmQsIElfUFVTSCwgImxkdGVybSIpPDApCisgICAgICAgIGlvZXJyb3IoImlvY3RsIElfUFVTSCBsZHRlcm0iKTsKKyAgICBpZihpb2N0bCgqdHR5ZmQsIElfUFVTSCwgInR0Y29tcGF0Iik8MCkKKyAgICAgICAgaW9lcnJvcigiaW9jdGwgSV9QVVNIIHR0Y29tcGF0Iik7CisgICAgcmV0dXJuIDA7CisjZWxzZSAvKiBIQVZFX0RFVl9QVE1YICovCisjaWZkZWYgSEFWRV9ERVZfUFRTX0FORF9QVEMKKyAgICAvKiBBSVgtc3R5bGUgcHR5IGNvZGUuICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICpwdHlmZD1vcGVuKCIvZGV2L3B0YyIsIE9fUkRXUnxPX05PQ1RUWSk7CisgICAgaWYoKnB0eWZkPDApIHsKKyAgICAgICAgaW9lcnJvcigib3BlbigvZGV2L3B0YykiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuYW1lPXR0eW5hbWUoKnB0eWZkKTsKKyAgICBpZighbmFtZSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiT3BlbiBvZiAvZGV2L3B0YyByZXR1cm5zIGRldmljZSBmb3Igd2hpY2ggdHR5bmFtZSBmYWlscyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0cmNweShuYW1lYnVmLCBuYW1lKTsKKyAgICAqdHR5ZmQ9b3BlbihuYW1lLCBPX1JEV1J8T19OT0NUVFkpOworICAgIGlmKCp0dHlmZDwwKSB7CisgICAgICAgIGlvZXJyb3IobmFtZSk7CisgICAgICAgIGNsb3NlKCpwdHlmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxzZSAvKiBIQVZFX0RFVl9QVFNfQU5EX1BUQyAqLworICAgIC8qIEJTRC1zdHlsZSBwdHkgY29kZS4gKi8KKyAgICBjaGFyIGJ1Zls2NF07CisgICAgc2l6ZV90IGk7CisgICAgY29uc3QgY2hhciAqcHR5bWFqb3JzPSJwcXJzdHV2d3h5emFiY2RlZmdoaWprbG1ub0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKyAgICBjb25zdCBjaGFyICpwdHltaW5vcnM9IjAxMjM0NTY3ODlhYmNkZWYiOworICAgIHNpemVfdCBudW1fbWlub3JzPXN0cmxlbihwdHltaW5vcnMpOworICAgIHNpemVfdCBudW1fcHR5cz1zdHJsZW4ocHR5bWFqb3JzKSpudW1fbWlub3JzOworCisgICAgZm9yKGk9MDsgaTxudW1fcHR5czsgaSsrKSB7CisjaWZkZWYgSEFWRV9TTlBSSU5URgorICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsCisjZWxzZQorICAgICAgICBzcHJpbnRmKGJ1ZiwKKyNlbmRpZgorICAgICAgICAgICAgICIvZGV2L3B0eSVjJWMiLCBwdHltYWpvcnNbaS9udW1fbWlub3JzXSwKKyAgICAgICAgICAgICBwdHltaW5vcnNbaSVudW1fbWlub3JzXSk7CisgICAgICAgICpwdHlmZD1vcGVuKGJ1ZiwgT19SRFdSfE9fTk9DVFRZKTsKKyAgICAgICAgaWYoKnB0eWZkPDApCisgICAgICAgICAgICBjb250aW51ZTsKKyNpZmRlZiBIQVZFX1NOUFJJTlRGCisgICAgICAgIHNucHJpbnRmKG5hbWVidWYsIDY0LAorI2Vsc2UKKyAgICAgICAgc3ByaW50ZihuYW1lYnVmLAorI2VuZGlmCisgICAgICAgICAgICAiL2Rldi90dHklYyVjIiwKKyAgICAgICAgICAgIHB0eW1ham9yc1tpL251bV9taW5vcnNdLCBwdHltaW5vcnNbaSVudW1fbWlub3JzXSk7CisKKyAgICAgICAgLyogb3BlbiB0aGUgc2xhdmUgc2lkZSAqLworICAgICAgICAqdHR5ZmQ9b3BlbihuYW1lYnVmLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisgICAgICAgIGlmKCp0dHlmZDwwKSB7CisgICAgICAgICAgICBpb2Vycm9yKG5hbWVidWYpOworICAgICAgICAgICAgY2xvc2UoKnB0eWZkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qIEhBVkVfREVWX1BUU19BTkRfUFRDICovCisjZW5kaWYgLyogSEFWRV9ERVZfUFRNWCAqLworI2VuZGlmIC8qIEhBVkVfX0dFVFBUWSAqLworI2VuZGlmIC8qIEhBVkVfT1BFTlBUWSAqLworfQorCisvKiBlbmQgb2YgcHR5LmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9yZXNvbHZlci5jIGIvc3JjL3Jlc29sdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkYzRmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9yZXNvbHZlci5jCkBAIC0wLDAgKzEsNjAzIEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHByb3RvdHlwZXMgKi8KKworI2lmIGRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorTk9FWFBPUlQgaW50IGdldF9pcHY2KExQVFNUUik7CisjZW5kaWYKK05PRVhQT1JUIHZvaWQgYWRkcmxpc3QyYWRkcihTT0NLQUREUl9VTklPTiAqLCBTT0NLQUREUl9MSVNUICopOworTk9FWFBPUlQgdm9pZCBhZGRybGlzdF9yZXNldChTT0NLQUREUl9MSVNUICopOworCisjaWZuZGVmIEhBVkVfR0VUQUREUklORk8KKworI2lmbmRlZiBFQUlfTUVNT1JZCisjZGVmaW5lIEVBSV9NRU1PUlkgMQorI2VuZGlmCisjaWZuZGVmIEVBSV9OT05BTUUKKyNkZWZpbmUgRUFJX05PTkFNRSAyCisjZW5kaWYKKyNpZm5kZWYgRUFJX1NFUlZJQ0UKKyNkZWZpbmUgRUFJX1NFUlZJQ0UgOAorI2VuZGlmCisKKy8qIHJlbmFtZSBzb21lIHBvdGVudGlhbGx5IGxvY2FsbHkgc2hhZG93ZWQgZGVjbGFyYXRpb25zICovCisjZGVmaW5lIGdldGFkZHJpbmZvICAgICBsb2NhbF9nZXRhZGRyaW5mbworI2RlZmluZSBmcmVlYWRkcmluZm8gICAgbG9jYWxfZnJlZWFkZHJpbmZvCisKKyNpZm5kZWYgSEFWRV9TVFJVQ1RfQUREUklORk8KK3N0cnVjdCBhZGRyaW5mbyB7CisgICAgaW50IGFpX2ZsYWdzOworICAgIGludCBhaV9mYW1pbHk7CisgICAgaW50IGFpX3NvY2t0eXBlOworICAgIGludCBhaV9wcm90b2NvbDsKKyAgICBpbnQgYWlfYWRkcmxlbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CisgICAgY2hhciAqYWlfY2Fub25uYW1lOworICAgIHN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsKK307CisjZW5kaWYKKworI2lmbmRlZiBBSV9QQVNTSVZFCisjZGVmaW5lIEFJX1BBU1NJVkUgMQorI2VuZGlmCisKK05PRVhQT1JUIGludCBnZXRhZGRyaW5mbyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKyAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgc3RydWN0IGFkZHJpbmZvICoqKTsKK05PRVhQT1JUIGludCBhbGxvY19hZGRyZXNzZXMoc3RydWN0IGhvc3RlbnQgKiwgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosCisgICAgdV9zaG9ydCBwb3J0LCBzdHJ1Y3QgYWRkcmluZm8gKiosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitOT0VYUE9SVCB2b2lkIGZyZWVhZGRyaW5mbyhzdHJ1Y3QgYWRkcmluZm8gKik7CisKKyNlbmRpZiAvKiAhZGVmaW5lZCBIQVZFX0dFVEFERFJJTkZPICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHJlc29sdmVyIGluaXRpYWxpemF0aW9uICovCisKKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKK0dFVEFERFJJTkZPIHNfZ2V0YWRkcmluZm87CitGUkVFQUREUklORk8gc19mcmVlYWRkcmluZm87CitHRVROQU1FSU5GTyBzX2dldG5hbWVpbmZvOworI2VuZGlmCisKK3ZvaWQgcmVzb2x2ZXJfaW5pdCgpIHsKKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBpZihnZXRfaXB2NihURVhUKCJ3czJfMzIuZGxsIikpKSAvKiBJUHY2IGluIFdpbmRvd3MgWFAgb3IgaGlnaGVyICovCisgICAgICAgIHJldHVybjsKKyAgICBpZihnZXRfaXB2NihURVhUKCJ3c2hpcDYuZGxsIikpKSAvKiBleHBlcmltZW50YWwgSVB2NiBmb3IgV2luZG93cyAyMDAwICovCisgICAgICAgIHJldHVybjsKKyAgICAvKiBmYWxsIGJhY2sgdG8gdGhlIGJ1aWx0LWluIGVtdWxhdGlvbiAqLworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKK05PRVhQT1JUIGludCBnZXRfaXB2NihMUFRTVFIgZmlsZSkgeworICAgIEhJTlNUQU5DRSBoYW5kbGU7CisKKyAgICBoYW5kbGU9TG9hZExpYnJhcnkoZmlsZSk7CisgICAgaWYoIWhhbmRsZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc19nZXRhZGRyaW5mbz0oR0VUQUREUklORk8pR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAiZ2V0YWRkcmluZm8iKTsKKyAgICBzX2ZyZWVhZGRyaW5mbz0oRlJFRUFERFJJTkZPKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgImZyZWVhZGRyaW5mbyIpOworICAgIHNfZ2V0bmFtZWluZm89KEdFVE5BTUVJTkZPKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgImdldG5hbWVpbmZvIik7CisgICAgaWYoIXNfZ2V0YWRkcmluZm8gfHwgIXNfZnJlZWFkZHJpbmZvIHx8ICFzX2dldG5hbWVpbmZvKSB7CisgICAgICAgIHNfZ2V0YWRkcmluZm89TlVMTDsKKyAgICAgICAgc19mcmVlYWRkcmluZm89TlVMTDsKKyAgICAgICAgc19nZXRuYW1laW5mbz1OVUxMOworICAgICAgICBGcmVlTGlicmFyeShoYW5kbGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIElQdjYgZGV0ZWN0ZWQgLT4gT0sgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzdHVubmVsIHJlc29sdmVyIEFQSSAqLworCit1bnNpZ25lZCBuYW1lMmFkZHIoU09DS0FERFJfVU5JT04gKmFkZHIsIGNoYXIgKm5hbWUsIGludCBwYXNzaXZlKSB7CisgICAgU09DS0FERFJfTElTVCAqYWRkcl9saXN0OworICAgIHVuc2lnbmVkIHJldHZhbDsKKworICAgIGFkZHJfbGlzdD1zdHJfYWxsb2Moc2l6ZW9mKFNPQ0tBRERSX0xJU1QpKTsKKyAgICBhZGRybGlzdF9jbGVhcihhZGRyX2xpc3QsIHBhc3NpdmUpOworICAgIHJldHZhbD1uYW1lMmFkZHJsaXN0KGFkZHJfbGlzdCwgbmFtZSk7CisgICAgaWYocmV0dmFsKQorICAgICAgICBhZGRybGlzdDJhZGRyKGFkZHIsIGFkZHJfbGlzdCk7CisgICAgc3RyX2ZyZWUoYWRkcl9saXN0LT5hZGRyKTsKKyAgICBzdHJfZnJlZShhZGRyX2xpc3QpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3Vuc2lnbmVkIGhvc3Rwb3J0MmFkZHIoU09DS0FERFJfVU5JT04gKmFkZHIsCisgICAgICAgIGNoYXIgKmhvc3RfbmFtZSwgY2hhciAqcG9ydF9uYW1lLCBpbnQgcGFzc2l2ZSkgeworICAgIFNPQ0tBRERSX0xJU1QgKmFkZHJfbGlzdDsKKyAgICB1bnNpZ25lZCByZXR2YWw7CisKKyAgICBhZGRyX2xpc3Q9c3RyX2FsbG9jKHNpemVvZihTT0NLQUREUl9MSVNUKSk7CisgICAgYWRkcmxpc3RfY2xlYXIoYWRkcl9saXN0LCBwYXNzaXZlKTsKKyAgICByZXR2YWw9aG9zdHBvcnQyYWRkcmxpc3QoYWRkcl9saXN0LCBob3N0X25hbWUsIHBvcnRfbmFtZSk7CisgICAgaWYocmV0dmFsKQorICAgICAgICBhZGRybGlzdDJhZGRyKGFkZHIsIGFkZHJfbGlzdCk7CisgICAgc3RyX2ZyZWUoYWRkcl9saXN0LT5hZGRyKTsKKyAgICBzdHJfZnJlZShhZGRyX2xpc3QpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK05PRVhQT1JUIHZvaWQgYWRkcmxpc3QyYWRkcihTT0NLQUREUl9VTklPTiAqYWRkciwgU09DS0FERFJfTElTVCAqYWRkcl9saXN0KSB7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvcihpPTA7IGk8YWRkcl9saXN0LT5udW07ICsraSkgeyAvKiBmaW5kIHRoZSBmaXJzdCBJUHY0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoYWRkcl9saXN0LT5hZGRyW2ldLmluLnNpbl9mYW1pbHk9PUFGX0lORVQpIHsKKyAgICAgICAgICAgIG1lbWNweShhZGRyLCAmYWRkcl9saXN0LT5hZGRyW2ldLCBzaXplb2YoU09DS0FERFJfVU5JT04pKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBVU0VfSVB2NgorICAgIGZvcihpPTA7IGk8YWRkcl9saXN0LT5udW07ICsraSkgeyAvKiBmaW5kIHRoZSBmaXJzdCBJUHY2IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoYWRkcl9saXN0LT5hZGRyW2ldLmluLnNpbl9mYW1pbHk9PUFGX0lORVQ2KSB7CisgICAgICAgICAgICBtZW1jcHkoYWRkciwgJmFkZHJfbGlzdC0+YWRkcltpXSwgc2l6ZW9mKFNPQ0tBRERSX1VOSU9OKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBjb3B5IHRoZSBmaXJzdCBhZGRyZXNzIHJlc29sdmVkIChjdXJlbnRseSBBRl9VTklYKSAqLworICAgIG1lbWNweShhZGRyLCAmYWRkcl9saXN0LT5hZGRyWzBdLCBzaXplb2YoU09DS0FERFJfVU5JT04pKTsKK30KKwordW5zaWduZWQgbmFtZTJhZGRybGlzdChTT0NLQUREUl9MSVNUICphZGRyX2xpc3QsIGNoYXIgKm5hbWUpIHsKKyAgICBjaGFyICp0bXAsICpob3N0X25hbWUsICpwb3J0X25hbWU7CisgICAgdW5zaWduZWQgcmV0dmFsOworCisgICAgLyogZmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhIFVOSVggc29ja2V0ICovCisjaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfVU4KKyAgICBpZigqbmFtZT09Jy8nKSB7CisgICAgICAgIGlmKG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpK3N0cmxlbihuYW1lKSsxCisgICAgICAgICAgICAgICAgPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSkgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIlVuaXggc29ja2V0IHBhdGggaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBubyByZXN1bHRzICovCisgICAgICAgIH0KKyAgICAgICAgYWRkcl9saXN0LT5hZGRyPXN0cl9yZWFsbG9jKGFkZHJfbGlzdC0+YWRkciwKKyAgICAgICAgICAgIChhZGRyX2xpc3QtPm51bSsxKSpzaXplb2YoU09DS0FERFJfVU5JT04pKTsKKyAgICAgICAgYWRkcl9saXN0LT5hZGRyW2FkZHJfbGlzdC0+bnVtXS51bi5zdW5fZmFtaWx5PUFGX1VOSVg7CisgICAgICAgIHN0cmNweShhZGRyX2xpc3QtPmFkZHJbYWRkcl9saXN0LT5udW1dLnVuLnN1bl9wYXRoLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuICsrKGFkZHJfbGlzdC0+bnVtKTsgLyogb2sgLSByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgKi8KKyAgICB9CisjZW5kaWYKKworICAgIC8qIHNldHVwIGhvc3RfbmFtZSBhbmQgcG9ydF9uYW1lICovCisgICAgdG1wPXN0cl9kdXAobmFtZSk7CisgICAgcG9ydF9uYW1lPXN0cnJjaHIodG1wLCAnOicpOworICAgIGlmKHBvcnRfbmFtZSkgeworICAgICAgICBob3N0X25hbWU9dG1wOworICAgICAgICAqcG9ydF9uYW1lKys9J1wwJzsKKyAgICB9IGVsc2UgeyAvKiBubyAnOicgLSB1c2UgZGVmYXVsdCBob3N0IElQICovCisgICAgICAgIGhvc3RfbmFtZT1OVUxMOworICAgICAgICBwb3J0X25hbWU9dG1wOworICAgIH0KKworICAgIC8qIGZpbGwgYWRkcl9saXN0IHN0cnVjdHVyZSAqLworICAgIHJldHZhbD1ob3N0cG9ydDJhZGRybGlzdChhZGRyX2xpc3QsIGhvc3RfbmFtZSwgcG9ydF9uYW1lKTsKKyAgICBzdHJfZnJlZSh0bXApOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3Vuc2lnbmVkIGhvc3Rwb3J0MmFkZHJsaXN0KFNPQ0tBRERSX0xJU1QgKmFkZHJfbGlzdCwKKyAgICAgICAgY2hhciAqaG9zdF9uYW1lLCBjaGFyICpwb3J0X25hbWUpIHsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM9TlVMTCwgKmN1cjsKKyAgICBpbnQgZXJyLCByZXRyeT0wOworCisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mIGhpbnRzKTsKKyNpZiBkZWZpbmVkKFVTRV9JUHY2KSB8fCBkZWZpbmVkKFVTRV9XSU4zMikKKyAgICBoaW50cy5haV9mYW1pbHk9QUZfVU5TUEVDOworI2Vsc2UKKyAgICBoaW50cy5haV9mYW1pbHk9QUZfSU5FVDsKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlPVNPQ0tfU1RSRUFNOworICAgIGhpbnRzLmFpX3Byb3RvY29sPUlQUFJPVE9fVENQOworICAgIGhpbnRzLmFpX2ZsYWdzPTA7CisgICAgaWYoYWRkcl9saXN0LT5wYXNzaXZlKSB7CisgICAgICAgIGhpbnRzLmFpX2ZhbWlseT1BRl9JTkVUOyAvKiBmaXJzdCB0cnkgSVB2NCBmb3IgcGFzc2l2ZSByZXF1ZXN0cyAqLworICAgICAgICBoaW50cy5haV9mbGFnc3w9QUlfUEFTU0lWRTsKKyAgICB9CisgICAgZm9yKDs7KSB7CisgICAgICAgIGVycj1nZXRhZGRyaW5mbyhob3N0X25hbWUsIHBvcnRfbmFtZSwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgaWYoIWVycikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihyZXMpCisgICAgICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgaWYoZXJyPT1FQUlfQUdBSU4gJiYgKytyZXRyeTw9MykgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiZ2V0YWRkcmluZm86IEVBSV9BR0FJTiByZWNlaXZlZDogcmV0cnlpbmciKTsKKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFVTRV9JUHY2KSB8fCBkZWZpbmVkKFVTRV9XSU4zMikKKyAgICAgICAgaWYoaGludHMuYWlfZmFtaWx5PT1BRl9JTkVUKSB7CisgICAgICAgICAgICBoaW50cy5haV9mYW1pbHk9QUZfVU5TUEVDOworICAgICAgICAgICAgY29udGludWU7IC8qIHJldHJ5IGZvciBub24tSVB2NCBhZGRyZXNzZXMgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZihlcnI9PUVBSV9TRVJWSUNFKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJVbmtub3duIFRDUCBzZXJ2aWNlIFwiJXNcIiIsIHBvcnRfbmFtZSk7CisgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLworICAgIH0KKyAgICBpZihlcnIpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkVycm9yIHJlc29sdmluZyBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgIGhvc3RfbmFtZSA/IGhvc3RfbmFtZSA6CisgICAgICAgICAgICAgICAgKGFkZHJfbGlzdC0+cGFzc2l2ZSA/IERFRkFVTFRfQU5ZIDogREVGQVVMVF9MT09QQkFDSyksCisgICAgICAgICAgICBzX2dhaV9zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIGVycm9yICovCisgICAgfQorCisgICAgLyogY29weSB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgKi8KKyAgICBmb3IoY3VyPXJlczsgY3VyOyBjdXI9Y3VyLT5haV9uZXh0KSB7CisgICAgICAgIGlmKGN1ci0+YWlfYWRkcmxlbj4oaW50KXNpemVvZihTT0NLQUREUl9VTklPTikpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJJTlRFUk5BTCBFUlJPUjogYWlfYWRkcmxlbiB2YWx1ZSB0b28gYmlnIik7CisgICAgICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBubyByZXN1bHRzICovCisgICAgICAgIH0KKyAgICAgICAgYWRkcl9saXN0LT5hZGRyPXN0cl9yZWFsbG9jKGFkZHJfbGlzdC0+YWRkciwKKyAgICAgICAgICAgIChhZGRyX2xpc3QtPm51bSsxKSpzaXplb2YoU09DS0FERFJfVU5JT04pKTsKKyAgICAgICAgbWVtY3B5KCZhZGRyX2xpc3QtPmFkZHJbYWRkcl9saXN0LT5udW1dLCBjdXItPmFpX2FkZHIsCisgICAgICAgICAgICAoc2l6ZV90KWN1ci0+YWlfYWRkcmxlbik7CisgICAgICAgICsrKGFkZHJfbGlzdC0+bnVtKTsKKyAgICB9CisgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIGFkZHJfbGlzdC0+bnVtOyAvKiBvayAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworfQorCisvKiBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgKi8KK3ZvaWQgYWRkcmxpc3RfY2xlYXIoU09DS0FERFJfTElTVCAqYWRkcl9saXN0LCBpbnQgcGFzc2l2ZSkgeworICAgIGFkZHJsaXN0X3Jlc2V0KGFkZHJfbGlzdCk7CisgICAgYWRkcl9saXN0LT5uYW1lcz1OVUxMOworICAgIGFkZHJfbGlzdC0+cGFzc2l2ZT1wYXNzaXZlOworfQorCisvKiBwcmVwYXJlIHRoZSBzdHJ1Y3R1cmUgdG8gcmVzb2x2ZSBuZXcgaG9zdHMgKi8KK05PRVhQT1JUIHZvaWQgYWRkcmxpc3RfcmVzZXQoU09DS0FERFJfTElTVCAqYWRkcl9saXN0KSB7CisgICAgYWRkcl9saXN0LT5udW09MDsKKyAgICBhZGRyX2xpc3QtPmFkZHI9TlVMTDsKKyAgICBhZGRyX2xpc3QtPnJyX3ZhbD0wOyAvKiByZXNldCB0aGUgcm91bmQtcm9iaW4gY291bnRlciAqLworICAgIC8qIGFsbG93IHN0cnVjdHVyZXMgY3JlYXRlZCB3aXRoIHNvY2thZGRyX2R1cCgpIHRvIG1vZGlmeQorICAgICAqIHRoZSBvcmlnaW5hbCBycl92YWwgcmF0aGVyIHRoYW4gaXRzIGxvY2FsIGNvcHkgKi8KKyAgICBhZGRyX2xpc3QtPnJyX3B0cj0mYWRkcl9saXN0LT5ycl92YWw7Cit9CisKK3Vuc2lnbmVkIGFkZHJsaXN0X2R1cChTT0NLQUREUl9MSVNUICpkc3QsIGNvbnN0IFNPQ0tBRERSX0xJU1QgKnNyYykgeworICAgIG1lbWNweShkc3QsIHNyYywgc2l6ZW9mKFNPQ0tBRERSX0xJU1QpKTsKKyAgICBpZihzcmMtPm51bSkgeyAvKiBhbHJlYWR5IHJlc29sdmVkICovCisgICAgICAgIGRzdC0+YWRkcj1zdHJfYWxsb2Moc3JjLT5udW0qc2l6ZW9mKFNPQ0tBRERSX1VOSU9OKSk7CisgICAgICAgIG1lbWNweShkc3QtPmFkZHIsIHNyYy0+YWRkciwgc3JjLT5udW0qc2l6ZW9mKFNPQ0tBRERSX1VOSU9OKSk7CisgICAgfSBlbHNlIHsgLyogZGVsYXllZCByZXNvbHZlciAqLworICAgICAgICBhZGRybGlzdF9yZXNvbHZlKGRzdCk7CisgICAgfQorICAgIHJldHVybiBkc3QtPm51bTsKK30KKwordW5zaWduZWQgYWRkcmxpc3RfcmVzb2x2ZShTT0NLQUREUl9MSVNUICphZGRyX2xpc3QpIHsKKyAgICB1bnNpZ25lZCBudW09MCwgcm5kOworICAgIE5BTUVfTElTVCAqaG9zdDsKKworICAgIGFkZHJsaXN0X3Jlc2V0KGFkZHJfbGlzdCk7CisgICAgZm9yKGhvc3Q9YWRkcl9saXN0LT5uYW1lczsgaG9zdDsgaG9zdD1ob3N0LT5uZXh0KQorICAgICAgICBudW0rPW5hbWUyYWRkcmxpc3QoYWRkcl9saXN0LCBob3N0LT5uYW1lKTsKKyAgICBzd2l0Y2gobnVtKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgICAgYWRkcl9saXN0LT5ycl92YWw9MDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogcmFuZG9taXplIHRoZSBpbml0aWFsIHZhbHVlIG9mIHJvdW5kLXJvYmluIGNvdW50ZXIgKi8KKyAgICAgICAgLyogaWdub3JlIHRoZSBlcnJvciB2YWx1ZSBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBiaWFzICovCisgICAgICAgIFJBTkRfYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKikmcm5kLCBzaXplb2Ygcm5kKTsKKyAgICAgICAgYWRkcl9saXN0LT5ycl92YWw9cm5kJW51bTsKKyAgICB9CisgICAgcmV0dXJuIG51bTsKK30KKworY2hhciAqc19udG9wKFNPQ0tBRERSX1VOSU9OICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikgeworICAgIGludCBlcnI7CisgICAgY2hhciAqaG9zdCwgKnBvcnQsICpyZXR2YWw7CisKKyAgICBpZihhZGRybGVuPT1zaXplb2YodV9zaG9ydCkpIC8qIHNlZSBVTklYKDcpIG1hbnVhbCBmb3IgZGV0YWlscyAqLworICAgICAgICByZXR1cm4gc3RyX2R1cCgidW5uYW1lZCBzb2NrZXQiKTsKKyAgICBob3N0PXN0cl9hbGxvYygyNTYpOworICAgIHBvcnQ9c3RyX2FsbG9jKDI1Nik7IC8qIG5lZWRzIHRvIGJlIGxvbmcgZW5vdWdoIGZvciBBRl9VTklYIHBhdGggKi8KKyAgICBlcnI9Z2V0bmFtZWluZm8oJmFkZHItPnNhLCBhZGRybGVuLAorICAgICAgICBob3N0LCAyNTYsIHBvcnQsIDI1NiwgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworICAgIGlmKGVycikgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiZ2V0bmFtZWluZm86ICVzIiwgc19nYWlfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHZhbD1zdHJfZHVwKCJ1bnJlc29sdmFibGUgYWRkcmVzcyIpOworICAgIH0gZWxzZQorICAgICAgICByZXR2YWw9c3RyX3ByaW50ZigiJXM6JXMiLCBob3N0LCBwb3J0KTsKKyAgICBzdHJfZnJlZShob3N0KTsKKyAgICBzdHJfZnJlZShwb3J0KTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzb2NrbGVuX3QgYWRkcl9sZW4oY29uc3QgU09DS0FERFJfVU5JT04gKmFkZHIpIHsKKyAgICBpZihhZGRyLT5zYS5zYV9mYW1pbHk9PUFGX0lORVQpCisgICAgICAgIHJldHVybiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyNpZmRlZiBVU0VfSVB2NgorICAgIGlmKGFkZHItPnNhLnNhX2ZhbWlseT09QUZfSU5FVDYpCisgICAgICAgIHJldHVybiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9VTgorICAgIGlmKGFkZHItPnNhLnNhX2ZhbWlseT09QUZfVU5JWCkKKyAgICAgICAgcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOworI2VuZGlmCisgICAgc19sb2coTE9HX0VSUiwgIklOVEVSTkFMIEVSUk9SOiBVbmtub3duIHNhX2ZhbWlseTogJWQiLAorICAgICAgICBhZGRyLT5zYS5zYV9mYW1pbHkpOworICAgIHJldHVybiBzaXplb2YoU09DS0FERFJfVU5JT04pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBteSBnZXRhZGRyaW5mbygpICovCisvKiBpbXBsZW1lbnRhdGlvbiBpcyBsaW1pdGVkIHRvIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGJ5IHN0dW5uZWwgKi8KKworI2lmbmRlZiBIQVZFX0dFVEFERFJJTkZPCitOT0VYUE9SVCBpbnQgZ2V0YWRkcmluZm8oY29uc3QgY2hhciAqbm9kZSwgY29uc3QgY2hhciAqc2VydmljZSwKKyAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywgc3RydWN0IGFkZHJpbmZvICoqcmVzKSB7CisgICAgc3RydWN0IGhvc3RlbnQgKmg7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBzdHJ1Y3Qgc2VydmVudCAqcDsKKyNlbmRpZgorICAgIHVfc2hvcnQgcG9ydDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKmFpOworICAgIGludCByZXR2YWw7CisgICAgY2hhciAqdG1wc3RyOworCisgICAgaWYoIW5vZGUpCisgICAgICAgIG5vZGU9aGludHMtPmFpX2ZsYWdzJkFJX1BBU1NJVkUgPyBERUZBVUxUX0FOWSA6IERFRkFVTFRfTE9PUEJBQ0s7CisjaWYgZGVmaW5lZChVU0VfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgaWYoc19nZXRhZGRyaW5mbykKKyAgICAgICAgcmV0dXJuIHNfZ2V0YWRkcmluZm8obm9kZSwgc2VydmljZSwgaGludHMsIHJlcyk7CisjZW5kaWYKKyAgICAvKiBkZWNvZGUgc2VydmljZSBuYW1lICovCisgICAgcG9ydD1odG9ucygodV9zaG9ydClzdHJ0b2woc2VydmljZSwgJnRtcHN0ciwgMTApKTsKKyAgICBpZih0bXBzdHI9PXNlcnZpY2UgfHwgKnRtcHN0cikgeyAvKiBub3QgYSBudW1iZXIgKi8KKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgICAgIHJldHVybiBFQUlfTk9OQU1FOworI2Vsc2UgLyogZGVmaW5lZChfV0lOMzJfV0NFKSAqLworICAgICAgICBwPWdldHNlcnZieW5hbWUoc2VydmljZSwgInRjcCIpOworICAgICAgICBpZighcCkKKyAgICAgICAgICAgIHJldHVybiBFQUlfTk9OQU1FOworICAgICAgICBwb3J0PSh1X3Nob3J0KXAtPnNfcG9ydDsKKyNlbmRpZiAvKiBkZWZpbmVkKF9XSU4zMl9XQ0UpICovCisgICAgfQorCisgICAgLyogYWxsb2NhdGUgYWRkcmxpc3Qgc3RydWN0dXJlICovCisgICAgYWk9c3RyX2FsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgICBpZihoaW50cykKKyAgICAgICAgbWVtY3B5KGFpLCBoaW50cywgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworCisgICAgLyogdHJ5IHRvIGRlY29kZSBudW1lcmljYWwgYWRkcmVzcyAqLworI2lmIGRlZmluZWQoVVNFX0lQdjYpICYmICFkZWZpbmVkKFVTRV9XSU4zMikKKyAgICBhaS0+YWlfZmFtaWx5PUFGX0lORVQ2OworICAgIGFpLT5haV9hZGRybGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICBhaS0+YWlfYWRkcj1zdHJfYWxsb2MoKHNpemVfdClhaS0+YWlfYWRkcmxlbik7CisgICAgYWktPmFpX2FkZHItPnNhX2ZhbWlseT1BRl9JTkVUNjsKKyAgICBpZihpbmV0X3B0b24oQUZfSU5FVDYsIG5vZGUsCisgICAgICAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHIpLT5zaW42X2FkZHIpPjApIHsKKyNlbHNlCisgICAgYWktPmFpX2ZhbWlseT1BRl9JTkVUOworICAgIGFpLT5haV9hZGRybGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgIGFpLT5haV9hZGRyPXN0cl9hbGxvYyhhaS0+YWlfYWRkcmxlbik7CisgICAgYWktPmFpX2FkZHItPnNhX2ZhbWlseT1BRl9JTkVUOworICAgICgoc3RydWN0IHNvY2thZGRyX2luICopYWktPmFpX2FkZHIpLT5zaW5fYWRkci5zX2FkZHI9aW5ldF9hZGRyKG5vZGUpOworICAgIGlmKCgoc3RydWN0IHNvY2thZGRyX2luICopYWktPmFpX2FkZHIpLT5zaW5fYWRkci5zX2FkZHIrMSkgeworICAgIC8qIChzaWduZWQpKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9hZGRyLnNfYWRkciE9LTEgKi8KKyNlbmRpZgorICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyKS0+c2luX3BvcnQ9cG9ydDsKKyAgICAgICAgKnJlcz1haTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIG51bWVyaWNhbCBhZGRyZXNzIHJlc29sdmVkICovCisgICAgfQorICAgIHN0cl9mcmVlKGFpLT5haV9hZGRyKTsKKyAgICBzdHJfZnJlZShhaSk7CisKKyAgICAvKiBub3QgbnVtZXJpY2FsOiBuZWVkIHRvIGNhbGwgcmVzb2x2ZXIgbGlicmFyeSAqLworICAgICpyZXM9TlVMTDsKKyAgICBhaT1OVUxMOworICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9JTkVUKTsKKyNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUUyCisgICAgaD1nZXRob3N0YnluYW1lMihub2RlLCBBRl9JTkVUNik7CisgICAgaWYoaCkgLyogc29tZSBJUHY2IGFkZHJlc3NlcyBmb3VuZCAqLworICAgICAgICBhbGxvY19hZGRyZXNzZXMoaCwgaGludHMsIHBvcnQsIHJlcywgJmFpKTsgLyogaWdub3JlIHRoZSBlcnJvciAqLworI2VuZGlmCisgICAgaD1nZXRob3N0YnluYW1lKG5vZGUpOyAvKiBnZXQgbGlzdCBvZiBhZGRyZXNzZXMgKi8KKyAgICBpZihoKQorICAgICAgICByZXR2YWw9YWkgPworICAgICAgICAgICAgYWxsb2NfYWRkcmVzc2VzKGgsIGhpbnRzLCBwb3J0LCAmYWktPmFpX25leHQsICZhaSkgOgorICAgICAgICAgICAgYWxsb2NfYWRkcmVzc2VzKGgsIGhpbnRzLCBwb3J0LCByZXMsICZhaSk7CisgICAgZWxzZSBpZighKnJlcykKKyAgICAgICAgcmV0dmFsPUVBSV9OT05BTUU7IC8qIG5vIHJlc3VsdHMgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHZhbD0wOworI2lmZGVmIEhBVkVfRU5ESE9TVEVOVAorICAgIGVuZGhvc3RlbnQoKTsKKyNlbmRpZgorICAgIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9JTkVUKTsKKyAgICBpZihyZXR2YWwpIHsgLyogZXJyb3I6IGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgICAgICBmcmVlYWRkcmluZm8oKnJlcyk7CisgICAgICAgICpyZXM9TlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworTk9FWFBPUlQgaW50IGFsbG9jX2FkZHJlc3NlcyhzdHJ1Y3QgaG9zdGVudCAqaCwgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywKKyAgICAgICAgdV9zaG9ydCBwb3J0LCBzdHJ1Y3QgYWRkcmluZm8gKipoZWFkLCBzdHJ1Y3QgYWRkcmluZm8gKip0YWlsKSB7CisgICAgaW50IGk7CisgICAgc3RydWN0IGFkZHJpbmZvICphaTsKKworICAgIC8qIGNvcHkgYWRkcmVzc2VzICovCisgICAgZm9yKGk9MDsgaC0+aF9hZGRyX2xpc3RbaV07IGkrKykgeworICAgICAgICBhaT1zdHJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICAgICAgICBpZihoaW50cykKKyAgICAgICAgICAgIG1lbWNweShhaSwgaGludHMsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgICAgICAgYWktPmFpX25leHQ9TlVMTDsgLyoganVzdCBpbiBjYXNlICovCisgICAgICAgIGlmKCp0YWlsKSB7IC8qIGxpc3Qgbm90IGVtcHR5OiBhZGQgYSBub2RlICovCisgICAgICAgICAgICAoKnRhaWwpLT5haV9uZXh0PWFpOworICAgICAgICAgICAgKnRhaWw9YWk7CisgICAgICAgIH0gZWxzZSB7IC8qIGxpc3QgZW1wdHk6IGNyZWF0ZSBpdCAqLworICAgICAgICAgICAgKmhlYWQ9YWk7CisgICAgICAgICAgICAqdGFpbD1haTsKKyAgICAgICAgfQorICAgICAgICBhaS0+YWlfZmFtaWx5PWgtPmhfYWRkcnR5cGU7CisjaWYgZGVmaW5lZChVU0VfSVB2NikKKyAgICAgICAgaWYoaC0+aF9hZGRydHlwZT09QUZfSU5FVDYpIHsKKyAgICAgICAgICAgIGFpLT5haV9hZGRybGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICAgICAgICAgIGFpLT5haV9hZGRyPXN0cl9hbGxvYygoc2l6ZV90KWFpLT5haV9hZGRybGVuKTsKKyAgICAgICAgICAgIG1lbWNweSgmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHIpLT5zaW42X2FkZHIsCisgICAgICAgICAgICAgICAgaC0+aF9hZGRyX2xpc3RbaV0sIChzaXplX3QpaC0+aF9sZW5ndGgpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBhaS0+YWlfYWRkcmxlbj1zaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgICAgIGFpLT5haV9hZGRyPXN0cl9hbGxvYygoc2l6ZV90KWFpLT5haV9hZGRybGVuKTsKKyAgICAgICAgICAgIG1lbWNweSgmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9hZGRyLAorICAgICAgICAgICAgICAgIGgtPmhfYWRkcl9saXN0W2ldLCAoc2l6ZV90KWgtPmhfbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBhaS0+YWlfYWRkci0+c2FfZmFtaWx5PSh1X3Nob3J0KWgtPmhfYWRkcnR5cGU7CisgICAgICAgIC8qIG9mZnNldHMgb2Ygc2luX3BvcnQgYW5kIHNpbjZfcG9ydCBzaG91bGQgYmUgdGhlIHNhbWUgKi8KKyAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9wb3J0PXBvcnQ7CisgICAgfQorICAgIHJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CisKK05PRVhQT1JUIHZvaWQgZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqY3VycmVudCkgeworICAgIHN0cnVjdCBhZGRyaW5mbyAqbmV4dDsKKworI2lmIGRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIGlmKHNfZnJlZWFkZHJpbmZvKSB7CisgICAgICAgIHNfZnJlZWFkZHJpbmZvKGN1cnJlbnQpOworICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZShjdXJyZW50KSB7CisgICAgICAgIHN0cl9mcmVlKGN1cnJlbnQtPmFpX2FkZHIpOworICAgICAgICBzdHJfZnJlZShjdXJyZW50LT5haV9jYW5vbm5hbWUpOworICAgICAgICBuZXh0PWN1cnJlbnQtPmFpX25leHQ7CisgICAgICAgIHN0cl9mcmVlKGN1cnJlbnQpOworICAgICAgICBjdXJyZW50PW5leHQ7CisgICAgfQorfQorI2VuZGlmIC8qICFkZWZpbmVkIEhBVkVfR0VUQUREUklORk8gKi8KKworLyogZHVlIHRvIGEgcHJvYmxlbSB3aXRoIE1pbmd3MzIgSSBkZWNpZGVkIHRvIGRlZmluZSBteSBvd24gZ2FpX3N0cmVycm9yKCkgKi8KK2NvbnN0IGNoYXIgKnNfZ2FpX3N0cmVycm9yKGludCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisjaWZkZWYgRUFJX0JBREZMQUdTCisgICAgICAgIGNhc2UgRUFJX0JBREZMQUdTOgorICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAoRUFJX0JBREZMQUdTKSI7CisjZW5kaWYKKyAgICAgICAgY2FzZSBFQUlfTk9OQU1FOgorICAgICAgICAgICAgcmV0dXJuICJOZWl0aGVyIG5vZGVuYW1lIG5vciBzZXJ2bmFtZSBrbm93biAoRUFJX05PTkFNRSkiOworI2lmZGVmIEVBSV9BR0FJTgorICAgICAgICBjYXNlIEVBSV9BR0FJTjoKKyAgICAgICAgICAgIHJldHVybiAiVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIChFQUlfQUdBSU4pIjsKKyNlbmRpZgorI2lmZGVmIEVBSV9GQUlMCisgICAgICAgIGNhc2UgRUFJX0ZBSUw6CisgICAgICAgICAgICByZXR1cm4gIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAoRUFJX0ZBSUwpIjsKKyNlbmRpZgorI2lmZGVmIEVBSV9OT0RBVEEKKyNpZiBFQUlfTk9EQVRBIT1FQUlfTk9OQU1FCisgICAgICAgIGNhc2UgRUFJX05PREFUQToKKyAgICAgICAgICAgIHJldHVybiAiTm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggbm9kZW5hbWUgKEVBSV9OT0RBVEEpIjsKKyNlbmRpZiAvKiBFQUlfTk9EQVRBIT1FQUlfTk9OQU1FICovCisjZW5kaWYgLyogZGVmaW5lZCBFQUlfTk9EQVRBICovCisjaWZkZWYgRUFJX0ZBTUlMWQorICAgICAgICBjYXNlIEVBSV9GQU1JTFk6CisgICAgICAgICAgICByZXR1cm4gImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkIChFQUlfRkFNSUxZKSI7CisjZW5kaWYKKyNpZmRlZiBFQUlfU09DS1RZUEUKKyAgICAgICAgY2FzZSBFQUlfU09DS1RZUEU6CisgICAgICAgICAgICByZXR1cm4gImFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQgKEVBSV9TT0NLVFlQRSkiOworI2VuZGlmCisjaWZkZWYgRUFJX1NFUlZJQ0UKKyAgICAgICAgY2FzZSBFQUlfU0VSVklDRToKKyAgICAgICAgICAgIHJldHVybiAic2Vydm5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUgKEVBSV9TRVJWSUNFKSI7CisjZW5kaWYKKyNpZmRlZiBFQUlfQUREUkZBTUlMWQorICAgICAgICBjYXNlIEVBSV9BRERSRkFNSUxZOgorICAgICAgICAgICAgcmV0dXJuICJBZGRyZXNzIGZhbWlseSBmb3Igbm9kZW5hbWUgbm90IHN1cHBvcnRlZCAoRUFJX0FERFJGQU1JTFkpIjsKKyNlbmRpZiAvKiBFQUlfQUREUkZBTUlMWSAqLworICAgICAgICBjYXNlIEVBSV9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKEVBSV9NRU1PUlkpIjsKKyNpZmRlZiBFQUlfU1lTVEVNCisgICAgICAgIGNhc2UgRUFJX1NZU1RFTToKKyAgICAgICAgICAgIHJldHVybiAiU3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vIChFQUlfU1lTVEVNKSI7CisjZW5kaWYgLyogRUFJX1NZU1RFTSAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGVycm9yIjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG15IGdldG5hbWVpbmZvKCkgKi8KKy8qIGltcGxlbWVudGF0aW9uIGlzIGxpbWl0ZWQgdG8gZnVuY3Rpb25hbGl0eSBuZWVkZWQgYnkgc3R1bm5lbCAqLworCisjaWZuZGVmIEhBVkVfR0VUTkFNRUlORk8KK2ludCBnZXRuYW1laW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzb2NrbGVuX3Qgc2FsZW4sCisgICAgY2hhciAqaG9zdCwgc2l6ZV90IGhvc3RsZW4sIGNoYXIgKnNlcnYsIHNpemVfdCBzZXJ2bGVuLCBpbnQgZmxhZ3MpIHsKKworI2lmIGRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIGlmKHNfZ2V0bmFtZWluZm8pCisgICAgICAgIHJldHVybiBzX2dldG5hbWVpbmZvKHNhLCBzYWxlbiwgaG9zdCwgaG9zdGxlbiwgc2Vydiwgc2VydmxlbiwgZmxhZ3MpOworI2VuZGlmCisgICAgaWYoaG9zdCAmJiBob3N0bGVuKSB7CisjaWYgZGVmaW5lZChVU0VfSVB2NikgJiYgIWRlZmluZWQoVVNFX1dJTjMyKQorICAgICAgICBpbmV0X250b3Aoc2EtPnNhX2ZhbWlseSwgc2EtPnNhX2ZhbWlseT09QUZfSU5FVDYgPworICAgICAgICAgICAgICAgICh2b2lkICopJigoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyIDoKKyAgICAgICAgICAgICAgICAodm9pZCAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIsCisgICAgICAgICAgICBob3N0LCBob3N0bGVuKTsKKyNlbHNlIC8qIFVTRV9JUHY2ICovCisgICAgICAgIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oQ1JJVF9JTkVUKTsgLyogaW5ldF9udG9hIGlzIG5vdCBtdC1zYWZlICovCisgICAgICAgIHN0cm5jcHkoaG9zdCwgaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkciksCisgICAgICAgICAgICBob3N0bGVuKTsKKyAgICAgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0lORVQpOworICAgICAgICBob3N0W2hvc3RsZW4tMV09J1wwJzsKKyNlbmRpZiAvKiBVU0VfSVB2NiAqLworICAgIH0KKyAgICBpZihzZXJ2ICYmIHNlcnZsZW4pCisgICAgICAgIHNwcmludGYoc2VydiwgIiV1IiwgbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9wb3J0KSk7CisgICAgLyogc2luX3BvcnQgaXMgaW4gdGhlIHNhbWUgcGxhY2UgYm90aCBpbiBzb2NrYWRkcl9pbiBhbmQgc29ja2FkZHJfaW42ICovCisgICAgLyogaWdub3JlIHNlcnZsZW4gc2luY2UgaXQncyBsb25nIGVub3VnaCBpbiBzdHVubmVsIGNvZGUgKi8KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBlbmQgb2YgcmVzb2x2ZXIuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jlc291cmNlcy5oIGIvc3JjL3Jlc291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWRhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcmVzb3VyY2VzLmgKQEAgLTAsMCArMSwzNiBAQAorI2RlZmluZSBXTV9TWVNUUkFZICAgICAgICAgIChXTV9VU0VSKzApCisKKyNkZWZpbmUgV01fVkFMSURfQ09ORklHICAgICAoV01fQVBQKzApCisjZGVmaW5lIFdNX0lOVkFMSURfQ09ORklHICAgKFdNX0FQUCsxKQorI2RlZmluZSBXTV9MT0cgICAgICAgICAgICAgIChXTV9BUFArMikKKyNkZWZpbmUgV01fTkVXX0NIQUlOICAgICAgICAoV01fQVBQKzMpCisjZGVmaW5lIFdNX0NMSUVOVFMgICAgICAgICAgKFdNX0FQUCs0KQorCisjZGVmaW5lIElESV9TVFVOTkVMX01BSU4gICAgMTAKKyNkZWZpbmUgSURJX1NUVU5ORUxfQUNUSVZFICAxMQorI2RlZmluZSBJRElfU1RVTk5FTF9FUlJPUiAgIDEyCisjZGVmaW5lIElESV9TVFVOTkVMX0lETEUgICAgMTMKKworI2RlZmluZSBJREVfRURJVCAgICAgICAgICAgIDIwCisjZGVmaW5lIElERV9QQVNTRURJVCAgICAgICAgMjEKKyNkZWZpbmUgSURFX1BJTkVESVQgICAgICAgICAyMgorCisjZGVmaW5lIElETV9UUkFZTUVOVSAgICAgICAgMzAKKyNkZWZpbmUgSURNX01BSU5NRU5VICAgICAgICAzMQorI2RlZmluZSBJRE1fQ0xPU0UgICAgICAgICAgIDMyCisjZGVmaW5lIElETV9FWElUICAgICAgICAgICAgMzMKKyNkZWZpbmUgSURNX1NIT1dfTE9HICAgICAgICAzNAorCisjZGVmaW5lIElETV9TQVZFX0xPRyAgICAgICAgNDAKKyNkZWZpbmUgSURNX1JFT1BFTl9MT0cgICAgICA0MQorI2RlZmluZSBJRE1fRURJVF9DT05GSUcgICAgIDQyCisjZGVmaW5lIElETV9SRUxPQURfQ09ORklHICAgNDMKKworI2RlZmluZSBJRE1fQUJPVVQgICAgICAgICAgIDUwCisjZGVmaW5lIElETV9NQU5QQUdFICAgICAgICAgNTEKKyNkZWZpbmUgSURNX0hPTUVQQUdFICAgICAgICA1MgorCisjZGVmaW5lIElETV9QRUVSX01FTlUgICAgICAgNjAKKworI2RlZmluZSBJRFNfU0VSVklDRV9ERVNDICAgIDcwCisKZGlmZiAtLWdpdCBhL3NyYy9yZXNvdXJjZXMucmMgYi9zcmMvcmVzb3VyY2VzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWZiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcmVzb3VyY2VzLnJjCkBAIC0wLDAgKzEsMTQyIEBACisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlICJyZXNvdXJjZXMuaCINCisjaW5jbHVkZSAidmVyc2lvbi5oIg0KKw0KK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTw0KK0ZJTEVWRVJTSU9OICAgICBTVFVOTkVMX1ZFUlNJT05fRklFTERTDQorUFJPRFVDVFZFUlNJT04gIFNUVU5ORUxfVkVSU0lPTl9GSUVMRFMNCitGSUxFRkxBR1NNQVNLICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sNCitGSUxFRkxBR1MgICAgICAgMA0KK0ZJTEVPUyAgICAgICAgICBWT1NfX1dJTkRPV1MzMg0KK0ZJTEVUWVBFICAgICAgICBWRlRfQVBQDQorRklMRVNVQlRZUEUgICAgIFZGVDJfVU5LTk9XTg0KK0JFR0lODQorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIEJMT0NLICIwNDA5MDRFNCINCisgICAgICAgIEJFR0lODQorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICAgICJNaWNoYWwgVHJvam5hcmEiDQorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICAgICJzdHVubmVsIC0gVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5Ig0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICAgICAgICBTVFVOTkVMX1ZFUlNJT04NCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICAgInN0dW5uZWwiDQorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICAgICKpIGJ5IE1pY2hhbCBUcm9qbmFyYSwgMTk5OC0yMDE1Ig0KKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgICAic3R1bm5lbC5leGUiDQorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAgIFNUVU5ORUxfUFJPRFVDVE5BTUUNCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgICAgU1RVTk5FTF9WRVJTSU9ODQorICAgICAgICBFTkQNCisgICAgRU5EDQorICAgIEJMT0NLICJWYXJGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjUyDQorICAgIEVORA0KK0VORA0KKw0KK0lESV9TVFVOTkVMX01BSU4gICAgSUNPTiAic3R1bm5lbC5pY28iDQorSURJX1NUVU5ORUxfQUNUSVZFICBJQ09OICJhY3RpdmUuaWNvIg0KK0lESV9TVFVOTkVMX0VSUk9SICAgSUNPTiAiZXJyb3IuaWNvIg0KK0lESV9TVFVOTkVMX0lETEUgICAgSUNPTiAiaWRsZS5pY28iDQorDQorSURNX01BSU5NRU5VIE1FTlUNCitCRUdJTg0KKyAgICBQT1BVUCAiJkZpbGUiDQorICAgIEJFR0lODQorICAgICAgICBNRU5VSVRFTSAiJlNhdmUgTG9nIEFzIiwgICAgICAgICAgICBJRE1fU0FWRV9MT0cNCisgICAgICAgIE1FTlVJVEVNICJSZW9wZW4gJkxvZyBGaWxlIiwgICAgICAgIElETV9SRU9QRU5fTE9HLCBHUkFZRUQNCisgICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KKyAgICAgICAgTUVOVUlURU0gIkUmeGl0IiwgICAgICAgICAgICAgICAgICAgSURNX0VYSVQNCisgICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KKyAgICAgICAgTUVOVUlURU0gIiZDbG9zZSIsICAgICAgICAgICAgICAgICAgSURNX0NMT1NFDQorICAgIEVORA0KKyNpZmRlZiBfV0lOMzJfV0NFDQorICAgIFBPUFVQICImQ29uZmlnIg0KKyNlbHNlDQorICAgIFBPUFVQICImQ29uZmlndXJhdGlvbiINCisjZW5kaWYNCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImRWRpdCBDb25maWd1cmF0aW9uIiwgICAgICBJRE1fRURJVF9DT05GSUcNCisgICAgICAgIE1FTlVJVEVNICImUmVsb2FkIENvbmZpZ3VyYXRpb24iLCAgICBJRE1fUkVMT0FEX0NPTkZJRw0KKyAgICBFTkQNCisjaWZkZWYgX1dJTjMyX1dDRQ0KKyAgICBQT1BVUCAiJlNhdmUgUGVlciBDZXJ0cyINCisjZWxzZQ0KKyAgICBQT1BVUCAiJlNhdmUgUGVlciBDZXJ0aWZpY2F0ZSINCisjZW5kaWYNCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICJkdW1teSIsICAgICAgICAgICAgICAgICAgIDAsIEdSQVlFRA0KKyAgICBFTkQNCisgICAgUE9QVVAgIiZIZWxwIg0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIiZBYm91dCIsICAgICAgICAgICAgICAgICAgSURNX0FCT1VUDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImTWFudWFsIiwgICAgICAgICAgICAgICAgIElETV9NQU5QQUdFDQorICAgICAgICBNRU5VSVRFTSAiJkhvbWVwYWdlIiwgICAgICAgICAgICAgICBJRE1fSE9NRVBBR0UNCisgICAgRU5EDQorRU5EDQorDQorSURNX1RSQVlNRU5VIE1FTlUNCitCRUdJTg0KKyAgICBQT1BVUCAiT29vcHM/Ig0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIlNob3cgTG9nICZXaW5kb3ciLCAgICAgICAgSURNX1NIT1dfTE9HDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIFBPUFVQICImU2F2ZSBQZWVyIENlcnRpZmljYXRlIg0KKyAgICAgICAgQkVHSU4NCisgICAgICAgICAgICBNRU5VSVRFTSAiZHVtbXkiLCAgICAgICAgICAgICAgIDAsIEdSQVlFRA0KKyAgICAgICAgRU5EDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImRWRpdCBDb25maWd1cmF0aW9uIiwgICAgICBJRE1fRURJVF9DT05GSUcNCisgICAgICAgIE1FTlVJVEVNICImUmVsb2FkIENvbmZpZ3VyYXRpb24iLCAgICBJRE1fUkVMT0FEX0NPTkZJRw0KKyAgICAgICAgTUVOVUlURU0gIlJlb3BlbiAmTG9nIEZpbGUiLCAgICAgICAgSURNX1JFT1BFTl9MT0csIEdSQVlFRA0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJkhvbWVwYWdlIiwgICAgICAgICAgICAgICBJRE1fSE9NRVBBR0UNCisgICAgICAgIE1FTlVJVEVNICImTWFudWFsIiwgICAgICAgICAgICAgICAgIElETV9NQU5QQUdFDQorICAgICAgICBNRU5VSVRFTSAiJkFib3V0IiwgICAgICAgICAgICAgICAgICBJRE1fQUJPVVQNCisgICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KKyAgICAgICAgTUVOVUlURU0gIkUmeGl0IiwgICAgICAgICAgICAgICAgICAgSURNX0VYSVQNCisgICAgRU5EDQorRU5EDQorDQorQUJPVVRCT1ggRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxNDAsIDY4DQorU1RZTEUgRFNfTU9EQUxGUkFNRXxEU19DRU5URVJ8V1NfUE9QVVB8V1NfQ0FQVElPTnxXU19TWVNNRU5VDQorQ0FQVElPTiAiQWJvdXQgc3R1bm5lbCINCitGT05UIDgsICJNUyBTYW5zIFNlcmlmIg0KK0JFR0lODQorICAgIElDT04gICAgICAgICAgICBJRElfU1RVTk5FTF9NQUlOLCAtMSwgICAgICAgICAgICAgICAgICAgICAgICA2LCAgNiwgIDIwLCAyMA0KKyAgICBMVEVYVCAgICAgICAgICAgInN0dW5uZWwgdmVyc2lvbiIsIC0xLCAgICAgICAgICAgICAgICAgICAgICAzMCwgIDQsICA0OSwgIDgNCisgICAgTFRFWFQgICAgICAgICAgIFNUVU5ORUxfVkVSU0lPTiwgLTEsICAgICAgICAgICAgICAgICAgICAgICAgNzksICA0LCAgNTcsICA4DQorICAgIExURVhUICAgICAgICAgICAiqSBieSBNaWNoYWwgVHJvam5hcmEsIDE5OTgtMjAxNSIsIC0xLCAgICAgIDMwLCAxMiwgMTA2LCAgOA0KKyAgICBMVEVYVCAgICAgICAgICAgIkFsbCBSaWdodHMgUmVzZXJ2ZWQiLCAtMSwgICAgICAgICAgICAgICAgICAzMCwgMjAsIDEwNiwgIDgNCisgICAgTFRFWFQgICAgICAgICAgICJMaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTCB2ZXJzaW9uIDIiLCAtMSwgIDQsIDI4LCAxMzIsICA4DQorICAgIExURVhUICAgICAgICAgICAid2l0aCBhIHNwZWNpYWwgZXhjZXB0aW9uIGZvciBPcGVuU1NMIiwgLTEsICA0LCAzNiwgMTMyLCAgOA0KKyAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NCwgNDgsICAzMiwgMTQsIFdTX0dST1VQDQorRU5EDQorDQorUEFTU0JPWCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMTU2LCA1MQ0KK1NUWUxFIERTX01PREFMRlJBTUV8RFNfQ0VOVEVSfFdTX1BPUFVQfFdTX0NBUFRJT058V1NfU1lTTUVOVQ0KK0NBUFRJT04gIiINCitGT05UIDgsICJNUyBTYW5zIFNlcmlmIg0KK0JFR0lODQorICAgIElDT04gICAgICAgICAgICBJRElfU1RVTk5FTF9NQUlOLCAtMSwgICAgIDYsICA2LCAyMCwgMjANCisgICAgTFRFWFQgICAgICAgICAgICJLZXkgcGFzc3BocmFzZToiLCAtMSwgICAzMCwgMTMsIDU2LCAgOA0KKyAgICBFRElUVEVYVCAgICAgICAgSURFX1BBU1NFRElULCAgICAgICAgICAgIDg2LCAxMSwgNjQsIDEyLCBFU19QQVNTV09SRHxFU19BVVRPSFNDUk9MTA0KKyAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLCAgICAgICAgICAgICAgICA2LCAzMCwgNTAsIDE0DQorICAgIFBVU0hCVVRUT04gICAgICAiQ2FuY2VsIixJRENBTkNFTCwgICAgICAxMDAsIDMwLCA1MCwgMTQNCitFTkQNCisNCitQSU5CT1ggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDE1NiwgNTENCitTVFlMRSBEU19NT0RBTEZSQU1FfERTX0NFTlRFUnxXU19QT1BVUHxXU19DQVBUSU9OfFdTX1NZU01FTlUNCitDQVBUSU9OICIiDQorRk9OVCA4LCAiTVMgU2FucyBTZXJpZiINCitCRUdJTg0KKyAgICBJQ09OICAgICAgICAgICAgSURJX1NUVU5ORUxfTUFJTiwgLTEsICAgICA2LCAgNiwgMjAsIDIwDQorICAgIExURVhUICAgICAgICAgICAiU21hcnRDYXJkIFBJTjoiLCAtMSwgICAgMzAsIDEzLCA1NiwgIDgNCisgICAgRURJVFRFWFQgICAgICAgIElERV9QSU5FRElULCAgICAgICAgICAgICA4NiwgMTEsIDY0LCAxMiwgRVNfUEFTU1dPUkR8RVNfQVVUT0hTQ1JPTEwNCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywgICAgICAgICAgICAgICAgNiwgMzAsIDUwLCAxNA0KKyAgICBQVVNIQlVUVE9OICAgICAgIkNhbmNlbCIsSURDQU5DRUwsICAgICAgMTAwLCAzMCwgNTAsIDE0DQorRU5EDQorDQorU1RSSU5HVEFCTEUNCitCRUdJTg0KK0lEU19TRVJWSUNFX0RFU0MgICJUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkiDQorRU5EDQorDQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC5jIGIvc3JjL3NzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3NsLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworICAgIC8qIGdsb2JhbCBPcGVuU1NMIGluaXRhbGl6YXRpb246IGNvbXByZXNzaW9uLCBlbmdpbmUsIGVudHJvcHkgKi8KK05PRVhQT1JUIHZvaWQgY2JfZnJlZSh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorICAgIGludCBpZHgsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorTk9FWFBPUlQgaW50IGNvbXByZXNzaW9uX2luaXQoR0xPQkFMX09QVElPTlMgKik7CisjZW5kaWYKK05PRVhQT1JUIGludCBwcm5nX2luaXQoR0xPQkFMX09QVElPTlMgKik7CitOT0VYUE9SVCBpbnQgYWRkX3JhbmRfZmlsZShHTE9CQUxfT1BUSU9OUyAqLCBjb25zdCBjaGFyICopOworCitpbnQgaW5kZXhfY2xpLCBpbmRleF9vcHQsIGluZGV4X3JlZGlyZWN0LCBpbmRleF9hZGRyOworCitpbnQgc3NsX2luaXQodm9pZCkgeyAvKiBpbml0IFNTTCBiZWZvcmUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworICAgIGluZGV4X2NsaT1TU0xfZ2V0X2V4X25ld19pbmRleCgwLCAiY2xpIGluZGV4IiwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5kZXhfb3B0PVNTTF9DVFhfZ2V0X2V4X25ld19pbmRleCgwLCAib3B0IGluZGV4IiwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5kZXhfcmVkaXJlY3Q9U1NMX1NFU1NJT05fZ2V0X2V4X25ld19pbmRleCgwLCAicmVkaXJlY3QgaW5kZXgiLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpbmRleF9hZGRyPVNTTF9TRVNTSU9OX2dldF9leF9uZXdfaW5kZXgoMCwgImFkZHIgaW5kZXgiLAorICAgICAgICBOVUxMLCBOVUxMLCBjYl9mcmVlKTsKKyAgICBpZihpbmRleF9jbGk8MCB8fCBpbmRleF9vcHQ8MCB8fCBpbmRleF9yZWRpcmVjdDwwIHx8IGluZGV4X2FkZHI8MCkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyAgICBkaF9wYXJhbXM9Z2V0X2RoMjA0OCgpOworICAgIGlmKCFkaF9wYXJhbXMpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkZhaWxlZCB0byBnZXQgZGVmYXVsdCBESCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0RIICovCisgICAgcmV0dXJuIDA7Cit9CisKK05PRVhQT1JUIHZvaWQgY2JfZnJlZSh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorICAgICAgICBpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApIHsKKyAgICAodm9pZClwYXJlbnQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpYWQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpaWR4OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKWFyZ2w7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgc19sb2coTE9HX0RFQlVHLCAiRGVhbGxvY2F0aW5nIGFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgZm9yICVzIiwKKyAgICAgICAgKGNoYXIgKilhcmdwKTsKKyAgICBzdHJfZnJlZShwdHIpOworfQorCitpbnQgc3NsX2NvbmZpZ3VyZShHTE9CQUxfT1BUSU9OUyAqZ2xvYmFsKSB7IC8qIGNvbmZpZ3VyZSBnbG9iYWwgU1NMIHNldHRpbmdzICovCisjaWZkZWYgVVNFX0ZJUFMKKyAgICBpZihGSVBTX21vZGUoKSE9Z2xvYmFsLT5vcHRpb24uZmlwcykgeworICAgICAgICBSQU5EX3NldF9yYW5kX21ldGhvZChOVUxMKTsgLyogcmVzZXQgUkFORCBtZXRob2RzICovCisgICAgICAgIGlmKCFGSVBTX21vZGVfc2V0KGdsb2JhbC0+b3B0aW9uLmZpcHMpKSB7CisgICAgICAgICAgICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworICAgICAgICAgICAgc3NsZXJyb3IoIkZJUFNfbW9kZV9zZXQiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHNfbG9nKExPR19OT1RJQ0UsICJGSVBTIG1vZGUgJXMiLAorICAgICAgICBnbG9iYWwtPm9wdGlvbi5maXBzID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisjZW5kaWYgLyogVVNFX0ZJUFMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisgICAgaWYoY29tcHJlc3Npb25faW5pdChnbG9iYWwpKQorICAgICAgICByZXR1cm4gMTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0NPTVAgKi8KKyAgICBpZihwcm5nX2luaXQoZ2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc19sb2coTE9HX0RFQlVHLCAiUFJORyBzZWVkZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgcmV0dXJuIDA7IC8qIFNVQ0NFU1MgKi8KK30KKworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKK05PRVhQT1JUIGludCBjb21wcmVzc2lvbl9pbml0KEdMT0JBTF9PUFRJT05TICpnbG9iYWwpIHsKKyAgICBTVEFDS19PRihTU0xfQ09NUCkgKm1ldGhvZHM7CisKKyAgICBtZXRob2RzPVNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzKCk7CisgICAgaWYoIW1ldGhvZHMpIHsKKyAgICAgICAgaWYoZ2xvYmFsLT5jb21wcmVzc2lvbj09Q09NUF9OT05FKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiRmFpbGVkIHRvIGdldCBjb21wcmVzc2lvbiBtZXRob2RzIik7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogaWdub3JlICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiRmFpbGVkIHRvIGdldCBjb21wcmVzc2lvbiBtZXRob2RzIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGdsb2JhbC0+Y29tcHJlc3Npb249PUNPTVBfTk9ORSB8fAorICAgICAgICAgICAgU1NMZWF5KCk8MHgwMDkwODA1MUwgLyogMC45LjhlLWJldGExICovKSB7CisgICAgICAgIC8qIGRlbGV0ZSBPcGVuU1NMIGRlZmF1bHRzIChlbXB0eSB0aGUgU1NMX0NPTVAgc3RhY2spICovCisgICAgICAgIC8qIGNhbm5vdCB1c2Ugc2tfU1NMX0NPTVBfcG9wX2ZyZWUsCisgICAgICAgICAqIGFzIGl0IGFsc28gZGVzdHJveXMgdGhlIHN0YWNrIGl0c2VsZiAqLworICAgICAgICAvKiBvbmx5IGxlYXZlIHRoZSBzdGFuZGFyZCBSRkMgMTk1MSAoREVGTEFURSkgYWxnb3JpdGhtLAorICAgICAgICAgKiBpZiBhbnkgb2YgdGhlIHByaXZhdGUgYWxnb3JpdGhtcyBpcyBlbmFibGVkICovCisgICAgICAgIC8qIG9ubHkgYWxsb3cgREVGTEFURSB3aXRoIE9wZW5TU0wgMC45Ljggb3IgbGF0ZXIKKyAgICAgICAgICogd2l0aCBPcGVuU1NMICMxNDY4IHpsaWIgbWVtb3J5IGxlYWsgZml4ZWQgKi8KKyAgICAgICAgd2hpbGUoc2tfU1NMX0NPTVBfbnVtKG1ldGhvZHMpKQorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAxMDAwMDBMCisgICAgICAgICAgICAvKiBGSVhNRTogcmVtb3ZlIHdoZW4gc2tfU1NMX0NPTVBfcG9wKCkgd29ya3MgYWdhaW4gKi8KKyAgICAgICAgICAgIE9QRU5TU0xfZnJlZShza19wb3AoKHZvaWQgKiltZXRob2RzKSk7CisjZWxzZQorICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHNrX1NTTF9DT01QX3BvcChtZXRob2RzKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZihnbG9iYWwtPmNvbXByZXNzaW9uPT1DT01QX05PTkUpIHsKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiQ29tcHJlc3Npb24gZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisKKyAgICAvKiBhbHNvIGluc2VydCB0aGUgb2Jzb2xldGUgWkxJQiBhbGdvcml0aG0gKi8KKyAgICBpZihnbG9iYWwtPmNvbXByZXNzaW9uPT1DT01QX1pMSUIpIHsKKyAgICAgICAgLyogMjI0IC0gd2l0aGluIHRoZSBwcml2YXRlIHJhbmdlICgxOTMgdG8gMjU1KSAqLworICAgICAgICBDT01QX01FVEhPRCAqbWV0aD1DT01QX3psaWIoKTsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMTAwMDAwTAorICAgICAgICBpZighbWV0aCB8fCBDT01QX2dldF90eXBlKG1ldGgpPT1OSURfdW5kZWYpIHsKKyNlbHNlCisgICAgICAgIGlmKCFtZXRoIHx8IG1ldGgtPnR5cGU9PU5JRF91bmRlZikgeworI2VuZGlmCisgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiWkxJQiBjb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBTU0xfQ09NUF9hZGRfY29tcHJlc3Npb25fbWV0aG9kKDB4ZTAsIG1ldGgpOworICAgIH0KKyAgICBzX2xvZyhMT0dfSU5GTywgIkNvbXByZXNzaW9uIGVuYWJsZWQ6ICVkIG1ldGhvZChzKSIsCisgICAgICAgIHNrX1NTTF9DT01QX251bShtZXRob2RzKSk7CisgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KK30KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0NPTVAgKi8KKworTk9FWFBPUlQgaW50IHBybmdfaW5pdChHTE9CQUxfT1BUSU9OUyAqZ2xvYmFsKSB7CisgICAgaW50IHRvdGJ5dGVzPTA7CisgICAgY2hhciBmaWxlbmFtZVsyNTZdOworI2lmbmRlZiBVU0VfV0lOMzIKKyAgICBpbnQgYnl0ZXM7CisjZW5kaWYKKworICAgIGZpbGVuYW1lWzBdPSdcMCc7CisKKyAgICAvKiBpZiB0aGV5IHNwZWNpZnkgYSByYW5kIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSB3ZQorICAgICAgIGFzc3VtZSB0aGF0IHRoZXkgcmVhbGx5IGRvIHdhbnQgaXQsIHNvIHRyeSBpdCBmaXJzdCAqLworICAgIGlmKGdsb2JhbC0+cmFuZF9maWxlKSB7CisgICAgICAgIHRvdGJ5dGVzKz1hZGRfcmFuZF9maWxlKGdsb2JhbCwgZ2xvYmFsLT5yYW5kX2ZpbGUpOworICAgICAgICBpZihSQU5EX3N0YXR1cygpKQorICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisKKyAgICAvKiB0cnkgdGhlICRSQU5ERklMRSBvciAkSE9NRS8ucm5kIGZpbGVzICovCisgICAgUkFORF9maWxlX25hbWUoZmlsZW5hbWUsIDI1Nik7CisgICAgaWYoZmlsZW5hbWVbMF0pIHsKKyAgICAgICAgdG90Ynl0ZXMrPWFkZF9yYW5kX2ZpbGUoZ2xvYmFsLCBmaWxlbmFtZSk7CisgICAgICAgIGlmKFJBTkRfc3RhdHVzKCkpCisgICAgICAgICAgICByZXR1cm4gMDsgLyogc3VjY2VzcyAqLworICAgIH0KKworI2lmZGVmIFJBTkRPTV9GSUxFCisgICAgdG90Ynl0ZXMrPWFkZF9yYW5kX2ZpbGUoZ2xvYmFsLCBSQU5ET01fRklMRSk7CisgICAgaWYoUkFORF9zdGF0dXMoKSkKKyAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyNlbmRpZgorCisjaWZkZWYgVVNFX1dJTjMyCisgICAgUkFORF9zY3JlZW4oKTsKKyAgICBpZihSQU5EX3N0YXR1cygpKSB7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNlZWRlZCBQUk5HIHdpdGggUkFORF9zY3JlZW4iKTsKKyAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisgICAgc19sb2coTE9HX0RFQlVHLCAiUkFORF9zY3JlZW4gZmFpbGVkIHRvIHN1ZmZpY2llbnRseSBzZWVkIFBSTkciKTsKKyNlbHNlCisgICAgaWYoZ2xvYmFsLT5lZ2Rfc29jaykgeworICAgICAgICBpZigoYnl0ZXM9UkFORF9lZ2QoZ2xvYmFsLT5lZ2Rfc29jaykpPT0tMSkgeworICAgICAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJFR0QgU29ja2V0ICVzIGZhaWxlZCIsIGdsb2JhbC0+ZWdkX3NvY2spOworICAgICAgICAgICAgYnl0ZXM9MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvdGJ5dGVzKz1ieXRlczsKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNuYWdnZWQgJWQgcmFuZG9tIGJ5dGVzIGZyb20gRUdEIFNvY2tldCAlcyIsCisgICAgICAgICAgICAgICAgYnl0ZXMsIGdsb2JhbC0+ZWdkX3NvY2spOworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIE9wZW5TU0wgYWx3YXlzIGdldHMgd2hhdCBpdCBuZWVkcyBvciBmYWlscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbyBubyBuZWVkIHRvIGNoZWNrIGlmIHNlZWRlZCBzdWZmaWNpZW50bHkgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiB0cnkgdGhlIGdvb2Qtb2xkIGRlZmF1bHQgL2Rldi91cmFuZG9tLCBpZiBhdmFpbGFibGUgICovCisgICAgdG90Ynl0ZXMrPWFkZF9yYW5kX2ZpbGUoZ2xvYmFsLCAiL2Rldi91cmFuZG9tIik7CisgICAgaWYoUkFORF9zdGF0dXMoKSkKKyAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKworICAgIC8qIHJhbmRvbSBmaWxlIHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJlICovCisgICAgc19sb2coTE9HX0VSUiwgIlBSTkcgc2VlZGVkIHdpdGggJWQgYnl0ZXMgdG90YWwiLCB0b3RieXRlcyk7CisgICAgc19sb2coTE9HX0VSUiwgIlBSTkcgd2FzIG5vdCBzZWVkZWQgd2l0aCBlbm91Z2ggcmFuZG9tIGJ5dGVzIik7CisgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworfQorCitOT0VYUE9SVCBpbnQgYWRkX3JhbmRfZmlsZShHTE9CQUxfT1BUSU9OUyAqZ2xvYmFsLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICAgIGludCByZWFkYnl0ZXM7CisgICAgaW50IHdyaXRlYnl0ZXM7CisgICAgc3RydWN0IHN0YXQgc2I7CisKKyAgICBpZihzdGF0KGZpbGVuYW1lLCAmc2IpKQorICAgICAgICByZXR1cm4gMDsgLyogY291bGQgbm90IHN0YXQoKSBmaWxlIC0tPiByZXR1cm4gMCBieXRlcyAqLworICAgIGlmKChyZWFkYnl0ZXM9UkFORF9sb2FkX2ZpbGUoZmlsZW5hbWUsIGdsb2JhbC0+cmFuZG9tX2J5dGVzKSkpCisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlNuYWdnZWQgJWQgcmFuZG9tIGJ5dGVzIGZyb20gJXMiLAorICAgICAgICAgICAgcmVhZGJ5dGVzLCBmaWxlbmFtZSk7CisgICAgZWxzZQorICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkNhbm5vdCByZXRyaWV2ZSBhbnkgcmFuZG9tIGRhdGEgZnJvbSAlcyIsCisgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgLyogd3JpdGUgbmV3IHJhbmRvbSBkYXRhIGZvciBmdXR1cmUgc2VlZGluZyBpZiBpdCdzIGEgcmVndWxhciBmaWxlICovCisgICAgaWYoZ2xvYmFsLT5vcHRpb24ucmFuZF93cml0ZSAmJiBTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisgICAgICAgIHdyaXRlYnl0ZXM9UkFORF93cml0ZV9maWxlKGZpbGVuYW1lKTsKKyAgICAgICAgaWYod3JpdGVieXRlcz09LTEpCisgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkZhaWxlZCB0byB3cml0ZSBzdHJvbmcgcmFuZG9tIGRhdGEgdG8gJXMgLSAiCisgICAgICAgICAgICAgICAgIm1heSBiZSBhIHBlcm1pc3Npb25zIG9yIHNlZWRpbmcgcHJvYmxlbSIsIGZpbGVuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiV3JvdGUgJWQgbmV3IHJhbmRvbSBieXRlcyB0byAlcyIsCisgICAgICAgICAgICAgICAgd3JpdGVieXRlcywgZmlsZW5hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmVhZGJ5dGVzOworfQorCisvKiBlbmQgb2Ygc3NsLmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9zdGhyZWFkcy5jIGIvc3JjL3N0aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlY2MzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGhyZWFkcy5jCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpZmRlZiBVU0VfT1MyCisjZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUworI2luY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKyNpZiBkZWZpbmVkKFVTRV9VQ09OVEVYVCkgfHwgZGVmaW5lZChVU0VfRk9SSykKKy8qIG5vIG5lZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zICovCisKK3ZvaWQgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihTRUNUSU9OX0NPREUgaSkgeworICAgICh2b2lkKWk7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgLyogZW1wdHkgKi8KK30KKwordm9pZCBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKFNFQ1RJT05fQ09ERSBpKSB7CisgICAgKHZvaWQpaTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAvKiBlbXB0eSAqLworfQorCisjZW5kaWYgLyogVVNFX1VDT05URVhUIHx8IFVTRV9GT1JLICovCisKKyNpZmRlZiBVU0VfVUNPTlRFWFQKKworI2lmIGRlZmluZWQoQ1BVX1NQQVJDKSAmJiAoIFwKKyAgICAgICAgZGVmaW5lZChPU19TT0xBUklTMl8wKSB8fCBcCisgICAgICAgIGRlZmluZWQoT1NfU09MQVJJUzJfMSkgfHwgXAorICAgICAgICBkZWZpbmVkKE9TX1NPTEFSSVMyXzIpIHx8IFwKKyAgICAgICAgZGVmaW5lZChPU19TT0xBUklTMl8zKSB8fCBcCisgICAgICAgIGRlZmluZWQoT1NfU09MQVJJUzJfNCkgfHwgXAorICAgICAgICBkZWZpbmVkKE9TX1NPTEFSSVMyXzUpIHx8IFwKKyAgICAgICAgZGVmaW5lZChPU19TT0xBUklTMl82KSB8fCBcCisgICAgICAgIGRlZmluZWQoT1NfU09MQVJJUzJfNykgfHwgXAorICAgICAgICBkZWZpbmVkKE9TX1NPTEFSSVMyXzgpKQorI2RlZmluZSBBUkdDIDIKKyNlbHNlCisjZGVmaW5lIEFSR0MgMQorI2VuZGlmCisKKy8qIGZpcnN0IGNvbnRleHQgb24gdGhlIHJlYWR5IGxpc3QgaXMgdGhlIGFjdGl2ZSBjb250ZXh0ICovCitDT05URVhUICpyZWFkeV9oZWFkPU5VTEwsICpyZWFkeV90YWlsPU5VTEw7ICAgICAgICAgLyogcmVhZHkgdG8gZXhlY3V0ZSAqLworQ09OVEVYVCAqd2FpdGluZ19oZWFkPU5VTEwsICp3YWl0aW5nX3RhaWw9TlVMTDsgICAgIC8qIHdhaXRpbmcgb24gcG9sbCgpICovCisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF9wcm9jZXNzX2lkKHZvaWQpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF90aHJlYWRfaWQodm9pZCkgeworICAgIHJldHVybiByZWFkeV9oZWFkID8gcmVhZHlfaGVhZC0+aWQgOiAwOworfQorCitOT0VYUE9SVCBDT05URVhUICpuZXdfY29udGV4dCh2b2lkKSB7CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9pZD0xOworICAgIENPTlRFWFQgKmNvbnRleHQ7CisKKyAgICAvKiBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgQ09OVEVYVCBzdHJ1Y3R1cmUgKi8KKyAgICBjb250ZXh0PXN0cl9hbGxvY19kZXRhY2hlZChzaXplb2YoQ09OVEVYVCkpOworICAgIGNvbnRleHQtPmlkPW5leHRfaWQrKzsKKyAgICBjb250ZXh0LT5mZHM9TlVMTDsKKyAgICBjb250ZXh0LT5yZWFkeT0wOworCisgICAgLyogYXBwZW5kIHRvIHRoZSB0YWlsIG9mIHRoZSByZWFkeSBxdWV1ZSAqLworICAgIGNvbnRleHQtPm5leHQ9TlVMTDsKKyAgICBpZihyZWFkeV90YWlsKQorICAgICAgICByZWFkeV90YWlsLT5uZXh0PWNvbnRleHQ7CisgICAgcmVhZHlfdGFpbD1jb250ZXh0OworICAgIGlmKCFyZWFkeV9oZWFkKQorICAgICAgICByZWFkeV9oZWFkPWNvbnRleHQ7CisKKyAgICByZXR1cm4gY29udGV4dDsKK30KKworaW50IHN0aHJlYWRzX2luaXQodm9pZCkgeworICAgIC8qIGNyZWF0ZSB0aGUgZmlyc3QgKGxpc3RlbmluZykgY29udGV4dCBhbmQgcHV0IGl0IGluIHRoZSBydW5uaW5nIHF1ZXVlICovCisgICAgaWYoIW5ld19jb250ZXh0KCkpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwgIkNhbm5vdCBjcmVhdGUgdGhlIGxpc3RlbmluZyBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiB1cGRhdGUgdGxzIGZvciBuZXdseSBhbGxvY2F0ZWQgcmVhZHlfaGVhZCAqLworICAgIHVpX3Rscz10bHNfYWxsb2MoTlVMTCwgdWlfdGxzLCAidWkiKTsKKyAgICAvKiBubyBuZWVkIHRvIGluaXRpYWxpemUgdWNvbnRleHRfdCBzdHJ1Y3R1cmUgaGVyZQorICAgICAgIGl0IHdpbGwgYmUgaW5pdGlhbGllZCB3aXRoIHN3YXBjb250ZXh0KCkgY2FsbCAqLworICAgIHJldHVybiAwOworfQorCitpbnQgY3JlYXRlX2NsaWVudChTT0NLRVQgbHMsIFNPQ0tFVCBzLCBDTEkgKmFyZywgdm9pZCAqKCpjbGkpKHZvaWQgKikpIHsKKyAgICBDT05URVhUICpjb250ZXh0OworCisgICAgKHZvaWQpbHM7IC8qIHRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCB3aXRoIFVTRV9GT1JLICovCisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJDcmVhdGluZyBhIG5ldyBjb250ZXh0Iik7CisgICAgY29udGV4dD1uZXdfY29udGV4dCgpOworICAgIGlmKCFjb250ZXh0KSB7CisgICAgICAgIHN0cl9mcmVlKGFyZyk7CisgICAgICAgIGlmKHM+PTApCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgY29udGV4dF90IHN0cnVjdHVyZSAqLworICAgIGlmKGdldGNvbnRleHQoJmNvbnRleHQtPmNvbnRleHQpPDApIHsKKyAgICAgICAgc3RyX2ZyZWUoY29udGV4dCk7CisgICAgICAgIHN0cl9mcmVlKGFyZyk7CisgICAgICAgIGlmKHM+PTApCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgaW9lcnJvcigiZ2V0Y29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNvbnRleHQtPmNvbnRleHQudWNfbGluaz1OVUxMOyAvKiBzdHVubmVsIGRvZXMgbm90IHVzZSB1Y19saW5rICovCisKKyAgICAvKiBjcmVhdGUgc3RhY2sgKi8KKyAgICBjb250ZXh0LT5zdGFjaz1zdHJfYWxsb2NfZGV0YWNoZWQoYXJnLT5vcHQtPnN0YWNrX3NpemUpOworI2lmIGRlZmluZWQoX19zZ2kpIHx8IEFSR0M9PTIgLyogb2Jzb2xldGUgc3Nfc3Agc2VtYW50aWNzICovCisgICAgY29udGV4dC0+Y29udGV4dC51Y19zdGFjay5zc19zcD1jb250ZXh0LT5zdGFjaythcmctPm9wdC0+c3RhY2tfc2l6ZS04OworI2Vsc2UKKyAgICBjb250ZXh0LT5jb250ZXh0LnVjX3N0YWNrLnNzX3NwPWNvbnRleHQtPnN0YWNrOworI2VuZGlmCisgICAgY29udGV4dC0+Y29udGV4dC51Y19zdGFjay5zc19zaXplPWFyZy0+b3B0LT5zdGFja19zaXplOworICAgIGNvbnRleHQtPmNvbnRleHQudWNfc3RhY2suc3NfZmxhZ3M9MDsKKworICAgIG1ha2Vjb250ZXh0KCZjb250ZXh0LT5jb250ZXh0LCAodm9pZCgqKSh2b2lkKSljbGksIEFSR0MsIGFyZyk7CisgICAgc19sb2coTE9HX0RFQlVHLCAiTmV3IGNvbnRleHQgY3JlYXRlZCIpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVVNFX1VDT05URVhUICovCisKKyNpZmRlZiBVU0VfRk9SSworCitpbnQgc3RocmVhZHNfaW5pdCh2b2lkKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF9wcm9jZXNzX2lkKHZvaWQpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF90aHJlYWRfaWQodm9pZCkgeworICAgIHJldHVybiAwTDsKK30KKworTk9FWFBPUlQgdm9pZCBudWxsX2hhbmRsZXIoaW50IHNpZykgeworICAgICh2b2lkKXNpZzsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBzaWduYWwoU0lHQ0hMRCwgbnVsbF9oYW5kbGVyKTsKK30KKworaW50IGNyZWF0ZV9jbGllbnQoU09DS0VUIGxzLCBTT0NLRVQgcywgQ0xJICphcmcsIHZvaWQgKigqY2xpKSh2b2lkICopKSB7CisgICAgc3dpdGNoKGZvcmsoKSkgeworICAgIGNhc2UgLTE6ICAgIC8qIGVycm9yICovCisgICAgICAgIHN0cl9mcmVlKGFyZyk7CisgICAgICAgIGlmKHM+PTApCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgIDA6ICAgIC8qIGNoaWxkICovCisgICAgICAgIGlmKGxzPj0wKQorICAgICAgICAgICAgY2xvc2Vzb2NrZXQobHMpOworICAgICAgICBzaWduYWwoU0lHQ0hMRCwgbnVsbF9oYW5kbGVyKTsKKyAgICAgICAgY2xpKGFyZyk7CisgICAgICAgIF9leGl0KDApOworICAgIGRlZmF1bHQ6ICAgIC8qIHBhcmVudCAqLworICAgICAgICBzdHJfZnJlZShhcmcpOworICAgICAgICBpZihzPj0wKQorICAgICAgICAgICAgY2xvc2Vzb2NrZXQocyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVVNFX0ZPUksgKi8KKworI2lmZGVmIFVTRV9QVEhSRUFECisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc3R1bm5lbF9jc1tDUklUX1NFQ1RJT05TXTsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgKmxvY2tfY3M7CisKK3ZvaWQgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihTRUNUSU9OX0NPREUgaSkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhzdHVubmVsX2NzK2kpOworfQorCit2b2lkIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oU0VDVElPTl9DT0RFIGkpIHsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jayhzdHVubmVsX2NzK2kpOworfQorCitOT0VYUE9SVCB2b2lkIGxvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbGluZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihtb2RlJkNSWVBUT19MT0NLKQorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2sobG9ja19jcyt0eXBlKTsKKyAgICBlbHNlCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGxvY2tfY3MrdHlwZSk7Cit9CisKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CisgICAgcHRocmVhZF9tdXRleF90IG11dGV4OworfTsKKworTk9FWFBPUlQgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpkeW5fY3JlYXRlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgIGludCBsaW5lKSB7CisgICAgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICp2YWx1ZTsKKworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbGluZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICB2YWx1ZT1zdHJfYWxsb2NfZGV0YWNoZWQoc2l6ZW9mKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSkpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmdmFsdWUtPm11dGV4LCBOVUxMKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK05PRVhQT1JUIHZvaWQgZHluX2xvY2tfZnVuY3Rpb24oaW50IG1vZGUsIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqdmFsdWUsCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgKHZvaWQpZmlsZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClsaW5lOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIGlmKG1vZGUmQ1JZUFRPX0xPQ0spCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdmFsdWUtPm11dGV4KTsKKyAgICBlbHNlCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2YWx1ZS0+bXV0ZXgpOworfQorCitOT0VYUE9SVCB2b2lkIGR5bl9kZXN0cm95X2Z1bmN0aW9uKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqdmFsdWUsCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgKHZvaWQpZmlsZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClsaW5lOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdmFsdWUtPm11dGV4KTsKKyAgICBzdHJfZnJlZSh2YWx1ZSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF9wcm9jZXNzX2lkKHZvaWQpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF90aHJlYWRfaWQodm9pZCkgeworI2lmIGRlZmluZWQoU1lTX2dldHRpZCkgJiYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXN5c2NhbGwoU1lTX2dldHRpZCk7CisjZWxzZQorICAgIHJldHVybiAodW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKyNlbmRpZgorfQorCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgxMDAwMDAwMEwKK05PRVhQT1JUIHZvaWQgdGhyZWFkaWRfZnVuYyhDUllQVE9fVEhSRUFESUQgKnRpZCkgeworICAgIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYyh0aWQsIHN0dW5uZWxfdGhyZWFkX2lkKCkpOworfQorI2VuZGlmCisKK2ludCBzdGhyZWFkc19pbml0KHZvaWQpIHsKKyAgICBpbnQgaTsKKworICAgIC8qIGluaXRpYWxpemUgc3R1bm5lbCBjcml0aWNhbCBzZWN0aW9ucyAqLworICAgIGZvcihpPTA7IGk8Q1JJVF9TRUNUSU9OUzsgaSsrKQorICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoc3R1bm5lbF9jcytpLCBOVUxMKTsKKworICAgIC8qIGluaXRpYWxpemUgT3BlblNTTCBsb2NraW5nIGNhbGxiYWNrICovCisgICAgbG9ja19jcz1zdHJfYWxsb2NfZGV0YWNoZWQoCisgICAgICAgIChzaXplX3QpQ1JZUFRPX251bV9sb2NrcygpKnNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKyAgICBmb3IoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorICAgICAgICBwdGhyZWFkX211dGV4X2luaXQobG9ja19jcytpLCBOVUxMKTsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAwMDAwTAorICAgIENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2sodGhyZWFkaWRfZnVuYyk7CisjZWxzZQorICAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soc3R1bm5lbF90aHJlYWRfaWQpOworI2VuZGlmCisgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tpbmdfY2FsbGJhY2spOworCisgICAgLyogaW5pdGlhbGl6ZSBPcGVuU1NMIGR5bmFtaWMgbG9ja3MgY2FsbGJhY2tzICovCisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlX2Z1bmN0aW9uKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhkeW5fbG9ja19mdW5jdGlvbik7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soZHluX2Rlc3Ryb3lfZnVuY3Rpb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjcmVhdGVfY2xpZW50KFNPQ0tFVCBscywgU09DS0VUIHMsIENMSSAqYXJnLCB2b2lkICooKmNsaSkodm9pZCAqKSkgeworICAgIHB0aHJlYWRfdCB0aHJlYWQ7CisgICAgcHRocmVhZF9hdHRyX3QgcHRoX2F0dHI7CisgICAgaW50IGVycm9yOworI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX1NJR01BU0spICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAvKiBkaXNhYmxlZCBvbiBPUyBYIGR1ZSB0byBzdHJhbmdlIHByb2JsZW1zIG9uIE1hYyBPUyBYIDEwLjUKKyAgICAgICBpdCBzZWVtcyB0byByZXN0b3JlIHNpZ25hbCBtYXNrIHNvbWV3aGVyZSAoSSBjb3VsZG4ndCBmaW5kIHdoZXJlKQorICAgICAgIGVmZmVjdGl2ZWx5IGJsb2NraW5nIHNpZ25hbHMgYWZ0ZXIgZmlyc3QgYWNjZXB0ZWQgY29ubmVjdGlvbiAqLworICAgIHNpZ3NldF90IG5ld19zZXQsIG9sZF9zZXQ7CisjZW5kaWYgLyogSEFWRV9QVEhSRUFEX1NJR01BU0sgJiYgIV9fQVBQTEVfXyovCisKKyAgICAodm9pZClsczsgLyogdGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIHdpdGggVVNFX0ZPUksgKi8KKworI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX1NJR01BU0spICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAvKiB0aGUgaWRlYSBpcyB0aGF0IG9ubHkgdGhlIG1haW4gdGhyZWFkIGhhbmRsZXMgYWxsIHRoZSBzaWduYWxzIHdpdGgKKyAgICAgKiBwb3NpeCB0aHJlYWRzOyAgc2lnbmFscyBhcmUgYmxvY2tlZCBmb3IgYW55IG90aGVyIHRocmVhZCAqLworICAgIHNpZ2ZpbGxzZXQoJm5ld19zZXQpOworICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm5ld19zZXQsICZvbGRfc2V0KTsgLyogYmxvY2sgc2lnbmFscyAqLworI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9TSUdNQVNLICYmICFfX0FQUExFX18qLworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZwdGhfYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZwdGhfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworICAgIHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnB0aF9hdHRyLCBhcmctPm9wdC0+c3RhY2tfc2l6ZSk7CisgICAgZXJyb3I9cHRocmVhZF9jcmVhdGUoJnRocmVhZCwgJnB0aF9hdHRyLCBjbGksIGFyZyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnB0aF9hdHRyKTsKKyNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9TSUdNQVNLKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisgICAgcHRocmVhZF9zaWdtYXNrKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7IC8qIHVuYmxvY2sgc2lnbmFscyAqLworI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9TSUdNQVNLICYmICFfX0FQUExFX18qLworCisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgZXJybm89ZXJyb3I7CisgICAgICAgIGlvZXJyb3IoInB0aHJlYWRfY3JlYXRlIik7CisgICAgICAgIHN0cl9mcmVlKGFyZyk7CisgICAgICAgIGlmKHM+PTApCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFVTRV9QVEhSRUFEICovCisKKyNpZmRlZiBVU0VfV0lOMzIKKworc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gc3R1bm5lbF9jc1tDUklUX1NFQ1RJT05TXTsKK3N0YXRpYyBDUklUSUNBTF9TRUNUSU9OICpsb2NrX2NzOworCit2b2lkIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oU0VDVElPTl9DT0RFIGkpIHsKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihzdHVubmVsX2NzK2kpOworfQorCit2b2lkIGxlYXZlX2NyaXRpY2FsX3NlY3Rpb24oU0VDVElPTl9DT0RFIGkpIHsKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihzdHVubmVsX2NzK2kpOworfQorCitOT0VYUE9SVCB2b2lkIGxvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbGluZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihtb2RlJkNSWVBUT19MT0NLKQorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihsb2NrX2NzK3R5cGUpOworICAgIGVsc2UKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24obG9ja19jcyt0eXBlKTsKK30KKworc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlIHsKKyAgICBDUklUSUNBTF9TRUNUSU9OIG11dGV4OworfTsKKworTk9FWFBPUlQgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpkeW5fY3JlYXRlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgIGludCBsaW5lKSB7CisgICAgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICp2YWx1ZTsKKworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbGluZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICB2YWx1ZT1zdHJfYWxsb2NfZGV0YWNoZWQoc2l6ZW9mKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSkpOworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJnZhbHVlLT5tdXRleCk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitOT0VYUE9SVCB2b2lkIGR5bl9sb2NrX2Z1bmN0aW9uKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKnZhbHVlLAorICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbGluZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZihtb2RlJkNSWVBUT19MT0NLKQorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmFsdWUtPm11dGV4KTsKKyAgICBlbHNlCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ2YWx1ZS0+bXV0ZXgpOworfQorCitOT0VYUE9SVCB2b2lkIGR5bl9kZXN0cm95X2Z1bmN0aW9uKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqdmFsdWUsCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgKHZvaWQpZmlsZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClsaW5lOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmdmFsdWUtPm11dGV4KTsKKyAgICBzdHJfZnJlZSh2YWx1ZSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3R1bm5lbF9wcm9jZXNzX2lkKHZvaWQpIHsKKyAgICByZXR1cm4gR2V0Q3VycmVudFByb2Nlc3NJZCgpICYgMHgwMGZmZmZmZjsKK30KKwordW5zaWduZWQgbG9uZyBzdHVubmVsX3RocmVhZF9pZCh2b2lkKSB7CisgICAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpICYgMHgwMGZmZmZmZjsKK30KKworaW50IHN0aHJlYWRzX2luaXQodm9pZCkgeworICAgIGludCBpOworCisgICAgLyogaW5pdGlhbGl6ZSBzdHVubmVsIGNyaXRpY2FsIHNlY3Rpb25zICovCisgICAgZm9yKGk9MDsgaTxDUklUX1NFQ1RJT05TOyBpKyspCisgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oc3R1bm5lbF9jcytpKTsKKworICAgIC8qIGluaXRpYWxpemUgT3BlblNTTCBsb2NraW5nIGNhbGxiYWNrICovCisgICAgbG9ja19jcz1zdHJfYWxsb2NfZGV0YWNoZWQoCisgICAgICAgIChzaXplX3QpQ1JZUFRPX251bV9sb2NrcygpKnNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CisgICAgZm9yKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihsb2NrX2NzK2kpOworICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhsb2NraW5nX2NhbGxiYWNrKTsKKworICAgIC8qIGluaXRpYWxpemUgT3BlblNTTCBkeW5hbWljIGxvY2tzIGNhbGxiYWNrcyAqLworICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soZHluX2NyZWF0ZV9mdW5jdGlvbik7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2tfZnVuY3Rpb24pOworICAgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGR5bl9kZXN0cm95X2Z1bmN0aW9uKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgY3JlYXRlX2NsaWVudChTT0NLRVQgbHMsIFNPQ0tFVCBzLCBDTEkgKmFyZywgdm9pZCAqKCpjbGkpKHZvaWQgKikpIHsKKyAgICAodm9pZClsczsgLyogdGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIHdpdGggVVNFX0ZPUksgKi8KKyAgICBzX2xvZyhMT0dfREVCVUcsICJDcmVhdGluZyBhIG5ldyB0aHJlYWQiKTsKKyAgICBpZigobG9uZylfYmVnaW50aHJlYWQoKHZvaWQoKikodm9pZCAqKSljbGksIGFyZy0+b3B0LT5zdGFja19zaXplLCBhcmcpPT0tMSkgeworICAgICAgICBpb2Vycm9yKCJfYmVnaW50aHJlYWQiKTsKKyAgICAgICAgc3RyX2ZyZWUoYXJnKTsKKyAgICAgICAgaWYocyE9SU5WQUxJRF9TT0NLRVQpCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzX2xvZyhMT0dfREVCVUcsICJOZXcgdGhyZWFkIGNyZWF0ZWQiKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFVTRV9XSU4zMiAqLworCisjaWZkZWYgVVNFX09TMgorCit2b2lkIGVudGVyX2NyaXRpY2FsX3NlY3Rpb24oU0VDVElPTl9DT0RFIGkpIHsKKyAgICBEb3NFbnRlckNyaXRTZWMoKTsKK30KKwordm9pZCBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKFNFQ1RJT05fQ09ERSBpKSB7CisgICAgRG9zRXhpdENyaXRTZWMoKTsKK30KKworaW50IHN0aHJlYWRzX2luaXQodm9pZCkgeworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHN0dW5uZWxfcHJvY2Vzc19pZCh2b2lkKSB7CisgICAgUFRJQiBwdGliPU5VTEw7CisgICAgRG9zR2V0SW5mb0Jsb2NrcygmcHRpYiwgTlVMTCk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXB0aWItPnRpYl9vcmRpbmFsOworfQorCit1bnNpZ25lZCBsb25nIHN0dW5uZWxfdGhyZWFkX2lkKHZvaWQpIHsKKyAgICBQUElCIHBwaWI9TlVMTDsKKyAgICBEb3NHZXRJbmZvQmxvY2tzKE5VTEwsICZwcGliKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHBpYi0+cGliX3VscGlkOworfQorCitpbnQgY3JlYXRlX2NsaWVudChTT0NLRVQgbHMsIFNPQ0tFVCBzLCBDTEkgKmFyZywgdm9pZCAqKCpjbGkpKHZvaWQgKikpIHsKKyAgICAodm9pZClsczsgLyogdGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIHdpdGggVVNFX0ZPUksgKi8KKyAgICBzX2xvZyhMT0dfREVCVUcsICJDcmVhdGluZyBhIG5ldyB0aHJlYWQiKTsKKyAgICBpZigobG9uZylfYmVnaW50aHJlYWQoKHZvaWQoKikodm9pZCAqKSljbGksIE5VTEwsIGFyZy0+b3B0LT5zdGFja19zaXplLCBhcmcpPT0tMUwpIHsKKyAgICAgICAgaW9lcnJvcigiX2JlZ2ludGhyZWFkIik7CisgICAgICAgIHN0cl9mcmVlKGFyZyk7CisgICAgICAgIGlmKHM+PTApCisgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzX2xvZyhMT0dfREVCVUcsICJOZXcgdGhyZWFkIGNyZWF0ZWQiKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFVTRV9PUzIgKi8KKworI2lmZGVmIF9XSU4zMl9XQ0UKKworbG9uZyBfYmVnaW50aHJlYWQodm9pZCAoKnN0YXJ0X2FkZHJlc3MpKHZvaWQgKiksCisgICAgICAgIGludCBzdGFja19zaXplLCB2b2lkICphcmdsaXN0KSB7CisgICAgRFdPUkQgdGhyZWFkX2lkOworICAgIEhBTkRMRSBoYW5kbGU7CisKKyAgICBoYW5kbGU9Q3JlYXRlVGhyZWFkKE5VTEwsIHN0YWNrX3NpemUsCisgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKXN0YXJ0X2FkZHJlc3MsIGFyZ2xpc3QsCisgICAgICAgIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJnRocmVhZF9pZCk7CisgICAgaWYoIWhhbmRsZSkKKyAgICAgICAgcmV0dXJuIC0xTDsKKyAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICAgIHJldHVybiAwOworfQorCit2b2lkIF9lbmR0aHJlYWQodm9pZCkgeworICAgIEV4aXRUaHJlYWQoMCk7Cit9CisKKyNlbmRpZiAvKiBfV0lOMzJfV0NFICovCisKKyNpZmRlZiBERUJVR19TVEFDS19TSVpFCisKKyNkZWZpbmUgU1RBQ0tfUkVTRVJWRSAoU1RBQ0tfU0laRS84KQorI2RlZmluZSBWRVJJRllfQVJFQSAoKFNUQUNLX1NJWkUtU1RBQ0tfUkVTRVJWRSkvc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgVEVTVF9WQUxVRSAweGRlYWRiZWVmCisKKy8qIHNvbWUgaGV1cmlzdGljIHRvIGRldGVybWluZSB0aGUgdXNhZ2Ugb2YgY2xpZW50IHN0YWNrIHNpemUgKi8KK3ZvaWQgc3RhY2tfaW5mbyhpbnQgaW5pdCkgeyAvKiAxLWluaXRpYWxpemUsIDAtZGlzcGxheSAqLworICAgIHVpbnQzMl90IHRhYmxlW1ZFUklGWV9BUkVBXTsKKyAgICBpbnQgaSwgbnVtOworICAgIHN0YXRpYyBpbnQgbWluX251bT1WRVJJRllfQVJFQTsKKworICAgIGlmKGluaXQpIHsKKyAgICAgICAgZm9yKGk9MDsgaTxWRVJJRllfQVJFQTsgaSsrKQorICAgICAgICAgICAgdGFibGVbaV09VEVTVF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB0aGUgc3RhY2sgaXMgZ3Jvd2luZyBkb3duICovCisgICAgICAgIGZvcihpPTA7IGk8VkVSSUZZX0FSRUE7IGkrKykKKyAgICAgICAgICAgIGlmKHRhYmxlW2ldIT1URVNUX1ZBTFVFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBudW09aTsKKyAgICAgICAgLyogdGhlIHN0YWNrIGlzIGdyb3dpbmcgdXAgKi8KKyAgICAgICAgZm9yKGk9MDsgaTxWRVJJRllfQVJFQTsgaSsrKQorICAgICAgICAgICAgaWYodGFibGVbVkVSSUZZX0FSRUEtaS0xXSE9VEVTVF9WQUxVRSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoaT5udW0pIC8qIHVzZSB0aGUgaGlnaGVyIHZhbHVlICovCisgICAgICAgICAgICBudW09aTsKKyAgICAgICAgaWYobnVtPDY0KSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiU1RBQ0tfUkVTRVJWRSBpcyB0b28gaGlnaCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKG51bTxtaW5fbnVtKQorICAgICAgICAgICAgbWluX251bT1udW07CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsCisgICAgICAgICAgICAic3RhY2tfaW5mbzogc2l6ZT0lZCwgY3VycmVudD0lZCAoJWQlJSksIG1heGltdW09JWQgKCVkJSUpIiwKKyAgICAgICAgICAgIFNUQUNLX1NJWkUsCisgICAgICAgICAgICAoaW50KSgoVkVSSUZZX0FSRUEtbnVtKSpzaXplb2YodWludDMyX3QpKSwKKyAgICAgICAgICAgIChpbnQpKChWRVJJRllfQVJFQS1udW0pKnNpemVvZih1aW50MzJfdCkqMTAwL1NUQUNLX1NJWkUpLAorICAgICAgICAgICAgKGludCkoKFZFUklGWV9BUkVBLW1pbl9udW0pKnNpemVvZih1aW50MzJfdCkpLAorICAgICAgICAgICAgKGludCkoKFZFUklGWV9BUkVBLW1pbl9udW0pKnNpemVvZih1aW50MzJfdCkqMTAwL1NUQUNLX1NJWkUpKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBERUJVR19TVEFDS19TSVpFICovCisKKy8qIGVuZCBvZiBzdGhyZWFkcy5jICovCmRpZmYgLS1naXQgYS9zcmMvc3RyLmMgYi9zcmMvc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0NTgzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdHIuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqICAgc3R1bm5lbCAgICAgICBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICogICBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gc3R1bm5lbC4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisgKgorICogICBJbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXIgb2Ygc3R1bm5lbAorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yCisgKiAgIGxpYnJhcmllcyB0aGF0IGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIExHUEwgYW5kIHdpdGggY29kZSBpbmNsdWRlZAorICogICBpbiB0aGUgc3RhbmRhcmQgcmVsZWFzZSBvZiBPcGVuU1NMIHVuZGVyIHRoZSBPcGVuU1NMIExpY2Vuc2UgKG9yCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQorICogICBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgZm9yCisgKiAgIHN0dW5uZWwgYW5kIHRoZSBsaWNlbnNlcyBvZiB0aGUgb3RoZXIgY29kZSBjb25jZXJuZWQuCisgKgorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgorCitzdHJ1Y3QgYWxsb2NfbGlzdF9zdHJ1Y3QgeworICAgIEFMTE9DX0xJU1QgKnByZXYsICpuZXh0OworICAgIFRMU19EQVRBICp0bHM7CisgICAgc2l6ZV90IHNpemU7CisgICAgY29uc3QgY2hhciAqYWxsb2NfZmlsZSwgKmZyZWVfZmlsZTsKKyAgICBpbnQgYWxsb2NfbGluZSwgZnJlZV9saW5lOworICAgIHVuc2lnbmVkIHZhbGlkX2NhbmFyeSwgbWFnaWM7CisgICAgICAgIC8qIGF0IGxlYXN0IG9uIElBNjQgYWxsb2NhdGlvbnMgbmVlZCB0byBiZSBhbGlnbmVkICovCisjaWZkZWYgX19HTlVDX18KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKKyNlbHNlCisgICAgdWludDY0X3QgOjA7IC8qIGFsaWduIHRoZSBzdHJ1Y3R1cmUgKi8KK307CisjZW5kaWYKKworI2lmZGVmIFVTRV9XSU4zMgorTk9FWFBPUlQgTFBUU1RSIHN0cl92dHByaW50ZihMUENUU1RSLCB2YV9saXN0KTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKworTk9FWFBPUlQgQUxMT0NfTElTVCAqZ2V0X2FsbG9jX2xpc3RfcHRyKHZvaWQgKiwgY29uc3QgY2hhciAqLCBpbnQpOworTk9FWFBPUlQgdm9pZCBzdHJfbGVha19kZWJ1ZyhBTExPQ19MSVNUICosIGludCk7CisKK1RMU19EQVRBICp1aV90bHM7CitzdGF0aWMgdWludDhfdCBjYW5hcnlbMTBdOyAvKiA4MC1iaXQgY2FuYXJ5IHZhbHVlICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2FuYXJ5X2luaXRpYWxpemVkPTB4YWJhZGJhYmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHN0cmluZyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCisKKyNpZm5kZWYgdmFfY29weQorI2lmZGVmIF9fdmFfY29weQorI2RlZmluZSB2YV9jb3B5KGRzdCwgc3JjKSBfX3ZhX2NvcHkoKGRzdCksIChzcmMpKQorI2Vsc2UgLyogX192YV9jb3B5ICovCisjZGVmaW5lIHZhX2NvcHkoZHN0LCBzcmMpIG1lbWNweSgmKGRzdCksICYoc3JjKSwgc2l6ZW9mKHZhX2xpc3QpKQorI2VuZGlmIC8qIF9fdmFfY29weSAqLworI2VuZGlmIC8qIHZhX2NvcHkgKi8KKworY2hhciAqc3RyX2R1cF9kZWJ1Zyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgY2hhciAqcmV0dmFsOworCisgICAgcmV0dmFsPXN0cl9hbGxvY19kZWJ1ZyhzdHJsZW4oc3RyKSsxLCBmaWxlLCBsaW5lKTsKKyAgICBzdHJjcHkocmV0dmFsLCBzdHIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK2NoYXIgKnN0cl9wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgICBjaGFyICp0eHQ7CisgICAgdmFfbGlzdCBhcmdsaXN0OworCisgICAgdmFfc3RhcnQoYXJnbGlzdCwgZm9ybWF0KTsKKyAgICB0eHQ9c3RyX3ZwcmludGYoZm9ybWF0LCBhcmdsaXN0KTsKKyAgICB2YV9lbmQoYXJnbGlzdCk7CisgICAgcmV0dXJuIHR4dDsKK30KKworY2hhciAqc3RyX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHN0YXJ0X2FwKSB7CisgICAgaW50IG47CisgICAgc2l6ZV90IHNpemU9MzI7CisgICAgY2hhciAqcDsKKyAgICB2YV9saXN0IGFwOworCisgICAgcD1zdHJfYWxsb2Moc2l6ZSk7CisgICAgZm9yKDs7KSB7CisgICAgICAgIHZhX2NvcHkoYXAsIHN0YXJ0X2FwKTsKKyAgICAgICAgbj12c25wcmludGYocCwgc2l6ZSwgZm9ybWF0LCBhcCk7CisgICAgICAgIGlmKG4+LTEgJiYgbjwoaW50KXNpemUpCisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgaWYobj4tMSkgICAgICAgICAgICAgICAgLyogZ2xpYmMgMi4xICovCisgICAgICAgICAgICBzaXplPShzaXplX3QpbisxOyAgIC8qIHByZWNpc2VseSB3aGF0IGlzIG5lZWRlZCAqLworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAvKiBnbGliYyAyLjAsIFdJTjMyLCBldGMuICovCisgICAgICAgICAgICBzaXplKj0yOyAgICAgICAgICAgIC8qIHR3aWNlIHRoZSBvbGQgc2l6ZSAqLworICAgICAgICBwPXN0cl9yZWFsbG9jKHAsIHNpemUpOworICAgIH0KK30KKworI2lmZGVmIFVTRV9XSU4zMgorCitMUFRTVFIgc3RyX3RwcmludGYoTFBDVFNUUiBmb3JtYXQsIC4uLikgeworICAgIExQVFNUUiB0eHQ7CisgICAgdmFfbGlzdCBhcmdsaXN0OworCisgICAgdmFfc3RhcnQoYXJnbGlzdCwgZm9ybWF0KTsKKyAgICB0eHQ9c3RyX3Z0cHJpbnRmKGZvcm1hdCwgYXJnbGlzdCk7CisgICAgdmFfZW5kKGFyZ2xpc3QpOworICAgIHJldHVybiB0eHQ7Cit9CisKK05PRVhQT1JUIExQVFNUUiBzdHJfdnRwcmludGYoTFBDVFNUUiBmb3JtYXQsIHZhX2xpc3Qgc3RhcnRfYXApIHsKKyAgICBpbnQgbjsKKyAgICBzaXplX3Qgc2l6ZT0zMjsKKyAgICBMUFRTVFIgcDsKKyAgICB2YV9saXN0IGFwOworCisgICAgcD1zdHJfYWxsb2Moc2l6ZSpzaXplb2YoVENIQVIpKTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgdmFfY29weShhcCwgc3RhcnRfYXApOworICAgICAgICBuPV92c250cHJpbnRmKHAsIHNpemUsIGZvcm1hdCwgYXApOworICAgICAgICBpZihuPi0xICYmIG48KGludClzaXplKQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIHNpemUqPTI7CisgICAgICAgIHA9c3RyX3JlYWxsb2MocCwgc2l6ZSpzaXplb2YoVENIQVIpKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycyAqLworCit2b2lkIHN0cl9pbml0KFRMU19EQVRBICp0bHNfZGF0YSkgeworICAgIHRsc19kYXRhLT5hbGxvY19oZWFkPU5VTEw7CisgICAgdGxzX2RhdGEtPmFsbG9jX2J5dGVzPXRsc19kYXRhLT5hbGxvY19ibG9ja3M9MDsKK30KKwordm9pZCBzdHJfY2xlYW51cChUTFNfREFUQSAqdGxzX2RhdGEpIHsKKyAgICAvKiBmcmVlIGFsbCBhdHRhY2hlZCBhbGxvY2F0aW9ucyAqLworICAgIHdoaWxlKHRsc19kYXRhLT5hbGxvY19oZWFkKSAvKiBzdHJfZnJlZSBtYWNybyByZXF1aXJlcyBhbiBsdmFsdWUgKi8KKyAgICAgICAgc3RyX2ZyZWVfZXhwcmVzc2lvbih0bHNfZGF0YS0+YWxsb2NfaGVhZCsxKTsKK30KKwordm9pZCBzdHJfY2FuYXJ5X2luaXQoKSB7CisgICAgaWYoY2FuYXJ5X2luaXRpYWxpemVkIT0weGFiYWRiYWJlKQorICAgICAgICByZXR1cm47IC8qIHByZXZlbnQgZG91YmxlIGluaXRpYWxpemF0aW9uIG9uIGNvbmZpZyByZWxvYWQgKi8KKyAgICBSQU5EX2J5dGVzKGNhbmFyeSwgc2l6ZW9mIGNhbmFyeSk7CisgICAgLyogYW4gZXJyb3Igd291bGQgcmVkdWNlIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNhbmFyaWVzICovCisgICAgLyogdGhpcyBpcyBub3RoaW5nIGNyaXRpY2FsLCBzbyB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgaGVyZSAqLworICAgIGNhbmFyeV9pbml0aWFsaXplZD0weGMwZGVkOyAvKiBhZnRlciBSQU5EX2J5dGVzICovCit9CisKK3ZvaWQgc3RyX3N0YXRzKCkgeworICAgIFRMU19EQVRBICp0bHNfZGF0YTsKKyAgICBBTExPQ19MSVNUICphbGxvY19saXN0OworICAgIGludCBpPTA7CisKKyAgICBpZighdGxzX2luaXRpYWxpemVkKQorICAgICAgICBmYXRhbCgic3RyIG5vdCBpbml0aWFsaXplZCIpOworICAgIHRsc19kYXRhPXRsc19nZXQoKTsKKyAgICBpZighdGxzX2RhdGEgfHwgKCF0bHNfZGF0YS0+YWxsb2NfYmxvY2tzICYmICF0bHNfZGF0YS0+YWxsb2NfYnl0ZXMpKQorICAgICAgICByZXR1cm47IC8qIHNraXAgaWYgbm8gZGF0YSBpcyBhbGxvY2F0ZWQgKi8KKyAgICBzX2xvZyhMT0dfREVCVUcsICJzdHJfc3RhdHM6ICVsdSBibG9jayhzKSwgIgorICAgICAgICAgICAgIiVsdSBkYXRhIGJ5dGUocyksICVsdSBjb250cm9sIGJ5dGUocykiLAorICAgICAgICAodW5zaWduZWQgbG9uZyl0bHNfZGF0YS0+YWxsb2NfYmxvY2tzLAorICAgICAgICAodW5zaWduZWQgbG9uZyl0bHNfZGF0YS0+YWxsb2NfYnl0ZXMsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSh0bHNfZGF0YS0+YWxsb2NfYmxvY2tzKgorICAgICAgICAgICAgKHNpemVvZihBTExPQ19MSVNUKStzaXplb2YgY2FuYXJ5KSkpOworICAgIGZvcihhbGxvY19saXN0PXRsc19kYXRhLT5hbGxvY19oZWFkOyBhbGxvY19saXN0OyBhbGxvY19saXN0PWFsbG9jX2xpc3QtPm5leHQpIHsKKyAgICAgICAgaWYoKytpPjEwKSAvKiBsaW1pdCB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJzdHJfc3RhdHM6ICVsdSBieXRlKHMpIGF0ICVzOiVkIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWFsbG9jX2xpc3QtPnNpemUsCisgICAgICAgICAgICBhbGxvY19saXN0LT5hbGxvY19maWxlLCBhbGxvY19saXN0LT5hbGxvY19saW5lKTsKKyAgICB9Cit9CisKK3ZvaWQgKnN0cl9hbGxvY19kZWJ1ZyhzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKKyAgICBUTFNfREFUQSAqdGxzX2RhdGE7CisgICAgQUxMT0NfTElTVCAqYWxsb2NfbGlzdDsKKworICAgIGlmKCF0bHNfaW5pdGlhbGl6ZWQpCisgICAgICAgIGZhdGFsX2RlYnVnKCJzdHIgbm90IGluaXRpYWxpemVkIiwgZmlsZSwgbGluZSk7CisgICAgdGxzX2RhdGE9dGxzX2dldCgpOworICAgIGlmKCF0bHNfZGF0YSkgeworICAgICAgICB0bHNfZGF0YT10bHNfYWxsb2MoTlVMTCwgTlVMTCwgImFsbG9jIik7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJJTlRFUk5BTCBFUlJPUjogVW5pbml0aWFsaXplZCBUTFMgYXQgJXMsIGxpbmUgJWQiLAorICAgICAgICAgICAgZmlsZSwgbGluZSk7CisgICAgfQorCisgICAgYWxsb2NfbGlzdD0oQUxMT0NfTElTVCAqKXN0cl9hbGxvY19kZXRhY2hlZF9kZWJ1ZyhzaXplLCBmaWxlLCBsaW5lKS0xOworICAgIGFsbG9jX2xpc3QtPnByZXY9TlVMTDsKKyAgICBhbGxvY19saXN0LT5uZXh0PXRsc19kYXRhLT5hbGxvY19oZWFkOworICAgIGFsbG9jX2xpc3QtPnRscz10bHNfZGF0YTsKKyAgICBpZih0bHNfZGF0YS0+YWxsb2NfaGVhZCkKKyAgICAgICAgdGxzX2RhdGEtPmFsbG9jX2hlYWQtPnByZXY9YWxsb2NfbGlzdDsKKyAgICB0bHNfZGF0YS0+YWxsb2NfaGVhZD1hbGxvY19saXN0OworICAgIHRsc19kYXRhLT5hbGxvY19ieXRlcys9c2l6ZTsKKyAgICB0bHNfZGF0YS0+YWxsb2NfYmxvY2tzKys7CisKKyAgICByZXR1cm4gYWxsb2NfbGlzdCsxOworfQorCit2b2lkICpzdHJfYWxsb2NfZGV0YWNoZWRfZGVidWcoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgQUxMT0NfTElTVCAqYWxsb2NfbGlzdDsKKworI2lmIDAKKyAgICBwcmludGYoImFsbG9jYXRpbmcgJWx1IGJ5dGVzIGF0ICVzOiVkXG4iLCAodW5zaWduZWQgbG9uZylzaXplLCBmaWxlLCBsaW5lKTsKKyNlbmRpZgorICAgIGFsbG9jX2xpc3Q9Y2FsbG9jKDEsIHNpemVvZihBTExPQ19MSVNUKStzaXplK3NpemVvZiBjYW5hcnkpOworICAgIGlmKCFhbGxvY19saXN0KQorICAgICAgICBmYXRhbF9kZWJ1ZygiT3V0IG9mIG1lbW9yeSIsIGZpbGUsIGxpbmUpOworICAgIGFsbG9jX2xpc3QtPnByZXY9TlVMTDsgLyogZm9yIGRlYnVnZ2luZyAqLworICAgIGFsbG9jX2xpc3QtPm5leHQ9TlVMTDsgLyogZm9yIGRlYnVnZ2luZyAqLworICAgIGFsbG9jX2xpc3QtPnRscz1OVUxMOworICAgIGFsbG9jX2xpc3QtPnNpemU9c2l6ZTsKKyAgICBhbGxvY19saXN0LT5hbGxvY19maWxlPWZpbGU7CisgICAgYWxsb2NfbGlzdC0+YWxsb2NfbGluZT1saW5lOworICAgIGFsbG9jX2xpc3QtPmZyZWVfZmlsZT0ibm9uZSI7CisgICAgYWxsb2NfbGlzdC0+ZnJlZV9saW5lPTA7CisgICAgYWxsb2NfbGlzdC0+dmFsaWRfY2FuYXJ5PWNhbmFyeV9pbml0aWFsaXplZDsgLyogYmVmb3JlIG1lbWNweSAqLworICAgIG1lbWNweSgodWludDhfdCAqKShhbGxvY19saXN0KzEpK3NpemUsIGNhbmFyeSwgc2l6ZW9mIGNhbmFyeSk7CisgICAgYWxsb2NfbGlzdC0+bWFnaWM9MHhhMTEwYzhlZDsKKyAgICBzdHJfbGVha19kZWJ1ZyhhbGxvY19saXN0LCAxKTsKKworICAgIHJldHVybiBhbGxvY19saXN0KzE7Cit9CisKK3ZvaWQgKnN0cl9yZWFsbG9jX2RlYnVnKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgQUxMT0NfTElTVCAqcHJldl9hbGxvY19saXN0LCAqYWxsb2NfbGlzdDsKKworICAgIGlmKCFwdHIpCisgICAgICAgIHJldHVybiBzdHJfYWxsb2NfZGVidWcoc2l6ZSwgZmlsZSwgbGluZSk7CisgICAgcHJldl9hbGxvY19saXN0PWdldF9hbGxvY19saXN0X3B0cihwdHIsIGZpbGUsIGxpbmUpOworICAgIHN0cl9sZWFrX2RlYnVnKHByZXZfYWxsb2NfbGlzdCwgLTEpOworICAgIGlmKHByZXZfYWxsb2NfbGlzdC0+c2l6ZT5zaXplKSAvKiBzaHJpbmtpbmcgdGhlIGFsbG9jYXRpb24gKi8KKyAgICAgICAgbWVtc2V0KCh1aW50OF90ICopcHRyK3NpemUsIDAsIHByZXZfYWxsb2NfbGlzdC0+c2l6ZS1zaXplKTsgLyogcGFyYW5vaWEgKi8KKyAgICBhbGxvY19saXN0PXJlYWxsb2MocHJldl9hbGxvY19saXN0LAorICAgICAgICBzaXplb2YoQUxMT0NfTElTVCkrc2l6ZStzaXplb2YgY2FuYXJ5KTsKKyAgICBpZighYWxsb2NfbGlzdCkKKyAgICAgICAgZmF0YWxfZGVidWcoIk91dCBvZiBtZW1vcnkiLCBmaWxlLCBsaW5lKTsKKyAgICBwdHI9YWxsb2NfbGlzdCsxOworICAgIGlmKHNpemU+YWxsb2NfbGlzdC0+c2l6ZSkgLyogZ3Jvd2luZyB0aGUgYWxsb2NhdGlvbiAqLworICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKilwdHIrYWxsb2NfbGlzdC0+c2l6ZSwgMCwgc2l6ZS1hbGxvY19saXN0LT5zaXplKTsKKyAgICBpZihhbGxvY19saXN0LT50bHMpIHsgLyogbm90IGRldGFjaGVkICovCisgICAgICAgIC8qIHJlZnJlc2ggcG9zc2libHkgaW52YWxpZGF0ZWQgbGlua2VkIGxpc3QgcG9pbnRlcnMgKi8KKyAgICAgICAgaWYoYWxsb2NfbGlzdC0+dGxzLT5hbGxvY19oZWFkPT1wcmV2X2FsbG9jX2xpc3QpCisgICAgICAgICAgICBhbGxvY19saXN0LT50bHMtPmFsbG9jX2hlYWQ9YWxsb2NfbGlzdDsKKyAgICAgICAgaWYoYWxsb2NfbGlzdC0+bmV4dCkKKyAgICAgICAgICAgIGFsbG9jX2xpc3QtPm5leHQtPnByZXY9YWxsb2NfbGlzdDsKKyAgICAgICAgaWYoYWxsb2NfbGlzdC0+cHJldikKKyAgICAgICAgICAgIGFsbG9jX2xpc3QtPnByZXYtPm5leHQ9YWxsb2NfbGlzdDsKKyAgICAgICAgLyogdXBkYXRlIHN0YXRpc3RpY3Mgd2hpbGUgdGhlIG9sZCBzaXplIGlzIHN0aWxsIGF2YWlsYWJsZSAqLworICAgICAgICBhbGxvY19saXN0LT50bHMtPmFsbG9jX2J5dGVzKz1zaXplLWFsbG9jX2xpc3QtPnNpemU7CisgICAgfQorICAgIGFsbG9jX2xpc3QtPnNpemU9c2l6ZTsKKyAgICBhbGxvY19saXN0LT5hbGxvY19maWxlPWZpbGU7CisgICAgYWxsb2NfbGlzdC0+YWxsb2NfbGluZT1saW5lOworICAgIGFsbG9jX2xpc3QtPmZyZWVfZmlsZT0ibm9uZSI7CisgICAgYWxsb2NfbGlzdC0+ZnJlZV9saW5lPTA7CisgICAgYWxsb2NfbGlzdC0+dmFsaWRfY2FuYXJ5PWNhbmFyeV9pbml0aWFsaXplZDsgLyogYmVmb3JlIG1lbWNweSAqLworICAgIG1lbWNweSgodWludDhfdCAqKXB0citzaXplLCBjYW5hcnksIHNpemVvZiBjYW5hcnkpOworICAgIHN0cl9sZWFrX2RlYnVnKGFsbG9jX2xpc3QsIDEpOworICAgIHJldHVybiBwdHI7Cit9CisKKy8qIGRldGFjaCBmcm9tIHRocmVhZCBhdXRvbWF0aWMgZGVhbGxvY2F0aW9uIGxpc3QgKi8KKy8qIGl0IGhhcyBubyBlZmZlY3QgaWYgdGhlIGFsbG9jYXRpb24gaXMgYWxyZWFkeSBkZXRhY2hlZCAqLwordm9pZCBzdHJfZGV0YWNoX2RlYnVnKHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKKyAgICBBTExPQ19MSVNUICphbGxvY19saXN0OworCisgICAgaWYoIXB0cikgLyogZG8gbm90IGF0dGVtcHQgdG8gZnJlZSBudWxsIHBvaW50ZXJzICovCisgICAgICAgIHJldHVybjsKKyAgICBhbGxvY19saXN0PWdldF9hbGxvY19saXN0X3B0cihwdHIsIGZpbGUsIGxpbmUpOworICAgIGlmKGFsbG9jX2xpc3QtPnRscykgeyAvKiBub3QgZGV0YWNoZWQgKi8KKyAgICAgICAgLyogcmVtb3ZlIGZyb20gbGlua2VkIGxpc3QgKi8KKyAgICAgICAgaWYoYWxsb2NfbGlzdC0+dGxzLT5hbGxvY19oZWFkPT1hbGxvY19saXN0KQorICAgICAgICAgICAgYWxsb2NfbGlzdC0+dGxzLT5hbGxvY19oZWFkPWFsbG9jX2xpc3QtPm5leHQ7CisgICAgICAgIGlmKGFsbG9jX2xpc3QtPm5leHQpCisgICAgICAgICAgICBhbGxvY19saXN0LT5uZXh0LT5wcmV2PWFsbG9jX2xpc3QtPnByZXY7CisgICAgICAgIGlmKGFsbG9jX2xpc3QtPnByZXYpCisgICAgICAgICAgICBhbGxvY19saXN0LT5wcmV2LT5uZXh0PWFsbG9jX2xpc3QtPm5leHQ7CisgICAgICAgIC8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisgICAgICAgIGFsbG9jX2xpc3QtPnRscy0+YWxsb2NfYnl0ZXMtPWFsbG9jX2xpc3QtPnNpemU7CisgICAgICAgIGFsbG9jX2xpc3QtPnRscy0+YWxsb2NfYmxvY2tzLS07CisgICAgICAgIC8qIGNsZWFyIHBvaW50ZXJzICovCisgICAgICAgIGFsbG9jX2xpc3QtPm5leHQ9TlVMTDsKKyAgICAgICAgYWxsb2NfbGlzdC0+cHJldj1OVUxMOworICAgICAgICBhbGxvY19saXN0LT50bHM9TlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgc3RyX2ZyZWVfZGVidWcodm9pZCAqcHRyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICAgIEFMTE9DX0xJU1QgKmFsbG9jX2xpc3Q7CisKKyAgICBpZighcHRyKSAvKiBkbyBub3QgYXR0ZW1wdCB0byBmcmVlIG51bGwgcG9pbnRlcnMgKi8KKyAgICAgICAgcmV0dXJuOworICAgIGFsbG9jX2xpc3Q9KEFMTE9DX0xJU1QgKilwdHItMTsKKyAgICBpZihhbGxvY19saXN0LT5tYWdpYz09MHhkZWZlYzhlZCkgeworICAgICAgICAvKiB0aGlzIG1heSAodW5saWtlbHkpIGxvZyBnYXJiYWdlIGluc3RlYWQgb2YgZmlsZSBuYW1lcyAqLworICAgICAgICBzX2xvZyhMT0dfQ1JJVCwKKyAgICAgICAgICAgICJEb3VibGUgZnJlZSBhdHRlbXB0OiBwdHI9JXAgYWxsb2M9JXM6JWQgZnJlZSMxPSVzOiVkIGZyZWUjMj0lczolZCIsCisgICAgICAgICAgICBwdHIsCisgICAgICAgICAgICBhbGxvY19saXN0LT5hbGxvY19maWxlLCBhbGxvY19saXN0LT5hbGxvY19saW5lLAorICAgICAgICAgICAgYWxsb2NfbGlzdC0+ZnJlZV9maWxlLCBhbGxvY19saXN0LT5mcmVlX2xpbmUsCisgICAgICAgICAgICBmaWxlLCBsaW5lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJfZGV0YWNoX2RlYnVnKHB0ciwgZmlsZSwgbGluZSk7CisgICAgc3RyX2xlYWtfZGVidWcoYWxsb2NfbGlzdCwgLTEpOworICAgIGFsbG9jX2xpc3QtPmZyZWVfZmlsZT1maWxlOworICAgIGFsbG9jX2xpc3QtPmZyZWVfbGluZT1saW5lOworICAgIGFsbG9jX2xpc3QtPm1hZ2ljPTB4ZGVmZWM4ZWQ7IC8qIHRvIGRldGVjdCBkb3VibGUgZnJlZSBhdHRlbXB0cyAqLworICAgIG1lbXNldChwdHIsIDAsIGFsbG9jX2xpc3QtPnNpemUpOyAvKiBwYXJhbm9pYSAqLworICAgIGZyZWUoYWxsb2NfbGlzdCk7Cit9CisKK05PRVhQT1JUIEFMTE9DX0xJU1QgKmdldF9hbGxvY19saXN0X3B0cih2b2lkICpwdHIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgICAgQUxMT0NfTElTVCAqYWxsb2NfbGlzdDsKKworICAgIGlmKCF0bHNfaW5pdGlhbGl6ZWQpCisgICAgICAgIGZhdGFsX2RlYnVnKCJzdHIgbm90IGluaXRpYWxpemVkIiwgZmlsZSwgbGluZSk7CisgICAgYWxsb2NfbGlzdD0oQUxMT0NfTElTVCAqKXB0ci0xOworICAgIGlmKGFsbG9jX2xpc3QtPm1hZ2ljIT0weGExMTBjOGVkKSAvKiBub3QgYWxsb2NhdGVkIGJ5IHN0cl9hbGxvYygpICovCisgICAgICAgIGZhdGFsX2RlYnVnKCJCYWQgbWFnaWMiLCBmaWxlLCBsaW5lKTsgLyogTE9MICovCisgICAgaWYoYWxsb2NfbGlzdC0+dGxzIC8qIG5vdCBkZXRhY2hlZCAqLyAmJiBhbGxvY19saXN0LT50bHMhPXRsc19nZXQoKSkKKyAgICAgICAgZmF0YWxfZGVidWcoIk1lbW9yeSBhbGxvY2F0ZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIiwgZmlsZSwgbGluZSk7CisgICAgaWYoYWxsb2NfbGlzdC0+dmFsaWRfY2FuYXJ5IT0weGFiYWRiYWJlICYmCisgICAgICAgICAgICBzYWZlX21lbWNtcCgodWludDhfdCAqKXB0cithbGxvY19saXN0LT5zaXplLCBjYW5hcnksIHNpemVvZiBjYW5hcnkpKQorICAgICAgICBmYXRhbF9kZWJ1ZygiRGVhZCBjYW5hcnkiLCBmaWxlLCBsaW5lKTsgLyogTE9MICovCisgICAgcmV0dXJuIGFsbG9jX2xpc3Q7Cit9CisKKy8qICNkZWZpbmUgU1RSX0xFQUtfREVCVUcgKi8KKy8qIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzbG93LCBidXQgaXQncyBub3QgZ29pbmcgdG8gYmUgdXNlZCBpbiBwcm9kdWN0aW9uICovCitOT0VYUE9SVCB2b2lkIHN0cl9sZWFrX2RlYnVnKEFMTE9DX0xJU1QgKmFsbG9jX2xpc3QsIGludCBjaGFuZ2UpIHsKKyNpZm5kZWYgU1RSX0xFQUtfREVCVUcKKyAgICAodm9pZClhbGxvY19saXN0OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKWNoYW5nZTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyNlbHNlCisjZGVmaW5lIEFMTE9DX1RBQkxFX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfQUxMT0NTIDIwMAorICAgIHN0YXRpYyBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICphbGxvY19maWxlOworICAgICAgICBpbnQgYWxsb2NfbGluZTsKKyAgICAgICAgaW50IG51bTsKKyAgICB9IGFsbG9jX3RhYmxlW0FMTE9DX1RBQkxFX1NJWkVdOworICAgIHN0YXRpYyBzaXplX3QgYWxsb2NfbnVtPTA7CisgICAgc2l6ZV90IGk7CisKKyAgICBlbnRlcl9jcml0aWNhbF9zZWN0aW9uKENSSVRfTEVBSyk7CisgICAgZm9yKGk9MDsgaTxhbGxvY19udW07ICsraSkKKyAgICAgICAgaWYoYWxsb2NfdGFibGVbaV0uYWxsb2NfZmlsZT09YWxsb2NfbGlzdC0+YWxsb2NfZmlsZSAmJgorICAgICAgICAgICAgICAgIGFsbG9jX3RhYmxlW2ldLmFsbG9jX2xpbmU9PWFsbG9jX2xpc3QtPmFsbG9jX2xpbmUpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZihpPT1hbGxvY19udW0pIHsKKyAgICAgICAgaWYoYWxsb2NfbnVtPT1BTExPQ19UQUJMRV9TSVpFKSB7CisgICAgICAgICAgICBsZWF2ZV9jcml0aWNhbF9zZWN0aW9uKENSSVRfTEVBSyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NfdGFibGVbaV0uYWxsb2NfZmlsZT1hbGxvY19saXN0LT5hbGxvY19maWxlOworICAgICAgICBhbGxvY190YWJsZVtpXS5hbGxvY19saW5lPWFsbG9jX2xpc3QtPmFsbG9jX2xpbmU7CisgICAgICAgIGFsbG9jX3RhYmxlW2ldLm51bT0wOworICAgICAgICArK2FsbG9jX251bTsKKyAgICB9CisgICAgYWxsb2NfdGFibGVbaV0ubnVtKz1jaGFuZ2U7CisgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0xFQUspOworICAgIGlmKGFsbG9jX3RhYmxlW2ldLm51bT5NQVhfQUxMT0NTICYmCisgICAgICAgICAgICBzdHJjbXAoYWxsb2NfdGFibGVbaV0uYWxsb2NfZmlsZSwgImxoYXNoLmMiKSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCBhbGxvY2F0aW9ucyBkZXRlY3RlZCBhdCAlczolZFxuIiwKKyAgICAgICAgICAgIGFsbG9jX3RhYmxlW2ldLm51bSwKKyAgICAgICAgICAgIGFsbG9jX3RhYmxlW2ldLmFsbG9jX2ZpbGUsIGFsbG9jX3RhYmxlW2ldLmFsbG9jX2xpbmUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG1lbWNtcCgpIHJlcGxhY2VtZW50ICovCisKKy8qIGEgdmVyc2lvbiBvZiBtZW1jbXAoKSB3aXRoIGV4ZWN1dGlvbiB0aW1lIG5vdCBkZXBlbmRlbnQgb24gZGF0YSB2YWx1ZXMgKi8KKy8qIGl0IGRvZXMgKm5vdCogYWxsb3cgdG8gdGVzdCB3aGV0ZXIgczEgaXMgZ3JlYXRlciBvciBsZXNzZXIgdGhhbiBzMiAgKi8KK2ludCBzYWZlX21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKSB7CisgICAgdWludDhfdCAqcDE9KHVpbnQ4X3QgKilzMSwgKnAyPSh1aW50OF90ICopczI7CisgICAgaW50IHI9MDsKKyAgICB3aGlsZShuLS0pCisgICAgICAgIHJ8PSpwMSsrXipwMisrOworICAgIHJldHVybiByOworfQorCisvKiBlbmQgb2Ygc3RyLmMgKi8KZGlmZiAtLWdpdCBhL3NyYy9zdHVubmVsLmMgYi9zcmMvc3R1bm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDNmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3R1bm5lbC5jCkBAIC0wLDAgKzEsODU5IEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisKKy8qIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvc3VwcG9ydC9mYXEuaHRtbCNQUk9HMiAqLworI2lmZGVmIFVTRV9XSU4zMgorI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLXBlZGFudGljIgorI2VuZGlmIC8qIF9fR05VQ19fICovCisjaWZkZWYgX19HTlVDX18KKyNpbmNsdWRlIDwuLi9tcy9hcHBsaW5rLmM+CisjZWxzZSAvKiBfX0dOVUNfXyAqLworI2luY2x1ZGUgPG9wZW5zc2wvYXBwbGluay5jPgorI2VuZGlmIC8qIF9fR05VQ19fICovCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyAqLworCisjaWZkZWYgX19JTk5PVEVLX0xJQkNfXworc3RydWN0IHNvY2thZGRyX3VuIHsKKyAgICB1X2NoYXIgIHN1bl9sZW47ICAgICAgICAgICAgIC8qIHNvY2thZGRyIGxlbiBpbmNsdWRpbmcgbnVsbCAqLworICAgIHVfY2hhciAgc3VuX2ZhbWlseTsgICAgICAgICAgLyogQUZfT1MyIG9yIEFGX1VOSVggKi8KKyAgICBjaGFyICAgIHN1bl9wYXRoWzEwOF07ICAgICAgIC8qIHBhdGggbmFtZSAqLworfTsKKyNlbmRpZgorCitOT0VYUE9SVCBpbnQgYWNjZXB0X2Nvbm5lY3Rpb24oU0VSVklDRV9PUFRJT05TICopOworI2lmZGVmIEhBVkVfQ0hST09UCitOT0VYUE9SVCBpbnQgY2hhbmdlX3Jvb3Qodm9pZCk7CisjZW5kaWYKK05PRVhQT1JUIGludCBzaWduYWxfcGlwZV9pbml0KHZvaWQpOworTk9FWFBPUlQgaW50IHNpZ25hbF9waXBlX2Rpc3BhdGNoKHZvaWQpOworI2lmZGVmIFVTRV9GT1JLCitOT0VYUE9SVCB2b2lkIGNsaWVudF9zdGF0dXModm9pZCk7IC8qIGRlYWQgY2hpbGRyZW4gZGV0ZWN0ZWQgKi8KKyNlbmRpZgorTk9FWFBPUlQgY2hhciAqc2lnbmFsX25hbWUoaW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqLworCitzdGF0aWMgU09DS0VUIHNpZ25hbF9waXBlWzJdPXtJTlZBTElEX1NPQ0tFVCwgSU5WQUxJRF9TT0NLRVR9OworCisjaWZuZGVmIFVTRV9GT1JLCitsb25nIG1heF9jbGllbnRzPTA7CisvKiAtMSBiZWZvcmUgYSB2YWxpZCBjb25maWcgaXMgbG9hZGVkLCB0aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiBjbGllbnRzICovCit2b2xhdGlsZSBsb25nIG51bV9jbGllbnRzPS0xOworI2VuZGlmCitzX3BvbGxfc2V0ICpmZHM7IC8qIGZpbGUgZGVzY3JpcHRvcnMgb2YgbGlzdGVuaW5nIHNvY2tldHMgKi8KK2ludCBzeXN0ZW1kX2ZkczsgLyogbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGJ5IHN5c3RlbWQgKi8KK2ludCBsaXN0ZW5fZmRzX3N0YXJ0OyAvKiBiYXNlIGZvciBzeXN0ZW1kLXByb3ZpZGVkIGZpbGUgZGVzY3JpcHRvcnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc3RhcnR1cCAqLworCit2b2lkIG1haW5faW5pdCgpIHsgLyogb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KKyNpZmRlZiBVU0VfU1lTVEVNRAorICAgIGludCBpOworCisgICAgc3lzdGVtZF9mZHM9c2RfbGlzdGVuX2ZkcygxKTsKKyAgICBpZihzeXN0ZW1kX2ZkczwwKQorICAgICAgICBmYXRhbCgic3lzdGVtZCBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICBsaXN0ZW5fZmRzX3N0YXJ0PVNEX0xJU1RFTl9GRFNfU1RBUlQ7CisgICAgLyogc2V0IG5vbi1ibG9ja2luZyBtb2RlIG9uIHN5c3RlbWQgZmlsZSBkZXNjcmlwdG9ycyAqLworICAgIGZvcihpPTA7IGk8c3lzdGVtZF9mZHM7ICsraSkKKyAgICAgICAgc2V0X25vbmJsb2NrKGxpc3Rlbl9mZHNfc3RhcnQraSwgMSk7CisjZWxzZQorICAgIHN5c3RlbWRfZmRzPTA7IC8qIG5vIGRlc2NyaXB0b3JzIHJlY2VpdmVkICovCisgICAgbGlzdGVuX2Zkc19zdGFydD0zOyAvKiB0aGUgdmFsdWUgaXMgbm90IHJlYWxseSBpbXBvcnRhbnQgKi8KKyNlbmRpZgorICAgIC8qIGJhc2ljIGluaXRpYWxpemF0aW9uIGNvbnRhaW5zIGVzc2VudGlhbCBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIGxvZ2dpbmcKKyAgICAgKiBzdWJzeXN0ZW0gdG8gZnVuY3Rpb24gcHJvcGVybHksIHRodXMgYWxsIGVycm9ycyBoZXJlIGFyZSBmYXRhbCAqLworICAgIGlmKHNzbF9pbml0KCkpIC8qIGluaXRpYWxpemUgU1NMIGxpYnJhcnkgKi8KKyAgICAgICAgZmF0YWwoIlNTTCBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICBpZihzdGhyZWFkc19pbml0KCkpIC8qIGluaXRpYWxpemUgY3JpdGljYWwgc2VjdGlvbnMgJiBTU0wgY2FsbGJhY2tzICovCisgICAgICAgIGZhdGFsKCJUaHJlYWRzIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworICAgIGlmKGNyb25faW5pdCgpKSAvKiBpbml0aWFsaXplIHBlcmlvZGljIGV2ZW50cyAqLworICAgICAgICBmYXRhbCgiQ3JvbiBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICBvcHRpb25zX2RlZmF1bHRzKCk7CisgICAgb3B0aW9uc19hcHBseSgpOworI2lmbmRlZiBVU0VfRk9SSworICAgIGdldF9saW1pdHMoKTsgLyogcmVxdWlyZWQgYnkgc2V0dXBfZmQoKSAqLworI2VuZGlmCisgICAgZmRzPXNfcG9sbF9hbGxvYygpOworICAgIGlmKHNpZ25hbF9waXBlX2luaXQoKSkKKyAgICAgICAgZmF0YWwoIlNpZ25hbCBwaXBlIGluaXRpYWxpemF0aW9uIGZhaWxlZDogIgorICAgICAgICAgICAgImNoZWNrIHlvdXIgcGVyc29uYWwgZmlyZXdhbGwiKTsKKyAgICBzdHVubmVsX2luZm8oTE9HX05PVElDRSk7Cit9CisKKyAgICAvKiBjb25maWd1cmF0aW9uLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAqLworaW50IG1haW5fY29uZmlndXJlKGNoYXIgKmFyZzEsIGNoYXIgKmFyZzIpIHsKKyAgICBpZihvcHRpb25zX2NtZGxpbmUoYXJnMSwgYXJnMikpCisgICAgICAgIHJldHVybiAxOworICAgIG9wdGlvbnNfYXBwbHkoKTsKKyAgICBzdHJfY2FuYXJ5X2luaXQoKTsgLyogbmVlZHMgcHJuZyBpbml0aWFsaXphdGlvbiBmcm9tIG9wdGlvbnNfY21kbGluZSAqLworI2lmICFkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX192bXMpCisgICAgLyogc3lzbG9nX29wZW4oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdlX3Jvb3QoKQorICAgICAqIHRvIGJlIGFibGUgdG8gYWNjZXNzIC9kZXYvbG9nIHNvY2tldCAqLworICAgIHN5c2xvZ19vcGVuKCk7CisjZW5kaWYgLyogIWRlZmluZWQoVVNFX1dJTjMyKSAmJiAhZGVmaW5lZChfX3ZtcykgKi8KKyAgICBpZihiaW5kX3BvcnRzKCkpCisgICAgICAgIHJldHVybiAxOworCisjaWZkZWYgSEFWRV9DSFJPT1QKKyAgICAvKiBjaGFuZ2Vfcm9vdCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkcm9wX3ByaXZpbGVnZXMoKQorICAgICAqIHNpbmNlIGNocm9vdCgpIG5lZWRzIHJvb3QgcHJpdmlsZWdlcyAqLworICAgIGlmKGNoYW5nZV9yb290KCkpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmIC8qIEhBVkVfQ0hST09UICovCisKKyAgICBpZihkcm9wX3ByaXZpbGVnZXMoMSkpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogbG9nX29wZW4oKSBtdXN0IGJlIGJlIGNhbGxlZCBhZnRlciBkcm9wX3ByaXZpbGVnZXMoKQorICAgICAqIG9yIGxvZ2ZpbGUgcm90YXRpb24gd29uJ3QgYmUgcG9zc2libGUgKi8KKyAgICAvKiBsb2dfb3BlbigpIG11c3QgYmUgYmUgY2FsbGVkIGJlZm9yZSBkYWVtb25pemUoKQorICAgICAqIHNpbmNlIGRhZW1vbml6ZSgpIGludmFsaWRhdGVzIHN0ZGVyciAqLworICAgIGlmKGxvZ19vcGVuKCkpCisgICAgICAgIHJldHVybiAxOworI2lmbmRlZiBVU0VfRk9SSworICAgIG51bV9jbGllbnRzPTA7IC8qIHRoZSBmaXJzdCB2YWxpZCBjb25maWcgKi8KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitpbnQgZHJvcF9wcml2aWxlZ2VzKGludCBjcml0aWNhbCkgeworI2lmIGRlZmluZWQoVVNFX1dJTjMyKSB8fCBkZWZpbmVkKF9fdm1zKSB8fCBkZWZpbmVkKFVTRV9PUzIpCisgICAgKHZvaWQpY3JpdGljYWw7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisjZWxzZQorI2lmZGVmIEhBVkVfU0VUR1JPVVBTCisgICAgZ2lkX3QgZ3JfbGlzdFsxXTsKKyNlbmRpZgorCisgICAgLyogc2V0IHVpZCBhbmQgZ2lkICovCisgICAgaWYoZ2xvYmFsX29wdGlvbnMuZ2lkKSB7CisgICAgICAgIGlmKHNldGdpZChnbG9iYWxfb3B0aW9ucy5naWQpICYmIGNyaXRpY2FsKSB7CisgICAgICAgICAgICBzb2NrZXJyb3IoInNldGdpZCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyNpZmRlZiBIQVZFX1NFVEdST1VQUworICAgICAgICBncl9saXN0WzBdPWdsb2JhbF9vcHRpb25zLmdpZDsKKyAgICAgICAgaWYoc2V0Z3JvdXBzKDEsIGdyX2xpc3QpICYmIGNyaXRpY2FsKSB7CisgICAgICAgICAgICBzb2NrZXJyb3IoInNldGdyb3VwcyIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBpZihnbG9iYWxfb3B0aW9ucy51aWQpIHsKKyAgICAgICAgaWYoc2V0dWlkKGdsb2JhbF9vcHRpb25zLnVpZCkgJiYgY3JpdGljYWwpIHsKKyAgICAgICAgICAgIHNvY2tlcnJvcigic2V0dWlkIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBzdGFuZGFyZCBVbml4ICovCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWFpbl9jbGVhbnVwKCkgeworICAgIHVuYmluZF9wb3J0cygpOworICAgIHNfcG9sbF9mcmVlKGZkcyk7CisgICAgZmRzPU5VTEw7CisjaWYgMAorICAgIHN0cl9zdGF0cygpOyAvKiBtYWluIHRocmVhZCBhbGxvY2F0aW9uIHRyYWNraW5nICovCisjZW5kaWYKKyAgICBsb2dfZmx1c2goTE9HX01PREVfRVJST1IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVbml4LXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisKKyNpZm5kZWYgVVNFX1dJTjMyCisKKyNpZmRlZiBVU0VfRk9SSworTk9FWFBPUlQgdm9pZCBjbGllbnRfc3RhdHVzKHZvaWQpIHsgLyogZGVhZCBjaGlsZHJlbiBkZXRlY3RlZCAqLworICAgIGludCBwaWQsIHN0YXR1czsKKyAgICBjaGFyICpzaWdfbmFtZTsKKworI2lmZGVmIEhBVkVfV0FJVF9GT1JfUElECisgICAgd2hpbGUoKHBpZD13YWl0X2Zvcl9waWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpKT4wKSB7CisjZWxzZQorICAgIGlmKChwaWQ9d2FpdCgmc3RhdHVzKSk+MCkgeworI2VuZGlmCisjaWZkZWYgV0lGU0lHTkFMRUQKKyAgICAgICAgaWYoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworICAgICAgICAgICAgc2lnX25hbWU9c2lnbmFsX25hbWUoV1RFUk1TSUcoc3RhdHVzKSk7CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJQcm9jZXNzICVkIHRlcm1pbmF0ZWQgb24gJXMiLAorICAgICAgICAgICAgICAgIHBpZCwgc2lnX25hbWUpOworICAgICAgICAgICAgc3RyX2ZyZWUoc2lnX25hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiUHJvY2VzcyAlZCBmaW5pc2hlZCB3aXRoIGNvZGUgJWQiLAorICAgICAgICAgICAgICAgIHBpZCwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJQcm9jZXNzICVkIGZpbmlzaGVkIHdpdGggY29kZSAlZCIsCisgICAgICAgICAgICBwaWQsIHN0YXR1cyk7CisgICAgfQorI2VuZGlmCit9CisjZW5kaWYgLyogZGVmaW5lZCBVU0VfRk9SSyAqLworCisjaWZuZGVmIFVTRV9PUzIKKwordm9pZCBjaGlsZF9zdGF0dXModm9pZCkgeyAvKiBkZWFkIGxpYndyYXAgb3IgJ2V4ZWMnIHByb2Nlc3MgZGV0ZWN0ZWQgKi8KKyAgICBpbnQgcGlkLCBzdGF0dXM7CisgICAgY2hhciAqc2lnX25hbWU7CisKKyNpZmRlZiBIQVZFX1dBSVRfRk9SX1BJRAorICAgIHdoaWxlKChwaWQ9d2FpdF9mb3JfcGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKSk+MCkgeworI2Vsc2UKKyAgICBpZigocGlkPXdhaXQoJnN0YXR1cykpPjApIHsKKyNlbmRpZgorI2lmZGVmIFdJRlNJR05BTEVECisgICAgICAgIGlmKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKyAgICAgICAgICAgIHNpZ19uYW1lPXNpZ25hbF9uYW1lKFdURVJNU0lHKHN0YXR1cykpOworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJDaGlsZCBwcm9jZXNzICVkIHRlcm1pbmF0ZWQgb24gJXMiLAorICAgICAgICAgICAgICAgIHBpZCwgc2lnX25hbWUpOworICAgICAgICAgICAgc3RyX2ZyZWUoc2lnX25hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJDaGlsZCBwcm9jZXNzICVkIGZpbmlzaGVkIHdpdGggY29kZSAlZCIsCisgICAgICAgICAgICAgICAgcGlkLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgc19sb2coTE9HX0lORk8sICJDaGlsZCBwcm9jZXNzICVkIGZpbmlzaGVkIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgIHBpZCwgc3RhdHVzKTsKKyNlbmRpZgorICAgIH0KK30KKworI2VuZGlmIC8qICFkZWZpbmVkKFVTRV9PUzIpICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChVU0VfV0lOMzIpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG1haW4gbG9vcCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgKi8KKwordm9pZCBkYWVtb25fbG9vcCh2b2lkKSB7CisgICAgd2hpbGUoMSkgeworICAgICAgICBpbnQgdGVtcG9yYXJ5X2xhY2tfb2ZfcmVzb3VyY2VzPTA7CisgICAgICAgIGludCBudW09c19wb2xsX3dhaXQoZmRzLCAtMSwgLTEpOworICAgICAgICBpZihudW0+PTApIHsKKyAgICAgICAgICAgIFNFUlZJQ0VfT1BUSU9OUyAqb3B0OworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiRm91bmQgJWQgcmVhZHkgZmlsZSBkZXNjcmlwdG9yKHMpIiwgbnVtKTsKKyAgICAgICAgICAgIGlmKHNlcnZpY2Vfb3B0aW9ucy5sb2dfbGV2ZWw+PUxPR19ERUJVRykgLyogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uICovCisgICAgICAgICAgICAgICAgc19wb2xsX2R1bXAoZmRzLCBMT0dfREVCVUcpOworICAgICAgICAgICAgaWYoc19wb2xsX2NhbnJlYWQoZmRzLCBzaWduYWxfcGlwZVswXSkpCisgICAgICAgICAgICAgICAgaWYoc2lnbmFsX3BpcGVfZGlzcGF0Y2goKSkgLyogU0lHTkFMX1RFUk1JTkFURSBvciBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogdGVybWluYXRlIGRhZW1vbl9sb29wICovCisgICAgICAgICAgICBmb3Iob3B0PXNlcnZpY2Vfb3B0aW9ucy5uZXh0OyBvcHQ7IG9wdD1vcHQtPm5leHQpCisgICAgICAgICAgICAgICAgaWYob3B0LT5vcHRpb24uYWNjZXB0ICYmIHNfcG9sbF9jYW5yZWFkKGZkcywgb3B0LT5mZCkpCisgICAgICAgICAgICAgICAgICAgIGlmKGFjY2VwdF9jb25uZWN0aW9uKG9wdCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlfbGFja19vZl9yZXNvdXJjZXM9MTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ19lcnJvcihMT0dfTk9USUNFLCBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSwKKyAgICAgICAgICAgICAgICAiZGFlbW9uX2xvb3A6IHNfcG9sbF93YWl0Iik7CisgICAgICAgICAgICB0ZW1wb3JhcnlfbGFja19vZl9yZXNvdXJjZXM9MTsKKyAgICAgICAgfQorICAgICAgICBpZih0ZW1wb3JhcnlfbGFja19vZl9yZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsCisgICAgICAgICAgICAgICAgIkFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMgc3VzcGVuZGVkIGZvciAxIHNlY29uZCIpOworICAgICAgICAgICAgc2xlZXAoMSk7IC8qIHRvIGF2b2lkIGxvZyB0cmFzaGluZyAqLworICAgICAgICB9CisgICAgfQorfQorCisgICAgLyogcmV0dXJuIDEgd2hlbiBhIHNob3J0IGRlbGF5IGlzIG5lZWRlZCBiZWZvcmUgYW5vdGhlciB0cnkgKi8KK05PRVhQT1JUIGludCBhY2NlcHRfY29ubmVjdGlvbihTRVJWSUNFX09QVElPTlMgKm9wdCkgeworICAgIFNPQ0tBRERSX1VOSU9OIGFkZHI7CisgICAgY2hhciAqZnJvbV9hZGRyZXNzOworICAgIFNPQ0tFVCBzOworICAgIHNvY2tsZW5fdCBhZGRybGVuOworCisgICAgYWRkcmxlbj1zaXplb2YgYWRkcjsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcz1zX2FjY2VwdChvcHQtPmZkLCAmYWRkci5zYSwgJmFkZHJsZW4sIDEsICJsb2NhbCBzb2NrZXQiKTsKKyAgICAgICAgaWYocyE9SU5WQUxJRF9TT0NLRVQpIC8qIHN1Y2Nlc3MhICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoKGdldF9sYXN0X3NvY2tldF9lcnJvcigpKSB7CisgICAgICAgICAgICBjYXNlIFNfRUlOVFI6IC8qIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsICovCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIHJldHJ5IG5vdyAqLworICAgICAgICAgICAgY2FzZSBTX0VNRklMRToKKyNpZmRlZiBTX0VORklMRQorICAgICAgICAgICAgY2FzZSBTX0VORklMRToKKyNlbmRpZgorI2lmZGVmIFNfRU5PQlVGUworICAgICAgICAgICAgY2FzZSBTX0VOT0JVRlM6CisjZW5kaWYKKyNpZmRlZiBTX0VOT01FTQorICAgICAgICAgICAgY2FzZSBTX0VOT01FTToKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiB0ZW1wb3JhcnkgbGFjayBvZiByZXNvdXJjZXMgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGFueSBvdGhlciBlcnJvciAqLworICAgICAgICB9CisgICAgfQorICAgIGZyb21fYWRkcmVzcz1zX250b3AoJmFkZHIsIGFkZHJsZW4pOworICAgIHNfbG9nKExPR19ERUJVRywgIlNlcnZpY2UgWyVzXSBhY2NlcHRlZCAoRkQ9JWQpIGZyb20gJXMiLAorICAgICAgICBvcHQtPnNlcnZuYW1lLCBzLCBmcm9tX2FkZHJlc3MpOworICAgIHN0cl9mcmVlKGZyb21fYWRkcmVzcyk7CisjaWZkZWYgVVNFX0ZPUksKKyAgICBSQU5EX2FkZCgiIiwgMSwgMC4wKTsgLyogZWFjaCBjaGlsZCBuZWVkcyBhIHVuaXF1ZSBlbnRyb3B5IHBvb2wgKi8KKyNlbHNlCisgICAgaWYobWF4X2NsaWVudHMgJiYgbnVtX2NsaWVudHM+PW1heF9jbGllbnRzKSB7CisgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiQ29ubmVjdGlvbiByZWplY3RlZDogdG9vIG1hbnkgY2xpZW50cyAoPj0lbGQpIiwKKyAgICAgICAgICAgIG1heF9jbGllbnRzKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQocyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorICAgIGlmKGNyZWF0ZV9jbGllbnQob3B0LT5mZCwgcywKKyAgICAgICAgICAgIGFsbG9jX2NsaWVudF9zZXNzaW9uKG9wdCwgcywgcyksIGNsaWVudF90aHJlYWQpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJDb25uZWN0aW9uIHJlamVjdGVkOiBjcmVhdGVfY2xpZW50IGZhaWxlZCIpOworICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiBoZWxwZXJzICovCisKKy8qIGNsZWFyIGZkcywgY2xvc2Ugb2xkIHBvcnRzICovCit2b2lkIHVuYmluZF9wb3J0cyh2b2lkKSB7CisgICAgU0VSVklDRV9PUFRJT05TICpvcHQ7CisjaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfVU4KKyAgICBzdHJ1Y3Qgc3RhdCBzYjsgLyogYnVmZmVyIGZvciBzdGF0ICovCisjZW5kaWYKKworICAgIHNfcG9sbF9pbml0KGZkcyk7CisgICAgc19wb2xsX2FkZChmZHMsIHNpZ25hbF9waXBlWzBdLCAxLCAwKTsKKworICAgIGZvcihvcHQ9c2VydmljZV9vcHRpb25zLm5leHQ7IG9wdDsgb3B0PW9wdC0+bmV4dCkgeworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJDbG9zaW5nIHNlcnZpY2UgWyVzXSIsIG9wdC0+c2Vydm5hbWUpOworICAgICAgICBpZihvcHQtPm9wdGlvbi5hY2NlcHQgJiYgb3B0LT5mZCE9SU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgICAgICAgIGlmKG9wdC0+ZmQ8KFNPQ0tFVClsaXN0ZW5fZmRzX3N0YXJ0IHx8CisgICAgICAgICAgICAgICAgICAgIG9wdC0+ZmQ+PShTT0NLRVQpKGxpc3Rlbl9mZHNfc3RhcnQrc3lzdGVtZF9mZHMpKQorICAgICAgICAgICAgICAgIGNsb3Nlc29ja2V0KG9wdC0+ZmQpOworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU2VydmljZSBbJXNdIGNsb3NlZCAoRkQ9JWQpIiwKKyAgICAgICAgICAgICAgICBvcHQtPnNlcnZuYW1lLCBvcHQtPmZkKTsKKyAgICAgICAgICAgIG9wdC0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisjaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfVU4KKyAgICAgICAgICAgIGlmKG9wdC0+bG9jYWxfYWRkci5zYS5zYV9mYW1pbHk9PUFGX1VOSVgpIHsKKyAgICAgICAgICAgICAgICBpZihsc3RhdChvcHQtPmxvY2FsX2FkZHIudW4uc3VuX3BhdGgsICZzYikpCisgICAgICAgICAgICAgICAgICAgIHNvY2tlcnJvcihvcHQtPmxvY2FsX2FkZHIudW4uc3VuX3BhdGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIVNfSVNTT0NLKHNiLnN0X21vZGUpKQorICAgICAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiTm90IGEgc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHQtPmxvY2FsX2FkZHIudW4uc3VuX3BhdGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYodW5saW5rKG9wdC0+bG9jYWxfYWRkci51bi5zdW5fcGF0aCkpCisgICAgICAgICAgICAgICAgICAgIHNvY2tlcnJvcihvcHQtPmxvY2FsX2FkZHIudW4uc3VuX3BhdGgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiU29ja2V0IHJlbW92ZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+bG9jYWxfYWRkci51bi5zdW5fcGF0aCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmKG9wdC0+ZXhlY19uYW1lICYmIG9wdC0+Y29ubmVjdF9hZGRyLm5hbWVzKSB7CisgICAgICAgICAgICAvKiBjcmVhdGUgZXhlYytjb25uZWN0IHNlcnZpY2VzICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBqdXN0IGEgY3J1ZGUgd29ya2Fyb3VuZCAgICovCisgICAgICAgICAgICAvKiAgICAgICAgaXMgaXQgYmV0dGVyIHRvIGtpbGwgdGhlIHNlcnZpY2U/ICovCisgICAgICAgICAgICBvcHQtPm9wdGlvbi5yZXRyeT0wOworICAgICAgICB9CisgICAgICAgIC8qIHB1cmdlIHNlc3Npb24gY2FjaGUgb2YgdGhlIG9sZCBTU0xfQ1RYIG9iamVjdCAqLworICAgICAgICAvKiB0aGlzIHdvcmthcm91bmQgd29uJ3QgYmUgbmVlZGVkIGFueW1vcmUgYWZ0ZXIgKi8KKyAgICAgICAgLyogZGVsYXllZCBkZWFsbG9jYXRpb24gY2FsbHMgU1NMX0NUWF9mcmVlKCkgICAgICovCisgICAgICAgIGlmKG9wdC0+Y3R4KQorICAgICAgICAgICAgU1NMX0NUWF9mbHVzaF9zZXNzaW9ucyhvcHQtPmN0eCwKKyAgICAgICAgICAgICAgICAobG9uZyl0aW1lKE5VTEwpK29wdC0+c2Vzc2lvbl90aW1lb3V0KzEpOworICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTZXJ2aWNlIFslc10gY2xvc2VkIiwgb3B0LT5zZXJ2bmFtZSk7CisgICAgfQorfQorCisvKiBvcGVuIG5ldyBwb3J0cywgdXBkYXRlIGZkcyAqLworaW50IGJpbmRfcG9ydHModm9pZCkgeworICAgIFNFUlZJQ0VfT1BUSU9OUyAqb3B0OworICAgIGNoYXIgKmxvY2FsX2FkZHJlc3M7CisgICAgaW50IGxpc3RlbmluZ19zZWN0aW9uOworCisjaWZkZWYgVVNFX0xJQldSQVAKKyAgICAvKiBleGVjdXRlIGFmdGVyIG9wdGlvbnNfY21kbGluZSgpIHRvIGtub3cgc2VydmljZV9vcHRpb25zLm5leHQsCisgICAgICogYnV0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBkZXNjcmlwdG9ycyAqLworICAgIC8qIHJldHJ5IG9uIGVhY2ggYmluZF9wb3J0cygpIGluIGNhc2Ugc3R1bm5lbC5jb25mIHdhcyByZWxvYWRlZAorICAgICAgIHdpdGhvdXQgImxpYndyYXAgPSBubyIgKi8KKyAgICBsaWJ3cmFwX2luaXQoKTsKKyNlbmRpZiAvKiBVU0VfTElCV1JBUCAqLworCisgICAgc19wb2xsX2luaXQoZmRzKTsKKyAgICBzX3BvbGxfYWRkKGZkcywgc2lnbmFsX3BpcGVbMF0sIDEsIDApOworCisgICAgLyogYWxsb3cgY2xlYW4gdW5iaW5kX3BvcnRzKCkgZXZlbiB0aG91Z2gKKyAgICAgICBiaW5kX3BvcnRzKCkgd2FzIG5vdCBmdWxseSBwZXJmb3JtZWQgKi8KKyAgICBmb3Iob3B0PXNlcnZpY2Vfb3B0aW9ucy5uZXh0OyBvcHQ7IG9wdD1vcHQtPm5leHQpCisgICAgICAgIGlmKG9wdC0+b3B0aW9uLmFjY2VwdCkKKyAgICAgICAgICAgIG9wdC0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisKKyAgICBsaXN0ZW5pbmdfc2VjdGlvbj0wOworICAgIGZvcihvcHQ9c2VydmljZV9vcHRpb25zLm5leHQ7IG9wdDsgb3B0PW9wdC0+bmV4dCkgeworICAgICAgICBpZihvcHQtPm9wdGlvbi5hY2NlcHQpIHsKKyAgICAgICAgICAgIGlmKGxpc3RlbmluZ19zZWN0aW9uPHN5c3RlbWRfZmRzKSB7CisgICAgICAgICAgICAgICAgb3B0LT5mZD0oU09DS0VUKShsaXN0ZW5fZmRzX3N0YXJ0K2xpc3RlbmluZ19zZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICJMaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9yIHJlY2VpdmVkIGZyb20gc3lzdGVtZCAoRkQ9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgb3B0LT5mZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wdC0+ZmQ9c19zb2NrZXQob3B0LT5sb2NhbF9hZGRyLnNhLnNhX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgU09DS19TVFJFQU0sIDAsIDEsICJhY2NlcHQgc29ja2V0Iik7CisgICAgICAgICAgICAgICAgaWYob3B0LT5mZD09SU5WQUxJRF9TT0NLRVQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkxpc3RlbmluZyBmaWxlIGRlc2NyaXB0b3IgY3JlYXRlZCAoRkQ9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgb3B0LT5mZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzZXRfc29ja2V0X29wdGlvbnMob3B0LT5mZCwgMCk8MCkgeworICAgICAgICAgICAgICAgIGNsb3Nlc29ja2V0KG9wdC0+ZmQpOworICAgICAgICAgICAgICAgIG9wdC0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBsb2NhbCBzb2NrZXQgY2FuJ3QgYmUgdW5uYW1lZCAqLworICAgICAgICAgICAgbG9jYWxfYWRkcmVzcz1zX250b3AoJm9wdC0+bG9jYWxfYWRkciwgYWRkcl9sZW4oJm9wdC0+bG9jYWxfYWRkcikpOworICAgICAgICAgICAgLyogd2UgZG9uJ3QgYmluZCBvciBsaXN0ZW4gb24gYSBzb2NrZXQgaW5oZXJpdGVkIGZyb20gc3lzdGVtZCAqLworICAgICAgICAgICAgaWYobGlzdGVuaW5nX3NlY3Rpb24+PXN5c3RlbWRfZmRzKSB7CisgICAgICAgICAgICAgICAgaWYoYmluZChvcHQtPmZkLCAmb3B0LT5sb2NhbF9hZGRyLnNhLCBhZGRyX2xlbigmb3B0LT5sb2NhbF9hZGRyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkVycm9yIGJpbmRpbmcgc2VydmljZSBbJXNdIHRvICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+c2Vydm5hbWUsIGxvY2FsX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBzb2NrZXJyb3IoImJpbmQiKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2Vzb2NrZXQob3B0LT5mZCk7CisgICAgICAgICAgICAgICAgICAgIG9wdC0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICAgICAgICAgIHN0cl9mcmVlKGxvY2FsX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobGlzdGVuKG9wdC0+ZmQsIFNPTUFYQ09OTikpIHsKKyAgICAgICAgICAgICAgICAgICAgc29ja2Vycm9yKCJsaXN0ZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2Vzb2NrZXQob3B0LT5mZCk7CisgICAgICAgICAgICAgICAgICAgIG9wdC0+ZmQ9SU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICAgICAgICAgIHN0cl9mcmVlKGxvY2FsX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzX3BvbGxfYWRkKGZkcywgb3B0LT5mZCwgMSwgMCk7CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTZXJ2aWNlIFslc10gKEZEPSVkKSBib3VuZCB0byAlcyIsCisgICAgICAgICAgICAgICAgb3B0LT5zZXJ2bmFtZSwgb3B0LT5mZCwgbG9jYWxfYWRkcmVzcyk7CisgICAgICAgICAgICBzdHJfZnJlZShsb2NhbF9hZGRyZXNzKTsKKyAgICAgICAgICAgICsrbGlzdGVuaW5nX3NlY3Rpb247CisgICAgICAgIH0gZWxzZSBpZihvcHQtPmV4ZWNfbmFtZSAmJiBvcHQtPmNvbm5lY3RfYWRkci5uYW1lcykgeworICAgICAgICAgICAgLyogY3JlYXRlIGV4ZWMrY29ubmVjdCBzZXJ2aWNlcyAqLworICAgICAgICAgICAgLyogRklYTUU6IG5lZWRzIHRvIGJlIGRlbGF5ZWQgb24gcmVsb2FkIHdpdGggb3B0LT5vcHRpb24ucmV0cnkgc2V0ICovCisgICAgICAgICAgICBjcmVhdGVfY2xpZW50KElOVkFMSURfU09DS0VULCBJTlZBTElEX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICBhbGxvY19jbGllbnRfc2Vzc2lvbihvcHQsIElOVkFMSURfU09DS0VULCBJTlZBTElEX1NPQ0tFVCksCisgICAgICAgICAgICAgICAgY2xpZW50X3RocmVhZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYobGlzdGVuaW5nX3NlY3Rpb248c3lzdGVtZF9mZHMpIHsKKyAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICJUb28gbWFueSBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tIHN5c3RlbWQsIGdvdCAlZCIsCisgICAgICAgICAgICBzeXN0ZW1kX2Zkcyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsgLyogT0sgKi8KK30KKworI2lmZGVmIEhBVkVfQ0hST09UCitOT0VYUE9SVCBpbnQgY2hhbmdlX3Jvb3Qodm9pZCkgeworICAgIGlmKCFnbG9iYWxfb3B0aW9ucy5jaHJvb3RfZGlyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZihjaHJvb3QoZ2xvYmFsX29wdGlvbnMuY2hyb290X2RpcikpIHsKKyAgICAgICAgc29ja2Vycm9yKCJjaHJvb3QiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKGNoZGlyKCIvIikpIHsKKyAgICAgICAgc29ja2Vycm9yKCJjaGRpciIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSEFWRV9DSFJPT1QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc2lnbmFsIHBpcGUgaGFuZGxpbmcgKi8KKworTk9FWFBPUlQgaW50IHNpZ25hbF9waXBlX2luaXQodm9pZCkgeworI2lmZGVmIFVTRV9XSU4zMgorICAgIGlmKG1ha2Vfc29ja2V0cyhzaWduYWxfcGlwZSkpCisgICAgICAgIHJldHVybiAxOworI2VsaWYgZGVmaW5lZChfX0lOTk9URUtfTElCQ19fKQorICAgIC8qIElubm90ZWsgcG9ydCBvZiBHQ0MgY2FuIG5vdCB1c2Ugc2VsZWN0IG9uIGEgcGlwZToKKyAgICAgKiB1c2UgbG9jYWwgc29ja2V0IGluc3RlYWQgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgICAgZmRfc2V0IHNldF9waXBlOworICAgIGludCBwaXBlX2luOworCisgICAgRkRfWkVSTygmc2V0X3BpcGUpOworICAgIHNpZ25hbF9waXBlWzBdPXNfc29ja2V0KFBGX09TMiwgU09DS19TVFJFQU0sIDAsIDAsICJzb2NrZXQjMSIpOworICAgIHNpZ25hbF9waXBlWzFdPXNfc29ja2V0KFBGX09TMiwgU09DS19TVFJFQU0sIDAsIDAsICJzb2NrZXQjMiIpOworCisgICAgLyogY29ubmVjdCB0aGUgdHdvIGVuZHBvaW50cyAqLworICAgIG1lbXNldCgmdW4sIDAsIHNpemVvZiB1bik7CisgICAgdW4uc3VuX2xlbj1zaXplb2YgdW47CisgICAgdW4uc3VuX2ZhbWlseT1BRl9PUzI7CisgICAgc3ByaW50Zih1bi5zdW5fcGF0aCwgIlxcc29ja2V0XFxzdHVubmVsLSV1IiwgZ2V0cGlkKCkpOworICAgIC8qIG1ha2UgdGhlIGZpcnN0IGVuZHBvaW50IGxpc3RlbiAqLworICAgIGJpbmQoc2lnbmFsX3BpcGVbMF0sIChzdHJ1Y3Qgc29ja2FkZHIgKikmdW4sIHNpemVvZiB1bik7CisgICAgbGlzdGVuKHNpZ25hbF9waXBlWzBdLCAxKTsKKyAgICBjb25uZWN0KHNpZ25hbF9waXBlWzFdLCAoc3RydWN0IHNvY2thZGRyICopJnVuLCBzaXplb2YgdW4pOworICAgIEZEX1NFVChzaWduYWxfcGlwZVswXSwgJnNldF9waXBlKTsKKyAgICBpZihzZWxlY3Qoc2lnbmFsX3BpcGVbMF0rMSwgJnNldF9waXBlLCBOVUxMLCBOVUxMLCBOVUxMKT4wKSB7CisgICAgICAgIHBpcGVfaW49c2lnbmFsX3BpcGVbMF07CisgICAgICAgIHNpZ25hbF9waXBlWzBdPXNfYWNjZXB0KHNpZ25hbF9waXBlWzBdLCBOVUxMLCAwLCAwLCAiYWNjZXB0Iik7CisgICAgICAgIGNsb3Nlc29ja2V0KHBpcGVfaW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tlcnJvcigic2VsZWN0Iik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbHNlIC8qIFVuaXggKi8KKyAgICBpZihzX3BpcGUoc2lnbmFsX3BpcGUsIDEsICJzaWduYWxfcGlwZSIpKQorICAgICAgICByZXR1cm4gMTsKKyNlbmRpZiAvKiBVU0VfV0lOMzIgKi8KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtcmVzdWx0IgorI2VuZGlmIC8qIF9fR05VQ19fICovCit2b2lkIHNpZ25hbF9wb3N0KGludCBzaWcpIHsKKyAgICAvKiBubyBtZWFuaW5nZnVsIHdheSBoZXJlIHRvIGhhbmRsZSB0aGUgcmVzdWx0ICovCisgICAgd3JpdGVzb2NrZXQoc2lnbmFsX3BpcGVbMV0sIChjaGFyICopJnNpZywgc2l6ZW9mIHNpZyk7Cit9CisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworTk9FWFBPUlQgaW50IHNpZ25hbF9waXBlX2Rpc3BhdGNoKHZvaWQpIHsKKyAgICBzdGF0aWMgaW50IHNpZzsKKyAgICBzdGF0aWMgc2l6ZV90IHB0cj0wOworICAgIHNzaXplX3QgbnVtOworICAgIGNoYXIgKnNpZ19uYW1lOworCisgICAgc19sb2coTE9HX0RFQlVHLCAiRGlzcGF0Y2hpbmcgc2lnbmFscyBmcm9tIHRoZSBzaWduYWwgcGlwZSIpOworICAgIGZvcig7OykgeworICAgICAgICBudW09cmVhZHNvY2tldChzaWduYWxfcGlwZVswXSwgKGNoYXIgKikmc2lnK3B0ciwgc2l6ZW9mIHNpZy1wdHIpOworICAgICAgICBpZihudW09PS0xICYmIGdldF9sYXN0X3NvY2tldF9lcnJvcigpPT1TX0VXT1VMREJMT0NLKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJTaWduYWwgcGlwZSBpcyBlbXB0eSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYobnVtPT0tMSB8fCBudW09PTApIHsKKyAgICAgICAgICAgIGlmKG51bSkKKyAgICAgICAgICAgICAgICBzb2NrZXJyb3IoInNpZ25hbCBwaXBlIHJlYWQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzX2xvZyhMT0dfRVJSLCAiU2lnbmFsIHBpcGUgY2xvc2VkIik7CisgICAgICAgICAgICBzX3BvbGxfcmVtb3ZlKGZkcywgc2lnbmFsX3BpcGVbMF0pOworICAgICAgICAgICAgY2xvc2Vzb2NrZXQoc2lnbmFsX3BpcGVbMF0pOworICAgICAgICAgICAgY2xvc2Vzb2NrZXQoc2lnbmFsX3BpcGVbMV0pOworICAgICAgICAgICAgaWYoc2lnbmFsX3BpcGVfaW5pdCgpKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgIlNpZ25hbCBwaXBlIHJlaW5pdGlhbGl6YXRpb24gZmFpbGVkOyB0ZXJtaW5hdGluZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc19wb2xsX2FkZChmZHMsIHNpZ25hbF9waXBlWzBdLCAxLCAwKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJTaWduYWwgcGlwZSByZWluaXRpYWxpemVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwdHIrPShzaXplX3QpbnVtOworICAgICAgICBpZihwdHI8c2l6ZW9mIHNpZykgeworICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiSW5jb21wbGV0ZSBzaWduYWwgcGlwZSByZWFkIChwdHI9JWxkKSIsCisgICAgICAgICAgICAgICAgKGxvbmcpcHRyKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHB0cj0wOworICAgICAgICBzd2l0Y2goc2lnKSB7CisjaWZuZGVmIFVTRV9XSU4zMgorICAgICAgICBjYXNlIFNJR0NITEQ6CisgICAgICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJQcm9jZXNzaW5nIFNJR0NITEQiKTsKKyNpZmRlZiBVU0VfRk9SSworICAgICAgICAgICAgY2xpZW50X3N0YXR1cygpOyAvKiByZXBvcnQgc3RhdHVzIG9mIGNsaWVudCBwcm9jZXNzICovCisjZWxzZSAvKiBVU0VfVUNPTlRFWFQgfHwgVVNFX1BUSFJFQUQgKi8KKyAgICAgICAgICAgIGNoaWxkX3N0YXR1cygpOyAgLyogcmVwb3J0IHN0YXR1cyBvZiBsaWJ3cmFwIG9yICdleGVjJyBwcm9jZXNzICovCisjZW5kaWYgLyogZGVmaW5lZCBVU0VfRk9SSyAqLworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogIWRlZmluZCBVU0VfV0lOMzIgKi8KKyAgICAgICAgY2FzZSBTSUdOQUxfUkVMT0FEX0NPTkZJRzoKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlByb2Nlc3NpbmcgU0lHTkFMX1JFTE9BRF9DT05GSUciKTsKKyAgICAgICAgICAgIGlmKG9wdGlvbnNfcGFyc2UoQ09ORl9SRUxPQUQpKSB7CisgICAgICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkZhaWxlZCB0byByZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1bmJpbmRfcG9ydHMoKTsKKyAgICAgICAgICAgICAgICBsb2dfY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvcHRpb25zX2FwcGx5KCk7CisgICAgICAgICAgICAgICAgbG9nX29wZW4oKTsKKyAgICAgICAgICAgICAgICB1aV9jb25maWdfcmVsb2FkZWQoKTsKKyAgICAgICAgICAgICAgICBpZihiaW5kX3BvcnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IGhhbmRsZSB0aGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSUdOQUxfUkVPUEVOX0xPRzoKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlByb2Nlc3NpbmcgU0lHTkFMX1JFT1BFTl9MT0ciKTsKKyAgICAgICAgICAgIGxvZ19jbG9zZSgpOworICAgICAgICAgICAgbG9nX29wZW4oKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJMb2cgZmlsZSByZW9wZW5lZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lHTkFMX1RFUk1JTkFURToKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIlByb2Nlc3NpbmcgU0lHTkFMX1RFUk1JTkFURSIpOworICAgICAgICAgICAgc19sb2coTE9HX05PVElDRSwgIlRlcm1pbmF0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2lnX25hbWU9c2lnbmFsX25hbWUoc2lnKTsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJSZWNlaXZlZCAlczsgdGVybWluYXRpbmciLCBzaWdfbmFtZSk7CisgICAgICAgICAgICBzdHJfZnJlZShzaWdfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc2lnbmFsIG5hbWUgZGVjb2RpbmcgKi8KKworI2RlZmluZSBjaGVja19zaWduYWwocykgaWYoc2lnbnVtPT1zKSByZXR1cm4gc3RyX2R1cCgjcyk7CisKK05PRVhQT1JUIGNoYXIgKnNpZ25hbF9uYW1lKGludCBzaWdudW0pIHsKKyNpZmRlZiBTSUdIVVAKKyAgICBjaGVja19zaWduYWwoU0lHSFVQKQorI2VuZGlmCisjaWZkZWYgU0lHSU5UCisgICAgY2hlY2tfc2lnbmFsKFNJR0lOVCkKKyNlbmRpZgorI2lmZGVmIFNJR1FVSVQKKyAgICBjaGVja19zaWduYWwoU0lHUVVJVCkKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorICAgIGNoZWNrX3NpZ25hbChTSUdJTEwpCisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisgICAgY2hlY2tfc2lnbmFsKFNJR1RSQVApCisjZW5kaWYKKyNpZmRlZiBTSUdBQlJUCisgICAgY2hlY2tfc2lnbmFsKFNJR0FCUlQpCisjZW5kaWYKKyNpZmRlZiBTSUdJT1QKKyAgICBjaGVja19zaWduYWwoU0lHSU9UKQorI2VuZGlmCisjaWZkZWYgU0lHQlVTCisgICAgY2hlY2tfc2lnbmFsKFNJR0JVUykKKyNlbmRpZgorI2lmZGVmIFNJR0ZQRQorICAgIGNoZWNrX3NpZ25hbChTSUdGUEUpCisjZW5kaWYKKyNpZmRlZiBTSUdLSUxMCisgICAgY2hlY2tfc2lnbmFsKFNJR0tJTEwpCisjZW5kaWYKKyNpZmRlZiBTSUdVU1IxCisgICAgY2hlY2tfc2lnbmFsKFNJR1VTUjEpCisjZW5kaWYKKyNpZmRlZiBTSUdTRUdWCisgICAgY2hlY2tfc2lnbmFsKFNJR1NFR1YpCisjZW5kaWYKKyNpZmRlZiBTSUdVU1IyCisgICAgY2hlY2tfc2lnbmFsKFNJR1VTUjIpCisjZW5kaWYKKyNpZmRlZiBTSUdQSVBFCisgICAgY2hlY2tfc2lnbmFsKFNJR1BJUEUpCisjZW5kaWYKKyNpZmRlZiBTSUdBTFJNCisgICAgY2hlY2tfc2lnbmFsKFNJR0FMUk0pCisjZW5kaWYKKyNpZmRlZiBTSUdURVJNCisgICAgY2hlY2tfc2lnbmFsKFNJR1RFUk0pCisjZW5kaWYKKyNpZmRlZiBTSUdTVEtGTFQKKyAgICBjaGVja19zaWduYWwoU0lHU1RLRkxUKQorI2VuZGlmCisjaWZkZWYgU0lHQ0hMRAorICAgIGNoZWNrX3NpZ25hbChTSUdDSExEKQorI2VuZGlmCisjaWZkZWYgU0lHQ09OVAorICAgIGNoZWNrX3NpZ25hbChTSUdDT05UKQorI2VuZGlmCisjaWZkZWYgU0lHU1RPUAorICAgIGNoZWNrX3NpZ25hbChTSUdTVE9QKQorI2VuZGlmCisjaWZkZWYgU0lHVFNUUAorICAgIGNoZWNrX3NpZ25hbChTSUdUU1RQKQorI2VuZGlmCisjaWZkZWYgU0lHVFRJTgorICAgIGNoZWNrX3NpZ25hbChTSUdUVElOKQorI2VuZGlmCisjaWZkZWYgU0lHVFRPVQorICAgIGNoZWNrX3NpZ25hbChTSUdUVE9VKQorI2VuZGlmCisjaWZkZWYgU0lHVVJHCisgICAgY2hlY2tfc2lnbmFsKFNJR1VSRykKKyNlbmRpZgorI2lmZGVmIFNJR1hDUFUKKyAgICBjaGVja19zaWduYWwoU0lHWENQVSkKKyNlbmRpZgorI2lmZGVmIFNJR1hGU1oKKyAgICBjaGVja19zaWduYWwoU0lHWEZTWikKKyNlbmRpZgorI2lmZGVmIFNJR1ZUQUxSTQorICAgIGNoZWNrX3NpZ25hbChTSUdWVEFMUk0pCisjZW5kaWYKKyNpZmRlZiBTSUdQUk9GCisgICAgY2hlY2tfc2lnbmFsKFNJR1BST0YpCisjZW5kaWYKKyNpZmRlZiBTSUdXSU5DSAorICAgIGNoZWNrX3NpZ25hbChTSUdXSU5DSCkKKyNlbmRpZgorI2lmZGVmIFNJR0lPCisgICAgY2hlY2tfc2lnbmFsKFNJR0lPKQorI2VuZGlmCisjaWZkZWYgU0lHUE9MTAorICAgIGNoZWNrX3NpZ25hbChTSUdQT0xMKQorI2VuZGlmCisjaWZkZWYgU0lHTE9TVAorICAgIGNoZWNrX3NpZ25hbChTSUdMT1NUKQorI2VuZGlmCisjaWZkZWYgU0lHUFdSCisgICAgY2hlY2tfc2lnbmFsKFNJR1BXUikKKyNlbmRpZgorI2lmZGVmIFNJR1NZUworICAgIGNoZWNrX3NpZ25hbChTSUdTWVMpCisjZW5kaWYKKyNpZmRlZiBTSUdVTlVTRUQKKyAgICBjaGVja19zaWduYWwoU0lHVU5VU0VEKQorI2VuZGlmCisgICAgcmV0dXJuIHN0cl9wcmludGYoInNpZ25hbCAlZCIsIHNpZ251bSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGxvZyBidWlsZCBkZXRhaWxzICovCisKK3ZvaWQgc3R1bm5lbF9pbmZvKGludCBsZXZlbCkgeworICAgIHNfbG9nKGxldmVsLCAic3R1bm5lbCAiIFNUVU5ORUxfVkVSU0lPTiAiIG9uICIgSE9TVCAiIHBsYXRmb3JtIik7CisgICAgaWYoc3RyY21wKE9QRU5TU0xfVkVSU0lPTl9URVhULCBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpKSB7CisgICAgICAgIHNfbG9nKGxldmVsLCAiQ29tcGlsZWQgd2l0aCAiIE9QRU5TU0xfVkVSU0lPTl9URVhUKTsKKyAgICAgICAgc19sb2cobGV2ZWwsICJSdW5uaW5nICB3aXRoICVzIiwgU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKTsKKyAgICAgICAgc19sb2cobGV2ZWwsICJVcGRhdGUgT3BlblNTTCBzaGFyZWQgbGlicmFyaWVzIG9yIHJlYnVpbGQgc3R1bm5lbCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfbG9nKGxldmVsLCAiQ29tcGlsZWQvcnVubmluZyB3aXRoICIgT1BFTlNTTF9WRVJTSU9OX1RFWFQpOworICAgIH0KKyAgICBzX2xvZyhsZXZlbCwKKworICAgICAgICAiVGhyZWFkaW5nOiIKKyNpZmRlZiBVU0VfVUNPTlRFWFQKKyAgICAgICAgIlVDT05URVhUIgorI2VuZGlmCisjaWZkZWYgVVNFX1BUSFJFQUQKKyAgICAgICAgIlBUSFJFQUQiCisjZW5kaWYKKyNpZmRlZiBVU0VfV0lOMzIKKyAgICAgICAgIldJTjMyIgorI2VuZGlmCisjaWZkZWYgVVNFX0ZPUksKKyAgICAgICAgIkZPUksiCisjZW5kaWYKKworICAgICAgICAiIFNvY2tldHM6IgorI2lmZGVmIFVTRV9QT0xMCisgICAgICAgICJQT0xMIgorI2Vsc2UgLyogZGVmaW5lZChVU0VfUE9MTCkgKi8KKyAgICAgICAgIlNFTEVDVCIKKyNlbmRpZiAvKiBkZWZpbmVkKFVTRV9QT0xMKSAqLworICAgICAgICAiLElQdiVjIgorI2lmZGVmIFVTRV9TWVNURU1ECisgICAgICAgICIsU1lTVEVNRCIKKyNlbmRpZiAvKiBkZWZpbmVkKFVTRV9TWVNURU1EKSAqLworCisgICAgICAgICIgVExTOiIKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNkZWZpbmUgVExTX0ZFQVRVUkVfRk9VTkQKKyAgICAgICAgIkVOR0lORSIKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkgKi8KKyNpZmRlZiBVU0VfRklQUworI2lmZGVmIFRMU19GRUFUVVJFX0ZPVU5ECisgICAgICAgICIsIgorI2Vsc2UKKyNkZWZpbmUgVExTX0ZFQVRVUkVfRk9VTkQKKyNlbmRpZgorICAgICAgICAiRklQUyIKKyNlbmRpZiAvKiBkZWZpbmVkKFVTRV9GSVBTKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKyNpZmRlZiBUTFNfRkVBVFVSRV9GT1VORAorICAgICAgICAiLCIKKyNlbHNlCisjZGVmaW5lIFRMU19GRUFUVVJFX0ZPVU5ECisjZW5kaWYKKyAgICAgICAgIk9DU1AiCisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworI2lmZGVmIFRMU19GRUFUVVJFX0ZPVU5ECisgICAgICAgICIsIgorI2Vsc2UKKyNkZWZpbmUgVExTX0ZFQVRVUkVfRk9VTkQKKyNlbmRpZgorICAgICAgICAiUFNLIgorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fUFNLKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorI2lmZGVmIFRMU19GRUFUVVJFX0ZPVU5ECisgICAgICAgICIsIgorI2Vsc2UKKyNkZWZpbmUgVExTX0ZFQVRVUkVfRk9VTkQKKyNlbmRpZgorICAgICAgICAiU05JIgorI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAqLworI2lmbmRlZiBUTFNfRkVBVFVSRV9GT1VORAorICAgICAgICAiTk9ORSIKKyNlbmRpZiAvKiAhZGVmaW5lZChUTFNfRkVBVFVSRV9GT1VORCkgKi8KKworI2lmZGVmIFVTRV9MSUJXUkFQCisgICAgICAgICIgQXV0aDpMSUJXUkFQIgorI2VuZGlmCisKKyAgICAgICAgLCAvKiBzdXBwb3J0ZWQgSVAgdmVyc2lvbiBwYXJhbWV0ZXIgKi8KKyNpZiBkZWZpbmVkKFVTRV9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgICAgc19nZXRhZGRyaW5mbyA/ICc2JyA6ICc0JworI2Vsc2UgLyogZGVmaW5lZChVU0VfV0lOMzIpICovCisjaWYgZGVmaW5lZChVU0VfSVB2NikKKyAgICAgICAgJzYnCisjZWxzZSAvKiBkZWZpbmVkKFVTRV9JUHY2KSAqLworICAgICAgICAnNCcKKyNlbmRpZiAvKiBkZWZpbmVkKFVTRV9JUHY2KSAqLworI2VuZGlmIC8qIGRlZmluZWQoVVNFX1dJTjMyKSAqLworICAgICAgICApOworI2lmZGVmIGVycm5vCisjZGVmaW5lIHhzdHIoYSkgc3RyKGEpCisjZGVmaW5lIHN0cihhKSAjYQorICAgIHNfbG9nKExPR19ERUJVRywgImVycm5vOiAiIHhzdHIoZXJybm8pKTsKKyNlbmRpZiAvKiBlcnJubyAqLworfQorCisvKiBlbmQgb2Ygc3R1bm5lbC5jICovCmRpZmYgLS1naXQgYS9zcmMvc3R1bm5lbC5pY28gYi9zcmMvc3R1bm5lbC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1NmU5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdHVubmVsLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvc3R1bm5lbDMuaW4gYi9zcmMvc3R1bm5lbDMuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWViYmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdHVubmVsMy5pbgpAQCAtMCwwICsxLDc1IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgc3R1bm5lbDMgICAgICBQZXJsIHdyYXBwZXIgdG8gdXNlIHN0dW5uZWwgMy54IHN5bnRheCBpbiBzdHVubmVsID49NC4wNQorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyMgVmVyc2lvbjogICAgICAyLjAzCisjIERhdGU6ICAgICAgICAgMjAxMS4xMC4yMgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKwordXNlIFBPU0lYOwordXNlIEdldG9wdDo6U3RkOworCisjIENvbmZpZ3VyYXRpb24gLSBwYXRoIHRvIHN0dW5uZWwgKHZlcnNpb24gPj00LjA1KQorJHN0dW5uZWxfYmluPSdAYmluZGlyQC9zdHVubmVsJzsKKworIyBzdHVubmVsMyBzY3JpcHQgYm9keSBiZWdpbnMgaGVyZQorKCRyZWFkX2ZkLCAkd3JpdGVfZmQpPVBPU0lYOjpwaXBlKCk7CiskcGlkPWZvcms7CitkaWUgIkNhbid0IGZvcmsiIHVubGVzcyBkZWZpbmVkICRwaWQ7CitpZigkcGlkKSB7ICMgcGFyZW50CisgICAgUE9TSVg6OmNsb3NlKCR3cml0ZV9mZCk7CisgICAgZXhlYyAiJHN0dW5uZWxfYmluIC1mZCAkcmVhZF9mZCI7CisgICAgZGllICIkc3R1bm5lbF9iaW4gZXhlYyBmYWlsZWQiOworfQorIyBjaGlsZAorUE9TSVg6OmNsb3NlKCRyZWFkX2ZkKTsKK29wZW4oU1RVTk5FTCwgIj4mJHdyaXRlX2ZkIik7CisjIGNvbW1lbnQgb3V0IHRoZSBuZXh0IGxpbmUgdG8gc2VlIHRoZSBjb25maWcgZmlsZQorc2VsZWN0KFNUVU5ORUwpOworCitnZXRvcHRzKCdjVFdmRDpPOm86QzpwOnY6YTpBOnQ6Tjp1Om46RTpSOkI6STpkOnM6ZzpQOnI6TDpsOicpOworCitwcmludCgiY2xpZW50ID0geWVzXG4iKSBpZiBkZWZpbmVkICRvcHRfYzsKK3ByaW50KCJ0cmFuc3BhcmVudCA9IHllc1xuIikgaWYgZGVmaW5lZCAkb3B0X1Q7CitwcmludCgiUk5Eb3ZlcndyaXRlID0geWVzXG4iKSBpZiBkZWZpbmVkICRvcHRfVzsKK3ByaW50KCJmb3JlZ3JvdW5kID0geWVzXG4iKSBpZiBkZWZpbmVkICRvcHRfZjsKK3ByaW50KCJkZWJ1ZyA9ICRvcHRfRFxuIikgaWYgZGVmaW5lZCAkb3B0X0Q7CitwcmludCgic29ja2V0ID0gJG9wdF9PXG4iKSBpZiBkZWZpbmVkICRvcHRfTzsKK3ByaW50KCJvdXRwdXQgPSAkb3B0X29cbiIpIGlmIGRlZmluZWQgJG9wdF9vOworcHJpbnQoImNpcGhlcnMgPSAkb3B0X0NcbiIpIGlmIGRlZmluZWQgJG9wdF9DOworcHJpbnQoImNlcnQgPSAkb3B0X3BcbiIpIGlmIGRlZmluZWQgJG9wdF9wOworcHJpbnQoInZlcmlmeSA9ICRvcHRfdlxuIikgaWYgZGVmaW5lZCAkb3B0X3Y7CitwcmludCgiQ0FwYXRoID0gJG9wdF9hXG4iKSBpZiBkZWZpbmVkICRvcHRfYTsKK3ByaW50KCJDQWZpbGUgPSAkb3B0X0FcbiIpIGlmIGRlZmluZWQgJG9wdF9BOworcHJpbnQoInNlc3Npb24gPSAkb3B0X3RcbiIpIGlmIGRlZmluZWQgJG9wdF90OworcHJpbnQoInNlcnZpY2UgPSAkb3B0X05cbiIpIGlmIGRlZmluZWQgJG9wdF9OOworcHJpbnQoImlkZW50ID0gJG9wdF91XG4iKSBpZiBkZWZpbmVkICRvcHRfdTsKK3ByaW50KCJwcm90b2NvbCA9ICRvcHRfblxuIikgaWYgZGVmaW5lZCAkb3B0X247CitwcmludCgiRUdEID0gJG9wdF9FXG4iKSBpZiBkZWZpbmVkICRvcHRfRTsKK3ByaW50KCJSTkRmaWxlID0gJG9wdF9SXG4iKSBpZiBkZWZpbmVkICRvcHRfUjsKK3ByaW50KCJSTkRieXRlcyA9ICRvcHRfQlxuIikgaWYgZGVmaW5lZCAkb3B0X0I7CitwcmludCgibG9jYWwgPSAkb3B0X0lcbiIpIGlmIGRlZmluZWQgJG9wdF9JOworcHJpbnQoImFjY2VwdCA9ICRvcHRfZFxuIikgaWYgZGVmaW5lZCAkb3B0X2Q7CitwcmludCgic2V0dWlkID0gJG9wdF9zXG4iKSBpZiBkZWZpbmVkICRvcHRfczsKK3ByaW50KCJzZXRnaWQgPSAkb3B0X2dcbiIpIGlmIGRlZmluZWQgJG9wdF9nOworcHJpbnQoInBpZCA9ICRvcHRfUFxuIikgaWYgZGVmaW5lZCAkb3B0X1A7CitwcmludCgiY29ubmVjdCA9ICRvcHRfclxuIikgaWYgZGVmaW5lZCAkb3B0X3I7CitwcmludCgicHR5ID0geWVzXG4iKSwgJG9wdF9sPSRvcHRfTCBpZiBkZWZpbmVkICRvcHRfTDsKK3ByaW50KCJleGVjID0gJG9wdF9sXG5leGVjQXJncyA9ICIgLiBqb2luKCcgJywgJG9wdF9sLCBAQVJHVikgLiAiXG4iKSBpZiBkZWZpbmVkICRvcHRfbDsKK3ByaW50KCJbc3R1bm5lbDNdXG4iKSBpZiBkZWZpbmVkICRvcHRfZDsKKworY2xvc2UoU1RVTk5FTCk7CisKKyMgc3R1bm5lbDMgc2NyaXB0IGJvZHkgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9zcmMvdGxzLmMgYi9zcmMvdGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYzRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90bHMuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqICAgc3R1bm5lbCAgICAgICBUTFMgb2ZmbG9hZGluZyBhbmQgbG9hZC1iYWxhbmNpbmcgcHJveHkKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICogICBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gc3R1bm5lbC4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCisgKgorICogICBJbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXIgb2Ygc3R1bm5lbAorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yCisgKiAgIGxpYnJhcmllcyB0aGF0IGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIExHUEwgYW5kIHdpdGggY29kZSBpbmNsdWRlZAorICogICBpbiB0aGUgc3RhbmRhcmQgcmVsZWFzZSBvZiBPcGVuU1NMIHVuZGVyIHRoZSBPcGVuU1NMIExpY2Vuc2UgKG9yCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQorICogICBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgc3lzdGVtIGZvbGxvd2luZyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgZm9yCisgKiAgIHN0dW5uZWwgYW5kIHRoZSBsaWNlbnNlcyBvZiB0aGUgb3RoZXIgY29kZSBjb25jZXJuZWQuCisgKgorICogICBOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQKKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyCisgKiAgIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbgorICogICB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbgorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMKKyAqICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgorCit2b2xhdGlsZSBpbnQgdGxzX2luaXRpYWxpemVkPTA7CisKK05PRVhQT1JUIHZvaWQgdGxzX3BsYXRmb3JtX2luaXQoKTsKK05PRVhQT1JUIHZvaWQgZnJlZV9mdW5jdGlvbih2b2lkICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0aHJlYWQgbG9jYWwgc3RvcmFnZSAqLworCisvKiB0aGlzIGhhcyB0byBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkIGZyb20gdWlfKi5jICovCit2b2lkIHRsc19pbml0KCkgeworICAgIHRsc19wbGF0Zm9ybV9pbml0KCk7CisgICAgdGxzX2luaXRpYWxpemVkPTE7CisgICAgdWlfdGxzPXRsc19hbGxvYyhOVUxMLCBOVUxMLCAidWkiKTsKKyAgICBDUllQVE9fc2V0X21lbV9leF9mdW5jdGlvbnMoc3RyX2FsbG9jX2RldGFjaGVkX2RlYnVnLAorICAgICAgICBzdHJfcmVhbGxvY19kZWJ1ZywgZnJlZV9mdW5jdGlvbik7Cit9CisKKy8qIHRoaXMgaGFzIHRvIGJlIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQgYnkgYSBuZXcgdGhyZWFkICovCitUTFNfREFUQSAqdGxzX2FsbG9jKENMSSAqYywgVExTX0RBVEEgKmluaGVyaXRlZCwgY2hhciAqdHh0KSB7CisgICAgVExTX0RBVEEgKnRsc19kYXRhOworCisgICAgaWYoaW5oZXJpdGVkKSB7IC8qIHJldXNlIHRoZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSBhZnRlciBmb3JrKCkgKi8KKyAgICAgICAgdGxzX2RhdGE9aW5oZXJpdGVkOworICAgICAgICBzdHJfZnJlZSh0bHNfZGF0YS0+aWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRsc19kYXRhPWNhbGxvYygxLCBzaXplb2YoVExTX0RBVEEpKTsKKyAgICAgICAgaWYoIXRsc19kYXRhKQorICAgICAgICAgICAgZmF0YWwoIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgaWYoYykKKyAgICAgICAgICAgIGMtPnRscz10bHNfZGF0YTsKKyAgICAgICAgc3RyX2luaXQodGxzX2RhdGEpOworICAgICAgICB0bHNfZGF0YS0+Yz1jOworICAgICAgICB0bHNfZGF0YS0+b3B0PWM/Yy0+b3B0OiZzZXJ2aWNlX29wdGlvbnM7CisgICAgfQorICAgIHRsc19kYXRhLT5pZD0idW5jb25maWd1cmVkIjsKKyAgICB0bHNfc2V0KHRsc19kYXRhKTsKKworICAgIC8qIHN0ci5jIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBiZWxvdyB0aGlzIHBvaW50ICovCisgICAgaWYodHh0KSB7CisgICAgICAgIHRsc19kYXRhLT5pZD1zdHJfZHVwKHR4dCk7CisgICAgICAgIHN0cl9kZXRhY2godGxzX2RhdGEtPmlkKTsgLyogaXQgaXMgZGVhbGxvY2F0ZWQgYWZ0ZXIgc3RyX3N0YXRzKCkgKi8KKyAgICB9IGVsc2UgaWYoYykgeworICAgICAgICB0bHNfZGF0YS0+aWQ9bG9nX2lkKGMpOworICAgICAgICBzdHJfZGV0YWNoKHRsc19kYXRhLT5pZCk7IC8qIGl0IGlzIGRlYWxsb2NhdGVkIGFmdGVyIHN0cl9zdGF0cygpICovCisgICAgfQorCisgICAgcmV0dXJuIHRsc19kYXRhOworfQorCisvKiBwZXItdGhyZWFkIHRocmVhZC1sb2NhbCBzdG9yYWdlIGNsZWFudXAgKi8KK3ZvaWQgdGxzX2NsZWFudXAoKSB7CisgICAgVExTX0RBVEEgKnRsc19kYXRhOworCisgICAgdGxzX2RhdGE9dGxzX2dldCgpOworICAgIGlmKCF0bHNfZGF0YSkKKyAgICAgICAgcmV0dXJuOworICAgIHN0cl9jbGVhbnVwKHRsc19kYXRhKTsKKyAgICBzdHJfZnJlZSh0bHNfZGF0YS0+aWQpOyAvKiBkZXRhY2hlZCBhbGxvY2F0aW9uICovCisgICAgdGxzX3NldChOVUxMKTsKKyAgICBmcmVlKHRsc19kYXRhKTsKK30KKworI2lmZGVmIFVTRV9VQ09OVEVYVAorCitzdGF0aWMgVExTX0RBVEEgKmdsb2JhbF90bHM9TlVMTDsKKworTk9FWFBPUlQgdm9pZCB0bHNfcGxhdGZvcm1faW5pdCgpIHsKK30KKwordm9pZCB0bHNfc2V0KFRMU19EQVRBICp0bHNfZGF0YSkgeworICAgIGlmKHJlYWR5X2hlYWQpCisgICAgICAgIHJlYWR5X2hlYWQtPnRscz10bHNfZGF0YTsKKyAgICBlbHNlIC8qIHVjb250ZXh0IHRocmVhZHMgbm90IGluaXRpYWxpemVkICovCisgICAgICAgIGdsb2JhbF90bHM9dGxzX2RhdGE7Cit9CisKK1RMU19EQVRBICp0bHNfZ2V0KCkgeworICAgIGlmKHJlYWR5X2hlYWQpCisgICAgICAgIHJldHVybiByZWFkeV9oZWFkLT50bHM7CisgICAgZWxzZSAvKiB1Y29udGV4dCB0aHJlYWRzIG5vdCBpbml0aWFsaXplZCAqLworICAgICAgICByZXR1cm4gZ2xvYmFsX3RsczsKK30KKworI2VuZGlmIC8qIFVTRV9VQ09OVEVYVCAqLworCisjaWZkZWYgVVNFX0ZPUksKKworc3RhdGljIFRMU19EQVRBICpnbG9iYWxfdGxzPU5VTEw7CisKK05PRVhQT1JUIHZvaWQgdGxzX3BsYXRmb3JtX2luaXQoKSB7Cit9CisKK3ZvaWQgdGxzX3NldChUTFNfREFUQSAqdGxzX2RhdGEpIHsKKyAgICBnbG9iYWxfdGxzPXRsc19kYXRhOworfQorCitUTFNfREFUQSAqdGxzX2dldCgpIHsKKyAgICByZXR1cm4gZ2xvYmFsX3RsczsKK30KKworI2VuZGlmIC8qIFVTRV9GT1JLICovCisKKyNpZmRlZiBVU0VfUFRIUkVBRAorCitzdGF0aWMgcHRocmVhZF9rZXlfdCBwdGhyZWFkX2tleTsKKworTk9FWFBPUlQgdm9pZCB0bHNfcGxhdGZvcm1faW5pdCgpIHsKKyAgICBwdGhyZWFkX2tleV9jcmVhdGUoJnB0aHJlYWRfa2V5LCBOVUxMKTsKK30KKwordm9pZCB0bHNfc2V0KFRMU19EQVRBICp0bHNfZGF0YSkgeworICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXksIHRsc19kYXRhKTsKK30KKworVExTX0RBVEEgKnRsc19nZXQoKSB7CisgICAgcmV0dXJuIHB0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXkpOworfQorCisjZW5kaWYgLyogVVNFX1BUSFJFQUQgKi8KKworI2lmZGVmIFVTRV9XSU4zMgorCitzdGF0aWMgRFdPUkQgdGxzX2luZGV4OworCitOT0VYUE9SVCB2b2lkIHRsc19wbGF0Zm9ybV9pbml0KCkgeworICAgIHRsc19pbmRleD1UbHNBbGxvYygpOworfQorCit2b2lkIHRsc19zZXQoVExTX0RBVEEgKnRsc19kYXRhKSB7CisgICAgVGxzU2V0VmFsdWUodGxzX2luZGV4LCB0bHNfZGF0YSk7Cit9CisKK1RMU19EQVRBICp0bHNfZ2V0KCkgeworICAgIHJldHVybiBUbHNHZXRWYWx1ZSh0bHNfaW5kZXgpOworfQorCisjZW5kaWYgLyogVVNFX1dJTjMyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE9wZW5TU0wgYWxsb2NhdG9yIGhvb2sgKi8KKworTk9FWFBPUlQgdm9pZCBmcmVlX2Z1bmN0aW9uKHZvaWQgKnB0cikgeworICAgIC8qIENSWVBUT19zZXRfbWVtX2V4X2Z1bmN0aW9ucygpIG5lZWRzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gYSBtYWNybyAqLworICAgIC8qIHVuZm9ydHVuYXRlbHksIE9wZW5TU0wgcHJvdmlkZXMgbm8gZmlsZTpsaW5lIGluZm9ybWF0aW9uIGhlcmUgKi8KKyAgICBzdHJfZnJlZV9kZWJ1ZyhwdHIsICJPcGVuU1NMIiwgMCk7Cit9CisKKy8qIGVuZCBvZiB0bHMuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3VpX3VuaXguYyBiL3NyYy91aV91bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4MGJlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy91aV91bml4LmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworTk9FWFBPUlQgaW50IG1haW5fdW5peChpbnQsIGNoYXIqW10pOworI2lmICFkZWZpbmVkKF9fdm1zKSAmJiAhZGVmaW5lZChVU0VfT1MyKQorTk9FWFBPUlQgaW50IGRhZW1vbml6ZShpbnQpOworTk9FWFBPUlQgaW50IGNyZWF0ZV9waWQodm9pZCk7CitOT0VYUE9SVCB2b2lkIGRlbGV0ZV9waWQodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgVVNFX09TMgorTk9FWFBPUlQgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQpOworI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsgLyogZXhlY3V0aW9uIGJlZ2lucyBoZXJlIDgtKSAqLworICAgIGludCByZXR2YWw7CisKKyNpZmRlZiBNX01NQVBfVEhSRVNIT0xECisgICAgbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCA0MDk2KTsKKyNlbmRpZgorICAgIHRsc19pbml0KCk7IC8qIGluaXRpYWxpemUgdGhyZWFkLWxvY2FsIHN0b3JhZ2UgKi8KKyAgICByZXR2YWw9bWFpbl91bml4KGFyZ2MsIGFyZ3YpOworICAgIG1haW5fY2xlYW51cCgpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK05PRVhQT1JUIGludCBtYWluX3VuaXgoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmICFkZWZpbmVkKF9fdm1zKSAmJiAhZGVmaW5lZChVU0VfT1MyKQorICAgIGludCBmZDsKKworICAgIGZkPW9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7IC8qIG9wZW4gL2Rldi9udWxsIGJlZm9yZSBjaHJvb3QgKi8KKyAgICBpZihmZD09SU5WQUxJRF9TT0NLRVQpCisgICAgICAgIGZhdGFsKCJDb3VsZCBub3Qgb3BlbiAvZGV2L251bGwiKTsKKyNlbmRpZgorICAgIG1haW5faW5pdCgpOworICAgIGlmKG1haW5fY29uZmlndXJlKGFyZ2M+MSA/IGFyZ3ZbMV0gOiBOVUxMLCBhcmdjPjIgPyBhcmd2WzJdIDogTlVMTCkpIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc2VydmljZV9vcHRpb25zLm5leHQpIHsgLyogdGhlcmUgYXJlIHNlcnZpY2Ugc2VjdGlvbnMgLT4gZGFlbW9uIG1vZGUgKi8KKyNpZiAhZGVmaW5lZChfX3ZtcykgJiYgIWRlZmluZWQoVVNFX09TMikKKyAgICAgICAgaWYoZGFlbW9uaXplKGZkKSkgeworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAvKiBjcmVhdGVfcGlkKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZHJvcF9wcml2aWxlZ2VzKCkKKyAgICAgICAgICogb3IgaXQgd29uJ3QgYmUgcG9zc2libGUgdG8gcmVtb3ZlIHRoZSBmaWxlIG9uIGV4aXQgKi8KKyAgICAgICAgLyogY3JlYXRlX3BpZCgpIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRhZW1vbml6ZSgpCisgICAgICAgICAqIHNpbmNlIHRoZSBmaW5hbCBwaWQgaXMgbm90IGtub3duIGJlZm9yZWhhbmQgKi8KKyAgICAgICAgaWYoY3JlYXRlX3BpZCgpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKyNpZm5kZWYgVVNFX09TMgorICAgICAgICBzaWduYWwoU0lHQ0hMRCwgc2lnbmFsX2hhbmRsZXIpOyAvKiBoYW5kbGUgZGVhZCBjaGlsZHJlbiAqLworICAgICAgICBzaWduYWwoU0lHSFVQLCBzaWduYWxfaGFuZGxlcik7IC8qIGNvbmZpZ3VyYXRpb24gcmVsb2FkICovCisgICAgICAgIHNpZ25hbChTSUdVU1IxLCBzaWduYWxfaGFuZGxlcik7IC8qIGxvZyByZW9wZW4gKi8KKyAgICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAvKiBpZ25vcmUgYnJva2VuIHBpcGUgKi8KKyAgICAgICAgaWYoc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pIT1TSUdfSUdOKQorICAgICAgICAgICAgc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9oYW5kbGVyKTsgLyogZmF0YWwgKi8KKyAgICAgICAgaWYoc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pIT1TSUdfSUdOKQorICAgICAgICAgICAgc2lnbmFsKFNJR1FVSVQsIHNpZ25hbF9oYW5kbGVyKTsgLyogZmF0YWwgKi8KKyAgICAgICAgaWYoc2lnbmFsKFNJR0lOVCwgU0lHX0lHTikhPVNJR19JR04pCisgICAgICAgICAgICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7IC8qIGZhdGFsICovCisjZW5kaWYKKyAgICAgICAgZGFlbW9uX2xvb3AoKTsKKyAgICB9IGVsc2UgeyAvKiBpbmV0ZCBtb2RlICovCisjaWYgIWRlZmluZWQoX192bXMpICYmICFkZWZpbmVkKFVTRV9PUzIpCisgICAgICAgIGNsb3NlKGZkKTsKKyNlbmRpZiAvKiBzdGFuZGFyZCBVbml4ICovCisjaWZuZGVmIFVTRV9PUzIKKyAgICAgICAgc2lnbmFsKFNJR0NITEQsIFNJR19JR04pOyAvKiBpZ25vcmUgZGVhZCBjaGlsZHJlbiAqLworICAgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7IC8qIGlnbm9yZSBicm9rZW4gcGlwZSAqLworI2VuZGlmCisgICAgICAgIHNldF9ub25ibG9jaygwLCAxKTsgLyogc3RkaW4gKi8KKyAgICAgICAgc2V0X25vbmJsb2NrKDEsIDEpOyAvKiBzdGRvdXQgKi8KKyAgICAgICAgY2xpZW50X21haW4oYWxsb2NfY2xpZW50X3Nlc3Npb24oJnNlcnZpY2Vfb3B0aW9ucywgMCwgMSkpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBVU0VfT1MyCitOT0VYUE9SVCB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpIHsKKyAgICBpbnQgc2F2ZWRfZXJybm87CisKKyAgICBzYXZlZF9lcnJubz1lcnJubzsKKyAgICBzaWduYWxfcG9zdChzaWcpOworICAgIHNpZ25hbChzaWcsIHNpZ25hbF9oYW5kbGVyKTsKKyAgICBlcnJubz1zYXZlZF9lcnJubzsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX192bXMpICYmICFkZWZpbmVkKFVTRV9PUzIpCisKK05PRVhQT1JUIGludCBkYWVtb25pemUoaW50IGZkKSB7IC8qIGdvIHRvIGJhY2tncm91bmQgKi8KKyAgICBpZihnbG9iYWxfb3B0aW9ucy5vcHRpb24uZm9yZWdyb3VuZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZHVwMihmZCwgMCk7CisgICAgZHVwMihmZCwgMSk7CisgICAgZHVwMihmZCwgMik7CisjaWYgZGVmaW5lZChIQVZFX0RBRU1PTikgJiYgIWRlZmluZWQoX19CRU9TX18pCisgICAgLyogc2V0IG5vY2xvc2Ugb3B0aW9uIHdoZW4gY2FsbGluZyBkYWVtb24oKSBmdW5jdGlvbiwKKyAgICAgKiBzbyBpdCBkb2VzIG5vdCByZXF1aXJlIC9kZXYvbnVsbCBkZXZpY2UgaW4gdGhlIGNocm9vdGVkIGRpcmVjdG9yeSAqLworICAgIGlmKGRhZW1vbigwLCAxKT09LTEpIHsKKyAgICAgICAgaW9lcnJvcigiZGFlbW9uIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbHNlCisgICAgY2hkaXIoIi8iKTsKKyAgICBzd2l0Y2goZm9yaygpKSB7CisgICAgY2FzZSAtMTogICAgLyogZm9yayBmYWlsZWQgKi8KKyAgICAgICAgaW9lcnJvcigiZm9yayIpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDA6ICAgICAvKiBjaGlsZCAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAvKiBwYXJlbnQgKi8KKyAgICAgICAgZXhpdCgwKTsKKyAgICB9CisjZW5kaWYKKyAgICB0bHNfYWxsb2MoTlVMTCwgdWlfdGxzLCAibWFpbiIpOyAvKiByZXVzZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSAqLworI2lmZGVmIEhBVkVfU0VUU0lECisgICAgc2V0c2lkKCk7IC8qIGlnbm9yZSB0aGUgZXJyb3IgKi8KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitOT0VYUE9SVCBpbnQgY3JlYXRlX3BpZCh2b2lkKSB7CisgICAgaW50IHBmOworICAgIGNoYXIgKnBpZDsKKworICAgIGlmKCFnbG9iYWxfb3B0aW9ucy5waWRmaWxlKSB7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIk5vIHBpZCBmaWxlIGJlaW5nIGNyZWF0ZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKGdsb2JhbF9vcHRpb25zLnBpZGZpbGVbMF0hPScvJykgeworICAgICAgICAvKiB0byBwcmV2ZW50IGNyZWF0aW5nIHBpZCBmaWxlIHJlbGF0aXZlIHRvICcvJyBhZnRlciBkYWVtb25pemUoKSAqLworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiUGlkIGZpbGUgKCVzKSBtdXN0IGJlIGZ1bGwgcGF0aCBuYW1lIiwgZ2xvYmFsX29wdGlvbnMucGlkZmlsZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBnbG9iYWxfb3B0aW9ucy5kcGlkPSh1bnNpZ25lZCBsb25nKWdldHBpZCgpOworCisgICAgLyogc2lsZW50bHkgcmVtb3ZlIG9sZCBwaWQgZmlsZSAqLworICAgIHVubGluayhnbG9iYWxfb3B0aW9ucy5waWRmaWxlKTsKKyAgICBwZj1vcGVuKGdsb2JhbF9vcHRpb25zLnBpZGZpbGUsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQ3xPX0VYQ0wsIDA2NDQpOworICAgIGlmKHBmPT0tMSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiQ2Fubm90IGNyZWF0ZSBwaWQgZmlsZSAlcyIsIGdsb2JhbF9vcHRpb25zLnBpZGZpbGUpOworICAgICAgICBpb2Vycm9yKCJjcmVhdGUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHBpZD1zdHJfcHJpbnRmKCIlbHVcbiIsIGdsb2JhbF9vcHRpb25zLmRwaWQpOworICAgIGlmKHdyaXRlKHBmLCBwaWQsIHN0cmxlbihwaWQpKTwoaW50KXN0cmxlbihwaWQpKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJDYW5ub3Qgd3JpdGUgcGlkIGZpbGUgJXMiLCBnbG9iYWxfb3B0aW9ucy5waWRmaWxlKTsKKyAgICAgICAgaW9lcnJvcigid3JpdGUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHN0cl9mcmVlKHBpZCk7CisgICAgY2xvc2UocGYpOworICAgIHNfbG9nKExPR19ERUJVRywgIkNyZWF0ZWQgcGlkIGZpbGUgJXMiLCBnbG9iYWxfb3B0aW9ucy5waWRmaWxlKTsKKyAgICBhdGV4aXQoZGVsZXRlX3BpZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK05PRVhQT1JUIHZvaWQgZGVsZXRlX3BpZCh2b2lkKSB7CisgICAgaWYoKHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCkhPWdsb2JhbF9vcHRpb25zLmRwaWQpCisgICAgICAgIHJldHVybjsgLyogY3VycmVudCBwcm9jZXNzIGlzIG5vdCBtYWluIGRhZW1vbiBwcm9jZXNzICovCisgICAgc19sb2coTE9HX0RFQlVHLCAicmVtb3ZpbmcgcGlkIGZpbGUgJXMiLCBnbG9iYWxfb3B0aW9ucy5waWRmaWxlKTsKKyAgICBpZih1bmxpbmsoZ2xvYmFsX29wdGlvbnMucGlkZmlsZSk8MCkKKyAgICAgICAgaW9lcnJvcihnbG9iYWxfb3B0aW9ucy5waWRmaWxlKTsgLyogbm90IGNyaXRpY2FsICovCit9CisKKyNlbmRpZiAvKiBzdGFuZGFyZCBVbml4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wdGlvbnMgY2FsbGJhY2tzICovCisKK3ZvaWQgdWlfY29uZmlnX3JlbG9hZGVkKHZvaWQpIHsKKyAgICAvKiBubyBhY3Rpb24gKi8KK30KKworI2lmZGVmIElDT05fSU1BR0UKKworSUNPTl9JTUFHRSBsb2FkX2ljb25fZGVmYXVsdChJQ09OX1RZUEUgaWNvbikgeworICAgICh2b2lkKWljb247IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIChJQ09OX0lNQUdFKTA7Cit9CisKK0lDT05fSU1BR0UgbG9hZF9pY29uX2ZpbGUoY29uc3QgY2hhciAqZmlsZSkgeworICAgICh2b2lkKWZpbGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIChJQ09OX0lNQUdFKTA7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjbGllbnQgY2FsbGJhY2tzICovCisKK3ZvaWQgdWlfbmV3X2NoYWluKGNvbnN0IHVuc2lnbmVkIHNlY3Rpb25fbnVtYmVyKSB7CisgICAgKHZvaWQpc2VjdGlvbl9udW1iZXI7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCit9CisKK3ZvaWQgdWlfY2xpZW50cyhjb25zdCBsb25nIG51bSkgeworICAgICh2b2lkKW51bTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogc19sb2cgY2FsbGJhY2tzICovCisKK3ZvaWQgdWlfbmV3X2xvZyhjb25zdCBjaGFyICpsaW5lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbGluZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN0eCBjYWxsYmFja3MgKi8KKworaW50IHBhc3N3ZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkgeworICAgICh2b2lkKWJ1ZjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClzaXplOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKXJ3ZmxhZzsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZCl1c2VyZGF0YTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICByZXR1cm4gMDsgLyogbm90IGltcGxlbWVudGVkICovCit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBwaW5fY2IoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcykgeworICAgICh2b2lkKXVpOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKXVpczsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICByZXR1cm4gMDsgLyogbm90IGltcGxlbWVudGVkICovCit9CisjZW5kaWYKKworLyogZW5kIG9mIHVpX3VuaXguYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3VpX3dpbl9jbGkuYyBiL3NyYy91aV93aW5fY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwYjMxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy91aV93aW5fY2xpLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICAgIHN0YXRpYyBzdHJ1Y3QgV1NBRGF0YSB3c2Ffc3RhdGU7CisgICAgVENIQVIgKmMsIHN0dW5uZWxfZXhlX3BhdGhbTUFYX1BBVEhdOworCisgICAgdGxzX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSAqLworCisgICAgLyogc2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYW5kIGVuZ2luZSBwYXRoICovCisgICAgR2V0TW9kdWxlRmlsZU5hbWUoMCwgc3R1bm5lbF9leGVfcGF0aCwgTUFYX1BBVEgpOworICAgIGM9X3Rjc3JjaHIoc3R1bm5lbF9leGVfcGF0aCwgVEVYVCgnXFwnKSk7IC8qIGxhc3QgYmFja3NsYXNoICovCisgICAgaWYoYykgLyogZm91bmQgKi8KKyAgICAgICAgY1sxXT1URVhUKCdcMCcpOyAvKiB0cnVuY2F0ZSBwcm9ncmFtIG5hbWUgKi8KKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIGlmKCFTZXRDdXJyZW50RGlyZWN0b3J5KHN0dW5uZWxfZXhlX3BhdGgpKSB7CisgICAgICAgIC8qIGxvZyB0byBzdGRlcnIsIGFzIHNfbG9nKCkgaXMgbm90IGluaXRpYWxpemVkICovCisgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIFRFWFQoIkNhbm5vdCBzZXQgZGlyZWN0b3J5IHRvICVzIiksCisgICAgICAgICAgICBzdHVubmVsX2V4ZV9wYXRoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgX3RwdXRlbnYoc3RyX3RwcmludGYoVEVYVCgiT1BFTlNTTF9FTkdJTkVTPSVzIiksIHN0dW5uZWxfZXhlX3BhdGgpKTsKKworICAgIGlmKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3c2Ffc3RhdGUpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXNvbHZlcl9pbml0KCk7CisgICAgbWFpbl9pbml0KCk7CisgICAgaWYoIW1haW5fY29uZmlndXJlKGFyZ2M+MSA/IGFyZ3ZbMV0gOiBOVUxMLCBhcmdjPjIgPyBhcmd2WzJdIDogTlVMTCkpCisgICAgICAgIGRhZW1vbl9sb29wKCk7CisgICAgbWFpbl9jbGVhbnVwKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wdGlvbnMgY2FsbGJhY2tzICovCisKK3ZvaWQgdWlfY29uZmlnX3JlbG9hZGVkKHZvaWQpIHsKKyAgICAvKiBubyBhY3Rpb24gKi8KK30KKworSUNPTl9JTUFHRSBsb2FkX2ljb25fZGVmYXVsdChJQ09OX1RZUEUgdHlwZSkgeworICAgICh2b2lkKXR5cGU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0lDT05fSU1BR0UgbG9hZF9pY29uX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkgeworICAgICh2b2lkKW5hbWU7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNsaWVudCBjYWxsYmFja3MgKi8KKwordm9pZCB1aV9uZXdfY2hhaW4oY29uc3QgdW5zaWduZWQgc2VjdGlvbl9udW1iZXIpIHsKKyAgICAodm9pZClzZWN0aW9uX251bWJlcjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KK30KKwordm9pZCB1aV9jbGllbnRzKGNvbnN0IGxvbmcgbnVtKSB7CisgICAgKHZvaWQpbnVtOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBzX2xvZyBjYWxsYmFja3MgKi8KKwordm9pZCBtZXNzYWdlX2JveChMUENUU1RSIHRleHQsIGNvbnN0IFVJTlQgdHlwZSkgeworICAgIE1lc3NhZ2VCb3goTlVMTCwgdGV4dCwgVEVYVCgic3R1bm5lbCIpLCB0eXBlKTsKK30KKwordm9pZCB1aV9uZXdfbG9nKGNvbnN0IGNoYXIgKmxpbmUpIHsKKyAgICBMUFRTVFIgdHN0cjsKKworICAgIHRzdHI9c3RyMnRzdHIobGluZSk7CisjaWZkZWYgX1dJTjMyX1dDRQorICAgIC8qIGxvZyB0byBXaW5kb3dzIENFIGRlYnVnIG91dHB1dCBzdHJlYW0gKi8KKyAgICBSRVRBSUxNU0coVFJVRSwgKFRFWFQoIiVzXHJcbiIpLCB0c3RyKSk7CisjZWxzZQorICAgIC8qIHVzZSBVVEYtMTYgb3IgbmF0aXZlIGNvZGVwYWdlIHJhdGhlciB0aGFuIFVURi04ICovCisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgVEVYVCgiJXNcclxuIiksIHRzdHIpOworICAgIGZmbHVzaChzdGRlcnIpOworI2VuZGlmCisgICAgc3RyX2ZyZWUodHN0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN0eCBjYWxsYmFja3MgKi8KKworaW50IHBhc3N3ZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkgeworICAgICh2b2lkKWJ1ZjsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZClzaXplOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKXJ3ZmxhZzsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZCl1c2VyZGF0YTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICByZXR1cm4gMDsgLyogbm90IGltcGxlbWVudGVkICovCit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBwaW5fY2IoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcykgeworICAgICh2b2lkKXVpOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKXVpczsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICByZXR1cm4gMDsgLyogbm90IGltcGxlbWVudGVkICovCit9CisjZW5kaWYKKworLyogZW5kIG9mIHVpX3dpbl9jbGkuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3VpX3dpbl9ndWkuYyBiL3NyYy91aV93aW5fZ3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkYTJjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy91aV93aW5fZ3VpLmMKQEAgLTAsMCArMSwxNTM3IEBACisvKgorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQorICogICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxNSBNaWNoYWwgVHJvam5hcmEgPE1pY2hhbC5Ucm9qbmFyYUBtaXJ0Lm5ldD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICogICBMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCisgKiAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKyAqCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsCisgKiAgIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGNvbWJpbmUgc3R1bm5lbCB3aXRoIGZyZWUgc29mdHdhcmUgcHJvZ3JhbXMgb3IKKyAqICAgbGlicmFyaWVzIHRoYXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTEdQTCBhbmQgd2l0aCBjb2RlIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3IKKyAqICAgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBjb2RlLCB3aXRoIHVuY2hhbmdlZCBsaWNlbnNlKS4gWW91IG1heSBjb3B5CisgKiAgIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBzeXN0ZW0gZm9sbG93aW5nIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBmb3IKKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4KKyAqCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZAorICogICB0byBncmFudCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uIGZvciB0aGVpciBtb2RpZmllZCB2ZXJzaW9uczsgaXQgaXMgdGhlaXIKKyAqICAgY2hvaWNlIHdoZXRoZXIgdG8gZG8gc28uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBnaXZlcyBwZXJtaXNzaW9uCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uCisgKiAgIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2hpY2ggY2FycmllcworICogICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b3R5cGVzLmgiCisjaW5jbHVkZSA8Y29tbWRsZy5oPgorI2luY2x1ZGUgPGNvbW1jdHJsLmg+CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxwc2FwaS5oPgorI2VuZGlmCisjaW5jbHVkZSAicmVzb3VyY2VzLmgiCisKKyNkZWZpbmUgTE9HX0xJTkVTIDEwMDAKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgU1RVTk5FTF9QTEFURk9STSAiV2luQ0UiCisjZWxzZQorI2lmZGVmIF9XSU42NAorI2RlZmluZSBTVFVOTkVMX1BMQVRGT1JNICJXaW42NCIKKyNlbHNlIC8qIE1TRE4gY2xhaW1zIHRoYXQgX1dJTjMyIGlzIGFsd2F5cyBkZWZpbmVkICovCisjZGVmaW5lIFNUVU5ORUxfUExBVEZPUk0gIldpbjMyIgorI2VuZGlmCisjZGVmaW5lIFNFUlZJQ0VfTkFNRSBURVhUKCJzdHVubmVsIikKKyNkZWZpbmUgU0VSVklDRV9ESVNQTEFZX05BTUUgVEVYVCgiU3R1bm5lbCBTU0wgd3JhcHBlciIpCisjZW5kaWYKKworLyogbWluZ3ctUGF0Y2hlcy0xODI1MDQ0IGlzIG1pc3NpbmcgaW4gRGViaWFuIFNxdWVlemUgKi8KK1dJTkJBU0VBUEkgQk9PTCBXSU5BUEkgQ2hlY2tUb2tlbk1lbWJlcnNoaXAoSEFORExFLCBQU0lELCBQQk9PTCk7CisKKy8qIHByb3RvdHlwZXMgKi8KK05PRVhQT1JUIEJPT0wgQ0FMTEJBQ0sgZW51bV93aW5kb3dzKEhXTkQsIExQQVJBTSk7CitOT0VYUE9SVCB2b2lkIGd1aV9jbWRsaW5lKCk7CitOT0VYUE9SVCBpbnQgaW5pdGlhbGl6ZV93aW5zb2NrKHZvaWQpOworTk9FWFBPUlQgaW50IGd1aV9sb29wKCk7CisKK05PRVhQT1JUIHZvaWQgQ0FMTEJBQ0sgdGltZXJfcHJvYyhIV05ELCBVSU5ULCBVSU5UX1BUUiwgRFdPUkQpOworTk9FWFBPUlQgTFJFU1VMVCBDQUxMQkFDSyB3aW5kb3dfcHJvYyhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7CitOT0VYUE9SVCBMUkVTVUxUIENBTExCQUNLIGFib3V0X3Byb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworTk9FWFBPUlQgTFJFU1VMVCBDQUxMQkFDSyBwYXNzX3Byb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworCitOT0VYUE9SVCB2b2lkIHNhdmVfbG9nKHZvaWQpOworTk9FWFBPUlQgdm9pZCB3aW5fbG9nKExQQ1RTVFIpOworTk9FWFBPUlQgaW50IHNhdmVfdGV4dF9maWxlKExQVFNUUiwgY2hhciAqKTsKK05PRVhQT1JUIHZvaWQgdXBkYXRlX2xvZ3Modm9pZCk7CitOT0VYUE9SVCBMUFRTVFIgbG9nX3R4dCh2b2lkKTsKKworTk9FWFBPUlQgdm9pZCBkYWVtb25fdGhyZWFkKHZvaWQgKik7CisKK05PRVhQT1JUIHZvaWQgdmFsaWRfY29uZmlnKHZvaWQpOworTk9FWFBPUlQgdm9pZCBpbnZhbGlkX2NvbmZpZyh2b2lkKTsKK05PRVhQT1JUIHZvaWQgdXBkYXRlX3BlZXJfbWVudSh2b2lkKTsKK05PRVhQT1JUIHZvaWQgdHJheV91cGRhdGUoY29uc3QgaW50KTsKK05PRVhQT1JUIHZvaWQgdHJheV9kZWxldGUodm9pZCk7CitOT0VYUE9SVCB2b2lkIGVycm9yX2JveChMUENUU1RSKTsKK05PRVhQT1JUIHZvaWQgZWRpdF9jb25maWcoSFdORCk7CitOT0VYUE9SVCBCT09MIGlzX2FkbWluKHZvaWQpOworCisvKiBOVCBTZXJ2aWNlIHJlbGF0ZWQgZnVuY3Rpb24gKi8KKyNpZm5kZWYgX1dJTjMyX1dDRQorTk9FWFBPUlQgaW50IHNlcnZpY2VfaW5pdGlhbGl6ZSh2b2lkKTsKK05PRVhQT1JUIGludCBzZXJ2aWNlX2luc3RhbGwodm9pZCk7CitOT0VYUE9SVCBpbnQgc2VydmljZV91bmluc3RhbGwodm9pZCk7CitOT0VYUE9SVCBpbnQgc2VydmljZV9zdGFydCh2b2lkKTsKK05PRVhQT1JUIGludCBzZXJ2aWNlX3N0b3Aodm9pZCk7CitOT0VYUE9SVCBpbnQgc2VydmljZV91c2VyKERXT1JEKTsKK05PRVhQT1JUIHZvaWQgV0lOQVBJIHNlcnZpY2VfbWFpbihEV09SRCwgTFBUU1RSICopOworTk9FWFBPUlQgdm9pZCBXSU5BUEkgY29udHJvbF9oYW5kbGVyKERXT1JEKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChfV0lOMzJfV0NFKSAqLworCisvKiBvdGhlciBmdW5jdGlvbnMgKi8KK05PRVhQT1JUIExQVFNUUiBnZXRfcGFyYW1zKCk7CisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgTElTVCB7CisgIHN0cnVjdCBMSVNUICpuZXh0OworICBzaXplX3QgbGVuOworICBUQ0hBUiB0eHRbMV07IC8qIHNpbmdsZSBjaGFyYWN0ZXIgZm9yIHRyYWlsaW5nICdcMCcgKi8KK30gKmhlYWQ9TlVMTCwgKnRhaWw9TlVMTDsKKworc3RhdGljIHVuc2lnbmVkIG51bWJlcl9vZl9zZWN0aW9ucz0wOworCitzdGF0aWMgSElOU1RBTkNFIGdoSW5zdDsKK3N0YXRpYyBIV05EIGVkaXRfaGFuZGxlPU5VTEw7CitzdGF0aWMgSE1FTlUgdHJheV9tZW51X2hhbmRsZT1OVUxMOworI2lmbmRlZiBfV0lOMzJfV0NFCitzdGF0aWMgSE1FTlUgbWFpbl9tZW51X2hhbmRsZT1OVUxMOworI2VuZGlmCitzdGF0aWMgSFdORCBod25kPU5VTEw7IC8qIG1haW4gd2luZG93IGhhbmRsZSAqLworI2lmZGVmIF9XSU4zMl9XQ0UKK3N0YXRpYyBIV05EIGNvbW1hbmRfYmFyX2hhbmRsZTsgLyogY29tbWFuZCBiYXIgaGFuZGxlICovCisjZW5kaWYKKyAgICAvKiB3aW4zMl9uYW1lIGlzIG5lZWRlZCBmb3IgYW55IGVycm9yX2JveCgpLCBtZXNzYWdlX2JveCgpLAorICAgICAqIGFuZCB0aGUgaW5pdGlhbCBtYWluIHdpbmRvdyB0aXRsZSAqLworc3RhdGljIFRDSEFSICp3aW4zMl9uYW1lPVRFWFQoInN0dW5uZWwgIikgVEVYVChTVFVOTkVMX1ZFUlNJT04pCisgICAgVEVYVCgiIG9uICIpIFRFWFQoU1RVTk5FTF9QTEFURk9STSkgVEVYVCgiIChub3QgY29uZmlndXJlZCkiKTsKKworI2lmbmRlZiBfV0lOMzJfV0NFCitzdGF0aWMgU0VSVklDRV9TVEFUVVMgc2VydmljZVN0YXR1czsKK3N0YXRpYyBTRVJWSUNFX1NUQVRVU19IQU5ETEUgc2VydmljZVN0YXR1c0hhbmRsZT0wOworI2RlZmluZSBTRVJWSUNFX0NPTlRST0xfVVNFUiAxMjgKKyNlbmRpZgorCitzdGF0aWMgQk9PTCB2aXNpYmxlPUZBTFNFOworc3RhdGljIEhBTkRMRSBtYWluX2luaXRpYWxpemVkPU5VTEw7IC8qIGdsb2JhbCBpbml0aWFsaXphdGlvbiBwZXJmb3JtZWQgKi8KK3N0YXRpYyBIQU5ETEUgY29uZmlnX3JlYWR5PU5VTEw7IC8qIHJlbG9hZCB3aXRob3V0IGEgdmFsaWQgY29uZmlndXJhdGlvbiAqLworc3RhdGljIExPTkcgbmV3X2xvZ3M9MDsKKworc3RhdGljIFVJX0RBVEEgKnVpX2RhdGE9TlVMTDsKKworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciAqY29uZmlnX2ZpbGU7CisgICAgdW5zaWduZWQgc2VydmljZToxLCBpbnN0YWxsOjEsIHVuaW5zdGFsbDoxLCBzdGFydDoxLCBzdG9wOjEsCisgICAgICAgIHF1aWV0OjEsIGV4aXQ6MSwgcmVsb2FkOjEsIHJlb3BlbjoxOworfSBjbWRsaW5lOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqLworCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIHRoaXNfaW5zdGFuY2UsIEhJTlNUQU5DRSBwcmV2X2luc3RhbmNlLAorI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgTFBXU1RSIGxwQ21kTGluZSwKKyNlbHNlCisgICAgICAgIExQU1RSIGxwQ21kTGluZSwKKyNlbmRpZgorICAgICAgICBpbnQgbkNtZFNob3cpIHsKKyAgICBUQ0hBUiBzdHVubmVsX2V4ZV9wYXRoW01BWF9QQVRIXTsKKyAgICBMUFRTVFIgYzsKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIExQVFNUUiBlcnJtc2c7CisjZW5kaWYKKworICAgICh2b2lkKXByZXZfaW5zdGFuY2U7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpbHBDbWRMaW5lOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKW5DbWRTaG93OyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworCisgICAgdGxzX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSAqLworICAgIGdoSW5zdD10aGlzX2luc3RhbmNlOworICAgIGd1aV9jbWRsaW5lKCk7IC8qIHNldHVwIGdsb2JhbCBjbWRsaW5lIHN0cnVjdHVyZSAqLworICAgIEdldE1vZHVsZUZpbGVOYW1lKDAsIHN0dW5uZWxfZXhlX3BhdGgsIE1BWF9QQVRIKTsKKworI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgLyogZmluZCBwcmV2aW91cyBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZXhlY3V0YWJsZSAqLworICAgIGlmKCFjbWRsaW5lLnNlcnZpY2UgJiYgIWNtZGxpbmUuaW5zdGFsbCAmJiAhY21kbGluZS51bmluc3RhbGwgJiYKKyAgICAgICAgICAgICFjbWRsaW5lLnJlbG9hZCAmJiAhY21kbGluZS5yZW9wZW4gJiYKKyAgICAgICAgICAgICFjbWRsaW5lLnN0YXJ0ICYmICFjbWRsaW5lLnN0b3ApIHsKKyAgICAgICAgRW51bVdpbmRvd3MoZW51bV93aW5kb3dzLCAoTFBBUkFNKXN0dW5uZWxfZXhlX3BhdGgpOworICAgICAgICBpZihjbWRsaW5lLmV4aXQpCisgICAgICAgICAgICByZXR1cm4gMDsgLyogaW4gY2FzZSBFbnVtV2luZG93cyBkaWRuJ3QgZmluZCBhIHByZXZpb3VzIGluc3RhbmNlICovCisgICAgfQorI2VuZGlmCisKKyAgICAvKiBzZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZW5naW5lIHBhdGggKi8KKyAgICBjPV90Y3NyY2hyKHN0dW5uZWxfZXhlX3BhdGgsIFRFWFQoJ1xcJykpOyAvKiBsYXN0IGJhY2tzbGFzaCAqLworICAgIGlmKGMpIC8qIGZvdW5kICovCisgICAgICAgIGNbMV09VEVYVCgnXDAnKTsgLyogdHJ1bmNhdGUgcHJvZ3JhbSBuYW1lICovCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBpZighU2V0Q3VycmVudERpcmVjdG9yeShzdHVubmVsX2V4ZV9wYXRoKSkgeworICAgICAgICBlcnJtc2c9c3RyX3RwcmludGYoVEVYVCgiQ2Fubm90IHNldCBkaXJlY3RvcnkgdG8gJXMiKSwKKyAgICAgICAgICAgIHN0dW5uZWxfZXhlX3BhdGgpOworICAgICAgICBtZXNzYWdlX2JveChlcnJtc2csIE1CX0lDT05FUlJPUik7CisgICAgICAgIHN0cl9mcmVlKGVycm1zZyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAgIF90cHV0ZW52KHN0cl90cHJpbnRmKFRFWFQoIk9QRU5TU0xfRU5HSU5FUz0lcyIpLCBzdHVubmVsX2V4ZV9wYXRoKSk7CisKKyAgICBpZihpbml0aWFsaXplX3dpbnNvY2soKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIGlmKGNtZGxpbmUuc2VydmljZSkgLyogIi1zZXJ2aWNlIiBtdXN0IGJlIHByb2Nlc3NlZCBiZWZvcmUgIi1pbnN0YWxsIiAqLworICAgICAgICByZXR1cm4gc2VydmljZV9pbml0aWFsaXplKCk7CisgICAgaWYoY21kbGluZS5pbnN0YWxsKQorICAgICAgICByZXR1cm4gc2VydmljZV9pbnN0YWxsKCk7CisgICAgaWYoY21kbGluZS51bmluc3RhbGwpCisgICAgICAgIHJldHVybiBzZXJ2aWNlX3VuaW5zdGFsbCgpOworICAgIGlmKGNtZGxpbmUuc3RhcnQpCisgICAgICAgIHJldHVybiBzZXJ2aWNlX3N0YXJ0KCk7CisgICAgaWYoY21kbGluZS5zdG9wKQorICAgICAgICByZXR1cm4gc2VydmljZV9zdG9wKCk7CisgICAgaWYoY21kbGluZS5yZWxvYWQpCisgICAgICAgIHJldHVybiBzZXJ2aWNlX3VzZXIoU0lHTkFMX1JFTE9BRF9DT05GSUcpOworICAgIGlmKGNtZGxpbmUucmVvcGVuKQorICAgICAgICByZXR1cm4gc2VydmljZV91c2VyKFNJR05BTF9SRU9QRU5fTE9HKTsKKyNlbmRpZgorICAgIHJldHVybiBndWlfbG9vcCgpOworfQorCisjaWZuZGVmIF9XSU4zMl9XQ0UKKworTk9FWFBPUlQgQk9PTCBDQUxMQkFDSyBlbnVtX3dpbmRvd3MoSFdORCBvdGhlcl93aW5kb3dfaGFuZGxlLCBMUEFSQU0gbFBhcmFtKSB7CisgICAgRFdPUkQgcGlkOworICAgIEhJTlNUQU5DRSBoSW5zdGFuY2U7CisgICAgSEFORExFIHByb2Nlc3NfaGFuZGxlOworICAgIFRDSEFSIHdpbmRvd19leGVfcGF0aFtNQVhfUEFUSF07CisgICAgTFBUU1RSIHN0dW5uZWxfZXhlX3BhdGg9KExQVFNUUilsUGFyYW07CisKKyAgICBpZighb3RoZXJfd2luZG93X2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaEluc3RhbmNlPShISU5TVEFOQ0UpR2V0V2luZG93TG9uZyhvdGhlcl93aW5kb3dfaGFuZGxlLCBHV0xfSElOU1RBTkNFKTsKKyAgICBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQob3RoZXJfd2luZG93X2hhbmRsZSwgJnBpZCk7CisgICAgcHJvY2Vzc19oYW5kbGU9T3BlblByb2Nlc3MoU1lOQ0hST05JWkV8ICAgICAgICAgLyogV2FpdEZvclNpbmdsZU9iamVjdCgpICovCisgICAgICAgIFBST0NFU1NfVEVSTUlOQVRFfCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlUHJvY2VzcygpICAgICovCisgICAgICAgIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT058UFJPQ0VTU19WTV9SRUFELCAgLyogR2V0TW9kdWxlRmlsZU5hbWVFeCgpICovCisgICAgICAgIEZBTFNFLCBwaWQpOworICAgIGlmKCFwcm9jZXNzX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYoIUdldE1vZHVsZUZpbGVOYW1lRXgocHJvY2Vzc19oYW5kbGUsCisgICAgICAgICAgICBoSW5zdGFuY2UsIHdpbmRvd19leGVfcGF0aCwgTUFYX1BBVEgpKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHByb2Nlc3NfaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmKF90Y3NjbXAoc3R1bm5lbF9leGVfcGF0aCwgd2luZG93X2V4ZV9wYXRoKSkgeworICAgICAgICBDbG9zZUhhbmRsZShwcm9jZXNzX2hhbmRsZSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZihjbWRsaW5lLmV4aXQpIHsKKyAgICAgICAgUG9zdE1lc3NhZ2Uob3RoZXJfd2luZG93X2hhbmRsZSwgV01fQ09NTUFORCwgSURNX0VYSVQsIDApOworICAgICAgICBpZihXYWl0Rm9yU2luZ2xlT2JqZWN0KHByb2Nlc3NfaGFuZGxlLCAzMDAwKT09V0FJVF9USU1FT1VUKSB7CisgICAgICAgICAgICBUZXJtaW5hdGVQcm9jZXNzKHByb2Nlc3NfaGFuZGxlLCAwKTsKKyAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QocHJvY2Vzc19oYW5kbGUsIDMwMDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2hvd1dpbmRvdyhvdGhlcl93aW5kb3dfaGFuZGxlLCBTV19TSE9XTk9STUFMKTsgLyogc2hvdyB3aW5kb3cgKi8KKyAgICAgICAgU2V0Rm9yZWdyb3VuZFdpbmRvdyhvdGhlcl93aW5kb3dfaGFuZGxlKTsgLyogYnJpbmcgb24gdG9wICovCisgICAgfQorICAgIENsb3NlSGFuZGxlKHByb2Nlc3NfaGFuZGxlKTsKKyAgICBleGl0KDApOworICAgIHJldHVybiBGQUxTRTsgLyogc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkICovCit9CisKKyNlbmRpZgorCitOT0VYUE9SVCB2b2lkIGd1aV9jbWRsaW5lKCkgeworICAgIGNoYXIgKmxpbmUsICpjLCAqb3B0OworCisgICAgbGluZT10c3RyMnN0cihnZXRfcGFyYW1zKCkpOworICAgIG1lbXNldCgmY21kbGluZSwgMCwgc2l6ZW9mIGNtZGxpbmUpOworICAgIGM9bGluZTsKKyAgICB3aGlsZSgqYyAmJiAoKmM9PScvJyB8fCAqYz09Jy0nKSkgeworICAgICAgICBvcHQ9YzsKKyAgICAgICAgd2hpbGUoKmMgJiYgIWlzc3BhY2UoKmMpKSAvKiBza2lwIG5vbi13aGl0ZXNwYWNlcyAqLworICAgICAgICAgICAgYysrOworICAgICAgICB3aGlsZSgqYyAmJiBpc3NwYWNlKCpjKSkgLyogcmVwbGFjZSB3aGl0ZXNwYWNlcyB3aXRoICdcMCcgKi8KKyAgICAgICAgICAgICpjKys9J1wwJzsKKyAgICAgICAgaWYoIXN0cmNhc2VjbXAob3B0KzEsICJpbnN0YWxsIikpCisgICAgICAgICAgICBjbWRsaW5lLmluc3RhbGw9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgInVuaW5zdGFsbCIpKQorICAgICAgICAgICAgY21kbGluZS51bmluc3RhbGw9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgInJlbG9hZCIpKQorICAgICAgICAgICAgY21kbGluZS5yZWxvYWQ9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgInJlb3BlbiIpKQorICAgICAgICAgICAgY21kbGluZS5yZW9wZW49MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgInN0YXJ0IikpCisgICAgICAgICAgICBjbWRsaW5lLnN0YXJ0PTE7CisgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAob3B0KzEsICJzdG9wIikpCisgICAgICAgICAgICBjbWRsaW5lLnN0b3A9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgInNlcnZpY2UiKSkKKyAgICAgICAgICAgIGNtZGxpbmUuc2VydmljZT0xOworICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKG9wdCsxLCAicXVpZXQiKSkKKyAgICAgICAgICAgIGNtZGxpbmUucXVpZXQ9MTsKKyAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChvcHQrMSwgImV4aXQiKSkKKyAgICAgICAgICAgIGNtZGxpbmUuZXhpdD0xOworICAgICAgICBlbHNlIHsgLyogYW4gb3B0aW9uIHRvIGJlIHByb2Nlc3NlZCBpbiBvcHRpb25zLmMgKi8KKyAgICAgICAgICAgIGM9b3B0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoKmM9PSdcIicpIHsgLyogdGhlIG9wdGlvbiBpcyB3aXRoaW4gZG91YmxlIHF1b3RlcyAqLworICAgICAgICBjKys7CisgICAgICAgIG9wdD1jOworICAgICAgICB3aGlsZSgqYyAmJiAqYyE9J1wiJykgLyogZmluZCB0aGUgY2xvc2luZyBkb3VibGUgcXVvdGUgKi8KKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgKmM9J1wwJzsKKyAgICB9IGVsc2UgLyogdGhlIG9wdGlvbiBpcyBzaW1wbHkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KKyAgICAgICAgb3B0PWM7CisgICAgY21kbGluZS5jb25maWdfZmlsZT0qb3B0ID8gc3RyX2R1cChvcHQpIDogTlVMTDsKKyAgICBzdHJfZnJlZShsaW5lKTsKK30KKworLyogdHJ5IHRvIGxvYWQgd2luc29jazIgcmVzb2x2ZXIgZnVuY3Rpb25zIGZyb20gYSBzcGVjaWZpZWQgZGxsIG5hbWUgKi8KK05PRVhQT1JUIGludCBpbml0aWFsaXplX3dpbnNvY2soKSB7CisgICAgc3RhdGljIHN0cnVjdCBXU0FEYXRhIHdzYV9zdGF0ZTsKKworICAgIGlmKFdTQVN0YXJ0dXAoTUFLRVdPUkQoIDIsIDIgKSwgJndzYV9zdGF0ZSkpIHsKKyAgICAgICAgbWVzc2FnZV9ib3goVEVYVCgiRmFpbGVkIHRvIGluaXRpYWxpemUgd2luc29jayIpLCBNQl9JQ09ORVJST1IpOworICAgICAgICByZXR1cm4gMTsgLyogZXJyb3IgKi8KKyAgICB9CisgICAgcmVzb2x2ZXJfaW5pdCgpOworICAgIHJldHVybiAwOyAvKiBJUHY0IGRldGVjdGVkIC0+IE9LICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdVSSB0aHJlYWQgKi8KKworTk9FWFBPUlQgaW50IGd1aV9sb29wKCkgeworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICBXTkRDTEFTUyB3YzsKKyNlbHNlCisgICAgV05EQ0xBU1NFWCB3YzsKKyNlbmRpZgorICAgIE1TRyBtc2c7CisgICAgTFBUU1RSIGNsYXNzbmFtZT1URVhUKCJzdHVubmVsX21haW5fd2luZG93X2NsYXNzIik7CisKKyAgICAvKiByZWdpc3RlciB0aGUgY2xhc3MgKi8KKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIHdjLmNiU2l6ZT1zaXplb2Ygd2M7CisjZW5kaWYKKyAgICB3Yy5zdHlsZT1DU19WUkVEUkFXfENTX0hSRURSQVc7CisgICAgd2MubHBmblduZFByb2M9d2luZG93X3Byb2M7CisgICAgd2MuY2JDbHNFeHRyYT13Yy5jYlduZEV4dHJhPTA7CisgICAgd2MuaEluc3RhbmNlPWdoSW5zdDsKKyAgICB3Yy5oSWNvbj1Mb2FkSWNvbihnaEluc3QsIE1BS0VJTlRSRVNPVVJDRShJRElfU1RVTk5FTF9NQUlOKSk7CisgICAgd2MuaEN1cnNvcj1Mb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7CisgICAgd2MuaGJyQmFja2dyb3VuZD0oSEJSVVNIKShDT0xPUl9XSU5ET1crMSk7CisgICAgd2MubHBzek1lbnVOYW1lPU5VTEw7CisgICAgd2MubHBzekNsYXNzTmFtZT1jbGFzc25hbWU7CisjaWZkZWYgX1dJTjMyX1dDRQorICAgIFJlZ2lzdGVyQ2xhc3MoJndjKTsKKyNlbHNlCisgICAgLyogbG9hZCAxNngxNiBpY29uICovCisgICAgd2MuaEljb25TbT1Mb2FkSW1hZ2UoZ2hJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoSURJX1NUVU5ORUxfTUFJTiksIElNQUdFX0lDT04sCisgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTTUlDT04pLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU01JQ09OKSwgMCk7CisgICAgUmVnaXN0ZXJDbGFzc0V4KCZ3Yyk7CisjZW5kaWYKKworICAgIC8qIGNyZWF0ZSBtYWluIHdpbmRvdyAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICBod25kPUNyZWF0ZVdpbmRvdyhjbGFzc25hbWUsIHdpbjMyX25hbWUsIDAsCisgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCisgICAgICAgIE5VTEwsIE5VTEwsIGdoSW5zdCwgTlVMTCk7CisjZWxzZQorICAgIG1haW5fbWVudV9oYW5kbGU9TG9hZE1lbnUoZ2hJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoSURNX01BSU5NRU5VKSk7CisgICAgaWYobWFpbl9tZW51X2hhbmRsZSAmJiBjbWRsaW5lLnNlcnZpY2UpIHsKKyAgICAgICAgLyogYmxvY2sgdW5zYWZlIG9wZXJhdGlvbnMgaW4gdGhlIHNlcnZpY2UgbW9kZSAqLworICAgICAgICBFbmFibGVNZW51SXRlbShtYWluX21lbnVfaGFuZGxlLCBJRE1fRURJVF9DT05GSUcsIE1GX0dSQVlFRCk7CisgICAgICAgIEVuYWJsZU1lbnVJdGVtKG1haW5fbWVudV9oYW5kbGUsIElETV9TQVZFX0xPRywgTUZfR1JBWUVEKTsKKyAgICB9CisgICAgaHduZD1DcmVhdGVXaW5kb3coY2xhc3NuYW1lLCB3aW4zMl9uYW1lLCBXU19USUxFRFdJTkRPVywKKyAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKKyAgICAgICAgTlVMTCwgbWFpbl9tZW51X2hhbmRsZSwgZ2hJbnN0LCBOVUxMKTsKKyNlbmRpZgorCisgICAgLyogYXV0by1yZXNldCwgbm9uLXNpZ25hbGVkIGV2ZW50cyAqLworICAgIG1haW5faW5pdGlhbGl6ZWQ9Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICBjb25maWdfcmVhZHk9Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICAvKiBod25kIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSBfYmVnaW50aHJlYWQoKSAqLworICAgIF9iZWdpbnRocmVhZChkYWVtb25fdGhyZWFkLCBERUZBVUxUX1NUQUNLX1NJWkUsIE5VTEwpOworICAgIFdhaXRGb3JTaW5nbGVPYmplY3QobWFpbl9pbml0aWFsaXplZCwgSU5GSU5JVEUpOworICAgIC8qIGxvZ2dpbmcgc3Vic3lzdGVtIGlzIG5vdyBhdmFpbGFibGUgKi8KKworICAgIC8qIHNldHVwIHBlcmlvZGljIGV2ZW50IHRvIHRyaWdnZXIgdXBkYXRlX2xvZ3MoKSAqLworICAgIFNldFRpbWVyKE5VTEwsIDAsIDEwMDAsIHRpbWVyX3Byb2MpOyAvKiBydW4gY2FsbGJhY2sgb25jZSBwZXIgc2Vjb25kICovCisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJHVUkgbWVzc2FnZSBsb29wIGluaXRpYWxpemVkIik7CisgICAgZm9yKDs7KQorICAgICAgICBzd2l0Y2goR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgeworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgaW9lcnJvcigiR2V0TWVzc2FnZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNfbG9nKExPR19ERUJVRywgIkdVSSBtZXNzYWdlIGxvb3AgdGVybWluYXRlZCIpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpbXNnLndQYXJhbTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisgICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgICAgIH0KK30KKworTk9FWFBPUlQgdm9pZCBDQUxMQkFDSyB0aW1lcl9wcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFVJTlRfUFRSIGlkLCBEV09SRCB0KSB7CisgICAgKHZvaWQpaHduZDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICAodm9pZCltc2c7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpaWQ7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisgICAgKHZvaWQpdDsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKyAgICBpZih2aXNpYmxlKQorICAgICAgICB1cGRhdGVfbG9ncygpOworICAgIHRyYXlfdXBkYXRlKG51bV9jbGllbnRzKTsgLyogbmVlZGVkIHdoZW4gZXhwbG9yZXIuZXhlIChyZSlzdGFydHMgKi8KK30KKworTk9FWFBPUlQgTFJFU1VMVCBDQUxMQkFDSyB3aW5kb3dfcHJvYyhIV05EIG1haW5fd2luZG93X2hhbmRsZSwKKyAgICAgICAgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSB7CisgICAgUE9JTlQgcHQ7CisgICAgUkVDVCByZWN0OworICAgIFBBSU5UU1RSVUNUIHBzOworICAgIFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbjsKKyAgICB1bnNpZ25lZCBzZWN0aW9uX251bWJlcjsKKyAgICBMUFRTVFIgdHh0OworCisjaWYgMAorICAgIHN3aXRjaChtZXNzYWdlKSB7CisgICAgY2FzZSBXTV9DVExDT0xPUlNUQVRJQzoKKyAgICBjYXNlIFdNX1RJTUVSOgorICAgIGNhc2UgV01fTE9HOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzX2xvZyhMT0dfREVCVUcsICJXaW5kb3cgbWVzc2FnZTogMHgleCgweCVoeCwweCVseCkiLAorICAgICAgICAgICAgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyNlbmRpZgorICAgIHN3aXRjaChtZXNzYWdlKSB7CisgICAgY2FzZSBXTV9DUkVBVEU6CisjaWZkZWYgX1dJTjMyX1dDRQorICAgICAgICAvKiBjcmVhdGUgY29tbWFuZCBiYXIgKi8KKyAgICAgICAgY29tbWFuZF9iYXJfaGFuZGxlPUNvbW1hbmRCYXJfQ3JlYXRlKGdoSW5zdCwgbWFpbl93aW5kb3dfaGFuZGxlLCAxKTsKKyAgICAgICAgaWYoIWNvbW1hbmRfYmFyX2hhbmRsZSkKKyAgICAgICAgICAgIGVycm9yX2JveChURVhUKCJDb21tYW5kQmFyX0NyZWF0ZSIpKTsKKyAgICAgICAgaWYoIUNvbW1hbmRCYXJfSW5zZXJ0TWVudWJhcihjb21tYW5kX2Jhcl9oYW5kbGUsIGdoSW5zdCwgSURNX01BSU5NRU5VLCAwKSkKKyAgICAgICAgICAgIGVycm9yX2JveChURVhUKCJDb21tYW5kQmFyX0luc2VydE1lbnViYXIiKSk7CisgICAgICAgIGlmKCFDb21tYW5kQmFyX0FkZEFkb3JubWVudHMoY29tbWFuZF9iYXJfaGFuZGxlLCAwLCAwKSkKKyAgICAgICAgICAgIGVycm9yX2JveChURVhUKCJDb21tYW5kQmFyX0FkZEFkb3JubWVudHMiKSk7CisjZW5kaWYKKworICAgICAgICAvKiBjcmVhdGUgY2hpbGQgZWRpdCB3aW5kb3cgKi8KKyAgICAgICAgZWRpdF9oYW5kbGU9Q3JlYXRlV2luZG93RXgoV1NfRVhfU1RBVElDRURHRSwgVEVYVCgiRURJVCIpLCBOVUxMLAorICAgICAgICAgICAgV1NfQ0hJTER8V1NfVklTSUJMRXxXU19IU0NST0xMfFdTX1ZTQ1JPTEx8RVNfTVVMVElMSU5FfEVTX1JFQURPTkxZLAorICAgICAgICAgICAgMCwgMCwgMCwgMCwgbWFpbl93aW5kb3dfaGFuZGxlLCAoSE1FTlUpSURFX0VESVQsIGdoSW5zdCwgTlVMTCk7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgU2VuZE1lc3NhZ2UoZWRpdF9oYW5kbGUsIFdNX1NFVEZPTlQsCisgICAgICAgICAgICAoV1BBUkFNKUNyZWF0ZUZvbnQoLTEyLCAwLCAwLCAwLCBGV19ET05UQ0FSRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwKKyAgICAgICAgICAgICAgICBERUZBVUxUX0NIQVJTRVQsIE9VVF9SQVNURVJfUFJFQ0lTLCBDTElQX0RFRkFVTFRfUFJFQ0lTLAorICAgICAgICAgICAgICAgIFBST09GX1FVQUxJVFksIERFRkFVTFRfUElUQ0gsIFRFWFQoIkNvdXJpZXIiKSksCisgICAgICAgICAgICBNQUtFTFBBUkFNKEZBTFNFLCAwKSk7IC8qIG5vIG5lZWQgdG8gcmVkcmF3IHJpZ2h0IG5vdyAqLworI2VuZGlmCisgICAgICAgIC8qIE5PVEU6IHRoZXJlJ3Mgbm8gcmV0dXJuIHN0YXRlbWVudCBoZXJlIC0+IHByb2NlZWRpbmcgd2l0aCByZXNpemUgKi8KKworICAgIGNhc2UgV01fU0laRToKKyAgICAgICAgR2V0Q2xpZW50UmVjdChtYWluX3dpbmRvd19oYW5kbGUsICZyZWN0KTsKKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgICAgIE1vdmVXaW5kb3coZWRpdF9oYW5kbGUsIDAsIENvbW1hbmRCYXJfSGVpZ2h0KGNvbW1hbmRfYmFyX2hhbmRsZSksCisgICAgICAgICAgICByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbS1Db21tYW5kQmFyX0hlaWdodChjb21tYW5kX2Jhcl9oYW5kbGUpLAorICAgICAgICAgICAgVFJVRSk7CisgICAgICAgIFNlbmRNZXNzYWdlKGNvbW1hbmRfYmFyX2hhbmRsZSwgVEJfQVVUT1NJWkUsIDBMLCAwTCk7CisgICAgICAgIENvbW1hbmRCYXJfQWxpZ25BZG9ybm1lbnRzKGNvbW1hbmRfYmFyX2hhbmRsZSk7CisjZWxzZQorICAgICAgICBNb3ZlV2luZG93KGVkaXRfaGFuZGxlLCAwLCAwLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgVFJVRSk7CisjZW5kaWYKKyAgICAgICAgVXBkYXRlV2luZG93KGVkaXRfaGFuZGxlKTsKKyAgICAgICAgLyogQ29tbWFuZEJhcl9TaG93KGNvbW1hbmRfYmFyX2hhbmRsZSwgVFJVRSk7ICovCisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9TRVRGT0NVUzoKKyAgICAgICAgU2V0Rm9jdXMoZWRpdF9oYW5kbGUpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fUEFJTlQ6CisgICAgICAgIEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKKyAgICAgICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0NMT1NFOgorICAgICAgICBTaG93V2luZG93KG1haW5fd2luZG93X2hhbmRsZSwgU1dfSElERSk7CisgICAgICAgIHJldHVybiAwOworCisjaWZkZWYgV01fU0hPV1dJTkRPVworICAgIGNhc2UgV01fU0hPV1dJTkRPVzoKKyAgICAgICAgdmlzaWJsZT0oQk9PTCl3UGFyYW07CisjZWxzZSAvKiB0aGlzIHdvcmtzIGZvciBQaWVycmUgRGVsYWFnZSwgYnV0IG5vdCBmb3IgbWUuLi4gKi8KKyAgICBjYXNlIFdNX1dJTkRPV1BPU0NIQU5HRUQ6CisgICAgICAgIHZpc2libGU9SXNXaW5kb3dWaXNpYmxlKG1haW5fd2luZG93X2hhbmRsZSk7CisjZW5kaWYKKyAgICAgICAgaWYodHJheV9tZW51X2hhbmRsZSkKKyAgICAgICAgICAgIENoZWNrTWVudUl0ZW0odHJheV9tZW51X2hhbmRsZSwgSURNX1NIT1dfTE9HLAorICAgICAgICAgICAgICAgIHZpc2libGUgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKTsKKyAgICAgICAgaWYodmlzaWJsZSkKKyAgICAgICAgICAgIHVwZGF0ZV9sb2dzKCk7CisjaWZkZWYgV01fU0hPV1dJTkRPVworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIGJyZWFrOyAvKiBwcm9jZWVkIHRvIERlZldpbmRvd1Byb2MoKSAqLworI2VuZGlmCisKKyAgICBjYXNlIFdNX0RFU1RST1k6CisjaWZkZWYgX1dJTjMyX1dDRQorICAgICAgICBDb21tYW5kQmFyX0Rlc3Ryb3koY29tbWFuZF9iYXJfaGFuZGxlKTsKKyNlbHNlCisgICAgICAgIGlmKG1haW5fbWVudV9oYW5kbGUpIHsKKyAgICAgICAgICAgIGlmKCFEZXN0cm95TWVudShtYWluX21lbnVfaGFuZGxlKSkKKyAgICAgICAgICAgICAgICBpb2Vycm9yKCJEZXN0cm95TWVudSIpOworICAgICAgICAgICAgbWFpbl9tZW51X2hhbmRsZT1OVUxMOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdHJheV9kZWxldGUoKTsgLyogcmVtb3ZlIHRoZSB0YXNrYmFyayBpY29uIGlmIGV4aXN0cyAqLworICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgICBpZih3UGFyYW0+PUlETV9QRUVSX01FTlUgJiYgd1BhcmFtPElETV9QRUVSX01FTlUrbnVtYmVyX29mX3NlY3Rpb25zKSB7CisgICAgICAgICAgICBmb3Ioc2VjdGlvbj1zZXJ2aWNlX29wdGlvbnMubmV4dCwgc2VjdGlvbl9udW1iZXI9MDsKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiAmJiB3UGFyYW0hPUlETV9QRUVSX01FTlUrc2VjdGlvbl9udW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb249c2VjdGlvbi0+bmV4dCwgKytzZWN0aW9uX251bWJlcikKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZighc2VjdGlvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmKHNhdmVfdGV4dF9maWxlKHNlY3Rpb24tPmZpbGUsIHNlY3Rpb24tPmNoYWluKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgICAgICAgICAgaWYobWFpbl9tZW51X2hhbmRsZSkKKyAgICAgICAgICAgICAgICBDaGVja01lbnVJdGVtKG1haW5fbWVudV9oYW5kbGUsIHdQYXJhbSwgTUZfQ0hFQ0tFRCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKHRyYXlfbWVudV9oYW5kbGUpCisgICAgICAgICAgICAgICAgQ2hlY2tNZW51SXRlbSh0cmF5X21lbnVfaGFuZGxlLCB3UGFyYW0sIE1GX0NIRUNLRUQpOworICAgICAgICAgICAgbWVzc2FnZV9ib3goc2VjdGlvbi0+aGVscCwgTUJfSUNPTklORk9STUFUSU9OKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBJRE1fQUJPVVQ6CisgICAgICAgICAgICBEaWFsb2dCb3goZ2hJbnN0LCBURVhUKCJBYm91dEJveCIpLCBtYWluX3dpbmRvd19oYW5kbGUsCisgICAgICAgICAgICAgICAgKERMR1BST0MpYWJvdXRfcHJvYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRE1fU0hPV19MT0c6CisgICAgICAgICAgICBpZih2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhtYWluX3dpbmRvd19oYW5kbGUsIFNXX0hJREUpOyAvKiBoaWRlIHdpbmRvdyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTaG93V2luZG93KG1haW5fd2luZG93X2hhbmRsZSwgU1dfU0hPV05PUk1BTCk7IC8qIHNob3cgd2luZG93ICovCisgICAgICAgICAgICAgICAgU2V0Rm9yZWdyb3VuZFdpbmRvdyhtYWluX3dpbmRvd19oYW5kbGUpOyAvKiBicmluZyBvbiB0b3AgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElETV9DTE9TRToKKyAgICAgICAgICAgIFNob3dXaW5kb3cobWFpbl93aW5kb3dfaGFuZGxlLCBTV19ISURFKTsgLyogaGlkZSB3aW5kb3cgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElETV9FWElUOgorICAgICAgICAgICAgaWYobnVtX2NsaWVudHM+PTApIC8qIHNpZ25hbF9waXBlIGlzIGFjdGl2ZSAqLworICAgICAgICAgICAgICAgIHNpZ25hbF9wb3N0KFNJR05BTF9URVJNSU5BVEUpOworICAgICAgICAgICAgRGVzdHJveVdpbmRvdyhtYWluX3dpbmRvd19oYW5kbGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURNX1NBVkVfTE9HOgorICAgICAgICAgICAgaWYoIWNtZGxpbmUuc2VydmljZSkgLyogc2VjdXJpdHkgKi8KKyAgICAgICAgICAgICAgICBzYXZlX2xvZygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURNX0VESVRfQ09ORklHOgorI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgICAgICAgICBpZighY21kbGluZS5zZXJ2aWNlKSAvKiBzZWN1cml0eSAqLworICAgICAgICAgICAgICAgIGVkaXRfY29uZmlnKG1haW5fd2luZG93X2hhbmRsZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElETV9SRUxPQURfQ09ORklHOgorICAgICAgICAgICAgaWYobnVtX2NsaWVudHM+PTApIC8qIHNpZ25hbF9waXBlIGlzIGFjdGl2ZSAqLworICAgICAgICAgICAgICAgIHNpZ25hbF9wb3N0KFNJR05BTF9SRUxPQURfQ09ORklHKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTZXRFdmVudChjb25maWdfcmVhZHkpOyAvKiB1bmxvY2sgZGFlbW9uX3RocmVhZCgpICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRE1fUkVPUEVOX0xPRzoKKyAgICAgICAgICAgIHNpZ25hbF9wb3N0KFNJR05BTF9SRU9QRU5fTE9HKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElETV9NQU5QQUdFOgorI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgICAgICAgICBpZighY21kbGluZS5zZXJ2aWNlKSAvKiBzZWN1cml0eSAqLworICAgICAgICAgICAgICAgIFNoZWxsRXhlY3V0ZShtYWluX3dpbmRvd19oYW5kbGUsIFRFWFQoIm9wZW4iKSwKKyAgICAgICAgICAgICAgICAgICAgVEVYVCgic3R1bm5lbC5odG1sIiksIE5VTEwsIE5VTEwsIFNXX1NIT1dOT1JNQUwpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRE1fSE9NRVBBR0U6CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgICAgIGlmKCFjbWRsaW5lLnNlcnZpY2UpIC8qIHNlY3VyaXR5ICovCisgICAgICAgICAgICAgICAgU2hlbGxFeGVjdXRlKG1haW5fd2luZG93X2hhbmRsZSwgVEVYVCgib3BlbiIpLAorICAgICAgICAgICAgICAgICAgICBURVhUKCJodHRwOi8vd3d3LnN0dW5uZWwub3JnLyIpLCBOVUxMLCBOVUxMLCBTV19TSE9XTk9STUFMKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX1NZU1RSQVk6IC8qIGEgdGFza2JhciBldmVudCAqLworICAgICAgICBzd2l0Y2gobFBhcmFtKSB7CisjaWZkZWYgX1dJTjMyX1dDRQorICAgICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOiAvKiBubyByaWdodCBtb3VzZSBidXR0b24gb24gV2luZG93cyBDRSAqLworICAgICAgICAgICAgR2V0V2luZG93UmVjdChHZXREZXNrdG9wV2luZG93KCksICZyZWN0KTsgLyogbm8gY3Vyc29yIHBvc2l0aW9uICovCisgICAgICAgICAgICBwdC54PXJlY3QucmlnaHQ7CisgICAgICAgICAgICBwdC55PXJlY3QuYm90dG9tLTI1OworI2Vsc2UKKyAgICAgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoKKyAgICAgICAgICAgIEdldEN1cnNvclBvcygmcHQpOworI2VuZGlmCisgICAgICAgICAgICBTZXRGb3JlZ3JvdW5kV2luZG93KG1haW5fd2luZG93X2hhbmRsZSk7CisgICAgICAgICAgICBpZih0cmF5X21lbnVfaGFuZGxlKQorICAgICAgICAgICAgICAgIFRyYWNrUG9wdXBNZW51RXgoR2V0U3ViTWVudSh0cmF5X21lbnVfaGFuZGxlLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgVFBNX0JPVFRPTUFMSUdOLCBwdC54LCBwdC55LCBtYWluX3dpbmRvd19oYW5kbGUsIE5VTEwpOworICAgICAgICAgICAgUG9zdE1lc3NhZ2UobWFpbl93aW5kb3dfaGFuZGxlLCBXTV9OVUxMLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzogLyogc3dpdGNoIGxvZyB3aW5kb3cgdmlzaWJpbGl0eSAqLworICAgICAgICAgICAgaWYodmlzaWJsZSkgeworICAgICAgICAgICAgICAgIFNob3dXaW5kb3cobWFpbl93aW5kb3dfaGFuZGxlLCBTV19ISURFKTsgLyogaGlkZSB3aW5kb3cgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhtYWluX3dpbmRvd19oYW5kbGUsIFNXX1NIT1dOT1JNQUwpOyAvKiBzaG93IHdpbmRvdyAqLworICAgICAgICAgICAgICAgIFNldEZvcmVncm91bmRXaW5kb3cobWFpbl93aW5kb3dfaGFuZGxlKTsgLyogYnJpbmcgb24gdG9wICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9WQUxJRF9DT05GSUc6CisgICAgICAgIHZhbGlkX2NvbmZpZygpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fSU5WQUxJRF9DT05GSUc6CisgICAgICAgIGludmFsaWRfY29uZmlnKCk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9MT0c6CisgICAgICAgIHR4dD0oTFBUU1RSKXdQYXJhbTsKKyAgICAgICAgd2luX2xvZyh0eHQpOworICAgICAgICBzdHJfZnJlZSh0eHQpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fTkVXX0NIQUlOOgorI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgICAgIGlmKG1haW5fbWVudV9oYW5kbGUpCisgICAgICAgICAgICBFbmFibGVNZW51SXRlbShtYWluX21lbnVfaGFuZGxlLCBJRE1fUEVFUl9NRU5VK3dQYXJhbSwgTUZfRU5BQkxFRCk7CisjZW5kaWYKKyAgICAgICAgaWYodHJheV9tZW51X2hhbmRsZSkKKyAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtKHRyYXlfbWVudV9oYW5kbGUsIElETV9QRUVSX01FTlUrd1BhcmFtLCBNRl9FTkFCTEVEKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0NMSUVOVFM6CisgICAgICAgIHRyYXlfdXBkYXRlKChpbnQpd1BhcmFtKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MobWFpbl93aW5kb3dfaGFuZGxlLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKK05PRVhQT1JUIExSRVNVTFQgQ0FMTEJBQ0sgYWJvdXRfcHJvYyhIV05EIGRpYWxvZ19oYW5kbGUsIFVJTlQgbWVzc2FnZSwKKyAgICAgICAgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkgeworICAgICh2b2lkKWxQYXJhbTsgLyogc2tpcCB3YXJuaW5nIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIgKi8KKworICAgIHN3aXRjaChtZXNzYWdlKSB7CisgICAgICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgICAgICBzd2l0Y2god1BhcmFtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJRE9LOgorICAgICAgICAgICAgICAgIGNhc2UgSURDQU5DRUw6CisgICAgICAgICAgICAgICAgICAgIEVuZERpYWxvZyhkaWFsb2dfaGFuZGxlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworTk9FWFBPUlQgTFJFU1VMVCBDQUxMQkFDSyBwYXNzX3Byb2MoSFdORCBkaWFsb2dfaGFuZGxlLCBVSU5UIG1lc3NhZ2UsCisgICAgICAgIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pIHsKKyAgICBMUFRTVFIgdGl0bGViYXI7CisgICAgdW5pb24geworICAgICAgICBUQ0hBUiB0eHRbUEVNX0JVRlNJWkVdOworICAgICAgICBXT1JEIGxlbjsKKyAgICB9IHBhc3NfZGlhbG9nOworICAgIFdPUkQgcGFzc19sZW47CisgICAgY2hhciogcGFzc190eHQ7CisgICAgTFBUU1RSIGtleV9maWxlX25hbWU7CisKKyAgICBzd2l0Y2gobWVzc2FnZSkgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgLyogc2V0IHRoZSBkZWZhdWx0IHB1c2ggYnV0dG9uIHRvICJDYW5jZWwiICovCisgICAgICAgIFNlbmRNZXNzYWdlKGRpYWxvZ19oYW5kbGUsIERNX1NFVERFRklELCAoV1BBUkFNKUlEQ0FOQ0VMLCAoTFBBUkFNKTApOworCisgICAgICAgIGtleV9maWxlX25hbWU9c3RyMnRzdHIodWlfZGF0YS0+c2VjdGlvbi0+a2V5KTsKKyAgICAgICAgdGl0bGViYXI9c3RyX3RwcmludGYoVEVYVCgiUHJpdmF0ZSBrZXk6ICVzIiksIGtleV9maWxlX25hbWUpOworICAgICAgICBzdHJfZnJlZShrZXlfZmlsZV9uYW1lKTsKKyAgICAgICAgU2V0V2luZG93VGV4dChkaWFsb2dfaGFuZGxlLCB0aXRsZWJhcik7CisgICAgICAgIHN0cl9mcmVlKHRpdGxlYmFyKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgIC8qIHNldCB0aGUgZGVmYXVsdCBwdXNoIGJ1dHRvbiB0byAiT0siIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRleHQgKi8KKyAgICAgICAgaWYoSElXT1JEKHdQYXJhbSk9PUVOX0NIQU5HRSAmJiBMT1dPUkQod1BhcmFtKT09SURFX1BBU1NFRElUKQorICAgICAgICAgICAgU2VuZE1lc3NhZ2UoZGlhbG9nX2hhbmRsZSwgRE1fU0VUREVGSUQsIChXUEFSQU0pSURPSywgKExQQVJBTSkwKTsKKyAgICAgICAgc3dpdGNoKHdQYXJhbSkgeworICAgICAgICBjYXNlIElET0s6CisgICAgICAgICAgICAvKiBnZXQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgICAgIHBhc3NfbGVuPShXT1JEKVNlbmREbGdJdGVtTWVzc2FnZShkaWFsb2dfaGFuZGxlLAorICAgICAgICAgICAgICAgIElERV9QQVNTRURJVCwgRU1fTElORUxFTkdUSCwgKFdQQVJBTSkwLCAoTFBBUkFNKTApOworICAgICAgICAgICAgaWYoIXBhc3NfbGVuIHx8IHBhc3NfbGVuPj1QRU1fQlVGU0laRSkgeworICAgICAgICAgICAgICAgIEVuZERpYWxvZyhkaWFsb2dfaGFuZGxlLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwdXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGludG8gZmlyc3Qgd29yZCBvZiBidWZmZXIgKi8KKyAgICAgICAgICAgIHBhc3NfZGlhbG9nLmxlbj1wYXNzX2xlbjsKKworICAgICAgICAgICAgLyogZ2V0IHRoZSBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoZGlhbG9nX2hhbmRsZSwgSURFX1BBU1NFRElULCBFTV9HRVRMSU5FLAorICAgICAgICAgICAgICAgIChXUEFSQU0pMCAvKiBsaW5lIDAgKi8sIChMUEFSQU0pcGFzc19kaWFsb2cudHh0KTsKKyAgICAgICAgICAgIHBhc3NfZGlhbG9nLnR4dFtwYXNzX2xlbl09J1wwJzsgLyogbnVsbC10ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCisgICAgICAgICAgICAvKiBjb252ZXJ0IGlucHV0IHBhc3N3b3JkIHRvIFVURi04IHN0cmluZyAoYXMgdWlfZGF0YS0+cGFzcykgKi8KKyAgICAgICAgICAgIHBhc3NfdHh0PXRzdHIyc3RyKHBhc3NfZGlhbG9nLnR4dCk7CisgICAgICAgICAgICBzdHJjcHkodWlfZGF0YS0+cGFzcywgcGFzc190eHQpOworICAgICAgICAgICAgc3RyX2ZyZWUocGFzc190eHQpOworCisgICAgICAgICAgICBFbmREaWFsb2coZGlhbG9nX2hhbmRsZSwgVFJVRSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIElEQ0FOQ0VMOgorICAgICAgICAgICAgRW5kRGlhbG9nKGRpYWxvZ19oYW5kbGUsIEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGxQYXJhbSk7Cit9CisKK2ludCBwYXNzd2RfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICAodm9pZClyd2ZsYWc7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisKKyAgICB1aV9kYXRhPXVzZXJkYXRhOworICAgIGlmKHNpemU8MCkgLyoganVzdCBpbiBjYXNlICovCisgICAgICAgIHJldHVybiAwOworICAgIGlmKCFEaWFsb2dCb3goZ2hJbnN0LCBURVhUKCJQYXNzQm94IiksIGh3bmQsIChETEdQUk9DKXBhc3NfcHJvYykpCisgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLworICAgIHN0cm5jcHkoYnVmLCB1aV9kYXRhLT5wYXNzLCAoc2l6ZV90KXNpemUpOworICAgIGJ1ZltzaXplLTFdPSdcMCc7CisgICAgcmV0dXJuIChpbnQpc3RybGVuKGJ1Zik7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBwaW5fY2IoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcykgeworICAgIHVpX2RhdGE9VUlfZ2V0MF91c2VyX2RhdGEodWkpOyAvKiB3YXM6IHVpX2RhdGE9VUlfZ2V0X2FwcF9kYXRhKHVpKTsgKi8KKyAgICBpZighdWlfZGF0YSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiSU5URVJOQUwgRVJST1I6IHVzZXIgZGF0YSBkYXRhIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKCFEaWFsb2dCb3goZ2hJbnN0LCBURVhUKCJQYXNzQm94IiksIGh3bmQsIChETEdQUk9DKXBhc3NfcHJvYykpCisgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLworICAgIFVJX3NldF9yZXN1bHQodWksIHVpcywgdWlfZGF0YS0+cGFzcyk7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbG9nIGhhbmRsaW5nICovCisKK05PRVhQT1JUIHZvaWQgc2F2ZV9sb2coKSB7CisgICAgVENIQVIgZmlsZV9uYW1lW01BWF9QQVRIXTsKKyAgICBPUEVORklMRU5BTUUgb2ZuOworICAgIExQVFNUUiB0eHQ7CisgICAgTFBTVFIgc3RyOworCisgICAgWmVyb01lbW9yeSgmb2ZuLCBzaXplb2Ygb2ZuKTsKKyAgICBmaWxlX25hbWVbMF09J1wwJzsKKworICAgIG9mbi5sU3RydWN0U2l6ZT1zaXplb2Ygb2ZuOworICAgIG9mbi5od25kT3duZXI9aHduZDsKKyAgICBvZm4ubHBzdHJGaWx0ZXI9VEVYVCgiTG9nIEZpbGVzICgqLmxvZylcMCoubG9nXDBBbGwgRmlsZXMgKCouKilcMCouKlwwXDAiKTsKKyAgICBvZm4ubHBzdHJGaWxlPWZpbGVfbmFtZTsKKyAgICBvZm4ubk1heEZpbGU9TUFYX1BBVEg7CisgICAgb2ZuLmxwc3RyRGVmRXh0PVRFWFQoIkxPRyIpOworICAgIG9mbi5scHN0ckluaXRpYWxEaXI9VEVYVCgiLiIpOworCisgICAgb2ZuLmxwc3RyVGl0bGU9VEVYVCgiU2F2ZSBMb2ciKTsKKyAgICBvZm4uRmxhZ3M9T0ZOX0VYUExPUkVSfE9GTl9QQVRITVVTVEVYSVNUfE9GTl9ISURFUkVBRE9OTFl8CisgICAgICAgIE9GTl9PVkVSV1JJVEVQUk9NUFQ7CisgICAgaWYoIUdldFNhdmVGaWxlTmFtZSgmb2ZuKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHh0PWxvZ190eHQoKTsgLyogbmVlZCB0byBjb252ZXJ0IHRoZSByZXN1bHQgdG8gVVRGLTggKi8KKyAgICBzdHI9dHN0cjJzdHIodHh0KTsKKyAgICBzdHJfZnJlZSh0eHQpOworICAgIHNhdmVfdGV4dF9maWxlKGZpbGVfbmFtZSwgc3RyKTsKKyAgICBzdHJfZnJlZShzdHIpOworfQorCitOT0VYUE9SVCBpbnQgc2F2ZV90ZXh0X2ZpbGUoTFBUU1RSIGZpbGVfbmFtZSwgY2hhciAqc3RyKSB7CisgICAgSEFORExFIGZpbGVfaGFuZGxlOworICAgIERXT1JEIGlnbm9yZTsKKworICAgIGZpbGVfaGFuZGxlPUNyZWF0ZUZpbGUoZmlsZV9uYW1lLCBHRU5FUklDX1dSSVRFLCAwLCBOVUxMLAorICAgICAgICBDUkVBVEVfQUxXQVlTLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlmKGZpbGVfaGFuZGxlPT1JTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiQ3JlYXRlRmlsZSIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFXcml0ZUZpbGUoZmlsZV9oYW5kbGUsIHN0ciwgc3RybGVuKHN0ciksICZpZ25vcmUsIE5VTEwpKSB7CisgICAgICAgIENsb3NlSGFuZGxlKGZpbGVfaGFuZGxlKTsKKyAgICAgICAgZXJyb3JfYm94KFRFWFQoIldyaXRlRmlsZSIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIENsb3NlSGFuZGxlKGZpbGVfaGFuZGxlKTsKKyAgICByZXR1cm4gMDsKK30KKworTk9FWFBPUlQgdm9pZCB3aW5fbG9nKExQQ1RTVFIgdHh0KSB7CisgICAgc3RydWN0IExJU1QgKmN1cnI7CisgICAgc2l6ZV90IHR4dF9sZW47CisgICAgc3RhdGljIHNpemVfdCBsb2dfbGVuPTA7CisKKyAgICB0eHRfbGVuPV90Y3NsZW4odHh0KTsKKyAgICBjdXJyPXN0cl9hbGxvYyhzaXplb2Yoc3RydWN0IExJU1QpK3R4dF9sZW4qc2l6ZW9mKFRDSEFSKSk7CisgICAgY3Vyci0+bGVuPXR4dF9sZW47CisgICAgX3Rjc2NweShjdXJyLT50eHQsIHR4dCk7CisgICAgY3Vyci0+bmV4dD1OVUxMOworICAgIGlmKHRhaWwpCisgICAgICAgIHRhaWwtPm5leHQ9Y3VycjsKKyAgICB0YWlsPWN1cnI7CisgICAgaWYoIWhlYWQpCisgICAgICAgIGhlYWQ9dGFpbDsKKyAgICBsb2dfbGVuKys7CisgICAgd2hpbGUobG9nX2xlbj5MT0dfTElORVMpIHsKKyAgICAgICAgY3Vycj1oZWFkOworICAgICAgICBoZWFkPWhlYWQtPm5leHQ7CisgICAgICAgIHN0cl9mcmVlKGN1cnIpOworICAgICAgICBsb2dfbGVuLS07CisgICAgfQorICAgIG5ld19sb2dzPTE7Cit9CisKK05PRVhQT1JUIHZvaWQgdXBkYXRlX2xvZ3Modm9pZCkgeworICAgIExQVFNUUiB0eHQ7CisKKyAgICBpZighSW50ZXJsb2NrZWRFeGNoYW5nZSgmbmV3X2xvZ3MsIDApKQorICAgICAgICByZXR1cm47CisgICAgdHh0PWxvZ190eHQoKTsKKyAgICBTZXRXaW5kb3dUZXh0KGVkaXRfaGFuZGxlLCB0eHQpOworICAgIHN0cl9mcmVlKHR4dCk7CisgICAgU2VuZE1lc3NhZ2UoZWRpdF9oYW5kbGUsIFdNX1ZTQ1JPTEwsIChXUEFSQU0pU0JfQk9UVE9NLCAoTFBBUkFNKTApOworfQorCitOT0VYUE9SVCBMUFRTVFIgbG9nX3R4dCh2b2lkKSB7CisgICAgTFBUU1RSIGJ1ZmY7CisgICAgdW5zaWduZWQgcHRyPTAsIGxlbj0wOworICAgIHN0cnVjdCBMSVNUICpjdXJyOworCisgICAgZm9yKGN1cnI9aGVhZDsgY3VycjsgY3Vycj1jdXJyLT5uZXh0KQorICAgICAgICBsZW4rPWN1cnItPmxlbisyOyAvKiArMiBmb3IgdHJhaWxpbmcgJ1xyXG4nICovCisgICAgYnVmZj1zdHJfYWxsb2MoKGxlbisxKSpzaXplb2YoVENIQVIpKTsgLyogKzEgZm9yIHRyYWlsaW5nICdcMCcgKi8KKyAgICBmb3IoY3Vycj1oZWFkOyBjdXJyOyBjdXJyPWN1cnItPm5leHQpIHsKKyAgICAgICAgbWVtY3B5KGJ1ZmYrcHRyLCBjdXJyLT50eHQsIGN1cnItPmxlbipzaXplb2YoVENIQVIpKTsKKyAgICAgICAgcHRyKz1jdXJyLT5sZW47CisgICAgICAgIGlmKGN1cnItPm5leHQpIHsKKyAgICAgICAgICAgIGJ1ZmZbcHRyKytdPVRFWFQoJ1xyJyk7CisgICAgICAgICAgICBidWZmW3B0cisrXT1URVhUKCdcbicpOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZmZbcHRyXT1URVhUKCdcMCcpOworICAgIHJldHVybiBidWZmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3b3JrZXIgdGhyZWFkICovCisKK05PRVhQT1JUIHZvaWQgZGFlbW9uX3RocmVhZCh2b2lkICphcmcpIHsKKyAgICAodm9pZClhcmc7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisKKyAgICB0bHNfYWxsb2MoTlVMTCwgTlVMTCwgIm1haW4iKTsgLyogbmV3IHRocmVhZC1sb2NhbCBzdG9yYWdlICovCisgICAgbWFpbl9pbml0KCk7CisgICAgU2V0RXZlbnQobWFpbl9pbml0aWFsaXplZCk7IC8qIHVubG9jayB0aGUgR1VJIHRocmVhZCAqLworICAgIC8qIGdldCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB3aGlsZShtYWluX2NvbmZpZ3VyZShjbWRsaW5lLmNvbmZpZ19maWxlLCBOVUxMKSkgeworICAgICAgICBjbWRsaW5lLmNvbmZpZ19maWxlPU5VTEw7IC8qIGRvbid0IHJldHJ5IGNvbW1hbmRsaW5lIHN3aXRjaGVzICovCisgICAgICAgIHVuYmluZF9wb3J0cygpOyAvKiBpbiBjYXNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCBhZnRlciBiaW5kX3BvcnRzKCkgKi8KKyAgICAgICAgbG9nX2ZsdXNoKExPR19NT0RFX0VSUk9SKTsgLyogb3RoZXJ3aXNlIGxvZ3MgYXJlIGJ1ZmZlcmVkICovCisgICAgICAgIFBvc3RNZXNzYWdlKGh3bmQsIFdNX0lOVkFMSURfQ09ORklHLCAwLCAwKTsgLyogZGlzcGxheSBlcnJvciAqLworICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmZpZ19yZWFkeSwgSU5GSU5JVEUpOworICAgICAgICBsb2dfY2xvc2UoKTsgLyogcHJldmVudCBtYWluX2NvbmZpZ3VyZSgpIGZyb20gbG9nZ2luZyBpbiBlcnJvciBtb2RlICovCisgICAgfQorICAgIFBvc3RNZXNzYWdlKGh3bmQsIFdNX1ZBTElEX0NPTkZJRywgMCwgMCk7CisKKyAgICAvKiBzdGFydCB0aGUgbWFpbiBsb29wICovCisgICAgZGFlbW9uX2xvb3AoKTsKKyAgICBtYWluX2NsZWFudXAoKTsKKyAgICBfZW5kdGhyZWFkKCk7IC8qIFNJR05BTF9URVJNSU5BVEUgcmVjZWl2ZWQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaGVscGVyIGZ1bmN0aW9ucyAqLworCitOT0VYUE9SVCB2b2lkIGludmFsaWRfY29uZmlnKCkgeworICAgIC8qIHVwZGF0ZSB0aGUgbWFpbiB3aW5kb3cgdGl0bGUgKi8KKyAgICB3aW4zMl9uYW1lPVRFWFQoInN0dW5uZWwgIikgVEVYVChTVFVOTkVMX1ZFUlNJT04pIFRFWFQoIiBvbiAiKQorICAgICAgICBURVhUKFNUVU5ORUxfUExBVEZPUk0pIFRFWFQoIiAoaW52YWxpZCBjb25maWd1cmF0aW9uIGZpbGUpIik7CisgICAgU2V0V2luZG93VGV4dChod25kLCB3aW4zMl9uYW1lKTsKKworICAgIC8qIGxvZyB3aW5kb3cgaXMgaGlkZGVuIGJ5IGRlZmF1bHQgKi8KKyAgICBTaG93V2luZG93KGh3bmQsIFNXX1NIT1dOT1JNQUwpOyAvKiBzaG93IHdpbmRvdyAqLworICAgIFNldEZvcmVncm91bmRXaW5kb3coaHduZCk7IC8qIGJyaW5nIG9uIHRvcCAqLworCisgICAgdHJheV91cGRhdGUoLTEpOyAvKiBlcnJvciBpY29uICovCisgICAgdXBkYXRlX3BlZXJfbWVudSgpOyAvKiBwdXJnZSB0aGUgbGlzdCBvZiBzZWN0aW9ucyAqLworCisgICAgd2luX2xvZyhURVhUKCIiKSk7CisgICAgc19sb2coTE9HX0VSUiwgIlNlcnZlciBpcyBkb3duIik7CisgICAgbWVzc2FnZV9ib3goVEVYVCgiU3R1bm5lbCBzZXJ2ZXIgaXMgZG93biBkdWUgdG8gYW4gZXJyb3IuXG4iKQorICAgICAgICBURVhUKCJZb3UgbmVlZCB0byBleGl0IGFuZCBjb3JyZWN0IHRoZSBwcm9ibGVtLlxuIikKKyAgICAgICAgVEVYVCgiQ2xpY2sgT0sgdG8gc2VlIHRoZSBlcnJvciBsb2cgd2luZG93LiIpLAorICAgICAgICBNQl9JQ09ORVJST1IpOworfQorCitOT0VYUE9SVCB2b2lkIHZhbGlkX2NvbmZpZygpIHsKKyAgICAvKiB1cGRhdGUgdGhlIG1haW4gd2luZG93IHRpdGxlICovCisgICAgd2luMzJfbmFtZT1URVhUKCJzdHVubmVsICIpIFRFWFQoU1RVTk5FTF9WRVJTSU9OKSBURVhUKCIgb24gIikKKyAgICAgICAgVEVYVChTVFVOTkVMX1BMQVRGT1JNKTsKKyAgICBTZXRXaW5kb3dUZXh0KGh3bmQsIHdpbjMyX25hbWUpOworCisgICAgdHJheV91cGRhdGUobnVtX2NsaWVudHMpOyAvKiBpZGxlIG9yIGJ1c3kgaWNvbiAob24gcmVsb2FkKSAqLworICAgIHVwZGF0ZV9wZWVyX21lbnUoKTsgLyogb25lIG1lbnUgaXRlbSBwZXIgc2VjdGlvbiAqLworCisgICAgLyogZW5hYmxlIElETV9SRU9QRU5fTE9HIG1lbnUgaWYgYSBsb2cgZmlsZSBpcyB1c2VkLCBkaXNhYmxlIG90aGVyd2lzZSAqLworI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgRW5hYmxlTWVudUl0ZW0obWFpbl9tZW51X2hhbmRsZSwgSURNX1JFT1BFTl9MT0csCisgICAgICAgIChVSU5UKShnbG9iYWxfb3B0aW9ucy5vdXRwdXRfZmlsZSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKKyNlbmRpZgorICAgIGlmKHRyYXlfbWVudV9oYW5kbGUpCisgICAgICAgIEVuYWJsZU1lbnVJdGVtKHRyYXlfbWVudV9oYW5kbGUsIElETV9SRU9QRU5fTE9HLAorICAgICAgICAgICAgKFVJTlQpKGdsb2JhbF9vcHRpb25zLm91dHB1dF9maWxlID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCkpOworfQorCitOT0VYUE9SVCB2b2lkIHVwZGF0ZV9wZWVyX21lbnUodm9pZCkgeworICAgIFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbjsKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgIEhNRU5VIG1haW5fcGVlcl9saXN0PU5VTEw7CisjZW5kaWYKKyAgICBITUVOVSB0cmF5X3BlZXJfbGlzdD1OVUxMOworICAgIHVuc2lnbmVkIHNlY3Rpb25fbnVtYmVyOworICAgIExQVFNUUiBzZXJ2bmFtZTsKKworICAgIC8qIHB1cmdlIG1lbnUgcGVlciBsaXN0cyAqLworI2lmbmRlZiBfV0lOMzJfV0NFCisgICAgaWYobWFpbl9tZW51X2hhbmRsZSkKKyAgICAgICAgbWFpbl9wZWVyX2xpc3Q9R2V0U3ViTWVudShtYWluX21lbnVfaGFuZGxlLCAyKTsgLyogM3JkIHN1Ym1lbnUgKi8KKyAgICBpZihtYWluX3BlZXJfbGlzdCkKKyAgICAgICAgd2hpbGUoR2V0TWVudUl0ZW1Db3VudChtYWluX3BlZXJfbGlzdCkpIC8qIHB1cmdlIG9sZCBtZW51ICovCisgICAgICAgICAgICBEZWxldGVNZW51KG1haW5fcGVlcl9saXN0LCAwLCBNRl9CWVBPU0lUSU9OKTsKKyNlbmRpZgorICAgIGlmKHRyYXlfbWVudV9oYW5kbGUpCisgICAgICAgIHRyYXlfcGVlcl9saXN0PUdldFN1Yk1lbnUoR2V0U3ViTWVudSh0cmF5X21lbnVfaGFuZGxlLCAwKSwgMik7CisgICAgaWYodHJheV9wZWVyX2xpc3QpCisgICAgICAgIHdoaWxlKEdldE1lbnVJdGVtQ291bnQodHJheV9wZWVyX2xpc3QpKSAvKiBwdXJnZSBvbGQgbWVudSAqLworICAgICAgICAgICAgRGVsZXRlTWVudSh0cmF5X3BlZXJfbGlzdCwgMCwgTUZfQllQT1NJVElPTik7CisKKyAgICAvKiBpbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyAqLworICAgIG51bWJlcl9vZl9zZWN0aW9ucz0wOworICAgIGZvcihzZWN0aW9uPXNlcnZpY2Vfb3B0aW9ucy5uZXh0OyBzZWN0aW9uOyBzZWN0aW9uPXNlY3Rpb24tPm5leHQpCisgICAgICAgIHNlY3Rpb24tPnNlY3Rpb25fbnVtYmVyPW51bWJlcl9vZl9zZWN0aW9ucysrOworCisgICAgc2VjdGlvbl9udW1iZXI9MDsKKyAgICBmb3Ioc2VjdGlvbj1zZXJ2aWNlX29wdGlvbnMubmV4dDsgc2VjdGlvbjsgc2VjdGlvbj1zZWN0aW9uLT5uZXh0KSB7CisgICAgICAgIHNlcnZuYW1lPXN0cjJ0c3RyKHNlY3Rpb24tPnNlcnZuYW1lKTsKKworICAgICAgICAvKiBzZXR1cCBMUFRTVFIgc2VjdGlvbi0+ZmlsZSAqLworICAgICAgICBzZWN0aW9uLT5maWxlPXN0cl90cHJpbnRmKFRFWFQoInBlZXItJXMucGVtIiksIHNlcnZuYW1lKTsKKworICAgICAgICAvKiBzZXR1cCBzZWN0aW9uLT5oZWxwICovCisgICAgICAgIHNlY3Rpb24tPmhlbHA9c3RyX3RwcmludGYoCisgICAgICAgICAgICBURVhUKCJQZWVyIGNlcnRpZmljYXRlIGNoYWluIGhhcyBiZWVuIHNhdmVkLlxuIikKKyAgICAgICAgICAgIFRFWFQoIkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHNlY3Rpb24gWyVzXTpcbiIpCisgICAgICAgICAgICBURVhUKCJcdENBZmlsZSA9IHBlZXItJXMucGVtXG4iKQorICAgICAgICAgICAgVEVYVCgiXHR2ZXJpZnkgPSAzXG4iKQorICAgICAgICAgICAgVEVYVCgidG8gZW5hYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24uXG4iKQorICAgICAgICAgICAgVEVYVCgiVGhlbiByZWxvYWQgc3R1bm5lbCBjb25maWd1cmF0aW9uIGZpbGUuIiksCisgICAgICAgICAgICBzZXJ2bmFtZSwgc2Vydm5hbWUpOworCisgICAgICAgIHN0cl9mcmVlKHNlcnZuYW1lKTsKKworICAgICAgICAvKiBzZXR1cCBzZWN0aW9uLT5jaGFpbiAqLworICAgICAgICBzZWN0aW9uLT5jaGFpbj1OVUxMOworCisgICAgICAgIC8qIGluc2VydCBuZXcgbWVudSBpdGVtICovCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgaWYobWFpbl9wZWVyX2xpc3QpCisgICAgICAgICAgICBpZighSW5zZXJ0TWVudShtYWluX3BlZXJfbGlzdCwgc2VjdGlvbl9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIE1GX0JZUE9TSVRJT058TUZfU1RSSU5HfE1GX0dSQVlFRCwKKyAgICAgICAgICAgICAgICAgICAgSURNX1BFRVJfTUVOVStzZWN0aW9uX251bWJlciwgc2VjdGlvbi0+ZmlsZSkpCisgICAgICAgICAgICAgICAgaW9lcnJvcigiSW5zZXJ0TWVudSIpOworI2VuZGlmCisgICAgICAgIGlmKHRyYXlfcGVlcl9saXN0KQorICAgICAgICAgICAgaWYoIUluc2VydE1lbnUodHJheV9wZWVyX2xpc3QsIHNlY3Rpb25fbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBNRl9CWVBPU0lUSU9OfE1GX1NUUklOR3xNRl9HUkFZRUQsCisgICAgICAgICAgICAgICAgICAgIElETV9QRUVSX01FTlUrc2VjdGlvbl9udW1iZXIsIHNlY3Rpb24tPmZpbGUpKQorICAgICAgICAgICAgICAgIGlvZXJyb3IoIkluc2VydE1lbnUiKTsKKworICAgICAgICArK3NlY3Rpb25fbnVtYmVyOworICAgIH0KKyAgICBpZihod25kKQorICAgICAgICBEcmF3TWVudUJhcihod25kKTsKK30KKworSUNPTl9JTUFHRSBsb2FkX2ljb25fZGVmYXVsdChJQ09OX1RZUEUgdHlwZSkgeworICAgIFdPUkQgaWRpOworICAgIElDT05fSU1BR0UgaW1nOworCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIElDT05fQUNUSVZFOgorICAgICAgICBpZGk9SURJX1NUVU5ORUxfQUNUSVZFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDT05fRVJST1I6CisgICAgICAgIGlkaT1JRElfU1RVTk5FTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ09OX0lETEU6CisgICAgICAgIGlkaT1JRElfU1RVTk5FTF9JRExFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaW1nPUxvYWRJbWFnZShnaEluc3QsIE1BS0VJTlRSRVNPVVJDRShpZGkpLCBJTUFHRV9JQ09OLAorICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU01JQ09OKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNNSUNPTiksIDApOworICAgIHJldHVybiBEdXBsaWNhdGVJY29uKE5VTEwsIGltZyk7Cit9CisKK0lDT05fSU1BR0UgbG9hZF9pY29uX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkgeworICAgIExQVFNUUiB0bmFtZTsKKyAgICBJQ09OX0lNQUdFIGljb247CisKKyAgICB0bmFtZT1zdHIydHN0cigoTFBTVFIpbmFtZSk7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBpY29uPUxvYWRJbWFnZShOVUxMLCB0bmFtZSwgSU1BR0VfSUNPTiwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNNSUNPTiksCisgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTTUlDT04pLCBMUl9MT0FERlJPTUZJTEUpOworI2Vsc2UKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgYSBXQ0UgdmVyc2lvbiBvZiBMb2FkSW1hZ2UoKSAqLworICAgIC8qIGljb249d2NlTG9hZEljb25Gcm9tRmlsZSh0bmFtZSk7ICovCisgICAgc19sb2coTE9HX0VSUiwgIkxvYWRpbmcgaW1hZ2UgZnJvbSBmaWxlIG5vdCBpbXBsZW1lbnRlZCBvbiBXQ0UiKTsKKyAgICBpY29uPU5VTEw7CisjZW5kaWYKKyAgICBzdHJfZnJlZSh0bmFtZSk7CisgICAgcmV0dXJuIGljb247Cit9CisKK05PRVhQT1JUIHZvaWQgdHJheV91cGRhdGUoY29uc3QgaW50IG51bSkgeworICAgIE5PVElGWUlDT05EQVRBIG5pZDsKKyAgICBzdGF0aWMgSUNPTl9UWVBFIHByZXZpb3VzX2ljb249SUNPTl9OT05FOworICAgIElDT05fVFlQRSBjdXJyZW50X2ljb247CisgICAgTFBUU1RSIHRpcDsKKworICAgIGlmKCFnbG9iYWxfb3B0aW9ucy5vcHRpb24udGFza2JhcikgeyAvKiBjdXJyZW50bHkgZGlzYWJsZWQgKi8KKyAgICAgICAgdHJheV9kZWxldGUoKTsgLyogcmVtb3ZlIHRoZSB0YXNrYmFyayBpY29uIGlmIGV4aXN0cyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCF0cmF5X21lbnVfaGFuZGxlKSAvKiBpbml0aWFsaXplIHRhc2tiYXIgKi8KKyAgICAgICAgdHJheV9tZW51X2hhbmRsZT1Mb2FkTWVudShnaEluc3QsIE1BS0VJTlRSRVNPVVJDRShJRE1fVFJBWU1FTlUpKTsKKyAgICBpZighdHJheV9tZW51X2hhbmRsZSkgeworICAgICAgICBpb2Vycm9yKCJMb2FkTWVudSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKGNtZGxpbmUuc2VydmljZSkKKyAgICAgICAgRW5hYmxlTWVudUl0ZW0odHJheV9tZW51X2hhbmRsZSwgSURNX0VESVRfQ09ORklHLCBNRl9HUkFZRUQpOworCisgICAgWmVyb01lbW9yeSgmbmlkLCBzaXplb2YgbmlkKTsKKyAgICBuaWQuY2JTaXplPXNpemVvZiBuaWQ7CisgICAgbmlkLnVJRD0xOyAvKiBhcHBsaWNhdGlvbi1kZWZpbmVkIGljb24gSUQgKi8KKyAgICBuaWQudUZsYWdzPU5JRl9NRVNTQUdFfE5JRl9USVA7CisgICAgbmlkLnVDYWxsYmFja01lc3NhZ2U9V01fU1lTVFJBWTsgLyogbm90aWZpY2F0aW9uIG1lc3NhZ2UgKi8KKyAgICBuaWQuaFduZD1od25kOyAvKiB3aW5kb3cgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zICovCisgICAgaWYobnVtPDApIHsKKyAgICAgICAgdGlwPXN0cl90cHJpbnRmKFRFWFQoIlNlcnZlciBpcyBkb3duIikpOworICAgICAgICBjdXJyZW50X2ljb249SUNPTl9FUlJPUjsKKyAgICB9IGVsc2UgaWYobnVtPjApIHsKKyAgICAgICAgdGlwPXN0cl90cHJpbnRmKFRFWFQoIiVkIGFjdGl2ZSBzZXNzaW9uKHMpIiksIG51bSk7CisgICAgICAgIGN1cnJlbnRfaWNvbj1JQ09OX0FDVElWRTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aXA9c3RyX3RwcmludGYoVEVYVCgiU2VydmVyIGlzIGlkbGUiKSk7CisgICAgICAgIGN1cnJlbnRfaWNvbj1JQ09OX0lETEU7CisgICAgfQorICAgIF90Y3NuY3B5KG5pZC5zelRpcCwgdGlwLCA2Myk7CisgICAgbmlkLnN6VGlwWzYzXT1URVhUKCdcMCcpOworICAgIHN0cl9mcmVlKHRpcCk7CisgICAgbmlkLmhJY29uPWdsb2JhbF9vcHRpb25zLmljb25bY3VycmVudF9pY29uXTsKKyAgICBpZihjdXJyZW50X2ljb24hPXByZXZpb3VzX2ljb24pIHsKKyAgICAgICAgbmlkLnVGbGFnc3w9TklGX0lDT047CisgICAgICAgIHByZXZpb3VzX2ljb249Y3VycmVudF9pY29uOworICAgIH0KKyAgICBpZihTaGVsbF9Ob3RpZnlJY29uKE5JTV9NT0RJRlksICZuaWQpKSAvKiBtb2RpZnkgdG9vbHRpcCAqLworICAgICAgICByZXR1cm47IC8qIE9LOiB0YXNrYmFyIGljb24gZXhpc3RzICovCisgICAgLyogdG9vbHRpcCB1cGRhdGUgZmFpbGVkIC0gdHJ5IHRvIGNyZWF0ZSB0aGUgaWNvbiAqLworICAgIG5pZC51RmxhZ3N8PU5JRl9JQ09OOworICAgIFNoZWxsX05vdGlmeUljb24oTklNX0FERCwgJm5pZCk7Cit9CisKK05PRVhQT1JUIHZvaWQgdHJheV9kZWxldGUodm9pZCkgeworICAgIE5PVElGWUlDT05EQVRBIG5pZDsKKworICAgIGlmKHRyYXlfbWVudV9oYW5kbGUpIHsKKyAgICAgICAgWmVyb01lbW9yeSgmbmlkLCBzaXplb2YgbmlkKTsKKyAgICAgICAgbmlkLmNiU2l6ZT1zaXplb2YgbmlkOworICAgICAgICBuaWQudUlEPTE7IC8qIGFwcGxpY2F0aW9uLWRlZmluZWQgaWNvbiBJRCAqLworICAgICAgICBuaWQuaFduZD1od25kOyAvKiB3aW5kb3cgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zICovCisgICAgICAgIG5pZC51RmxhZ3M9TklGX1RJUDsgLyogbm90IHJlYWxseSBzdXJlIHdoYXQgdG8gcHV0IGhlcmUsIGJ1dCBpdCB3b3JrcyAqLworICAgICAgICBTaGVsbF9Ob3RpZnlJY29uKE5JTV9ERUxFVEUsICZuaWQpOyAvKiB0aGlzIHJlbW92ZXMgdGhlIGljb24gKi8KKyAgICAgICAgaWYoIURlc3Ryb3lNZW51KHRyYXlfbWVudV9oYW5kbGUpKSAvKiByZWxlYXNlIG1lbnUgcmVzb3VyY2VzICovCisgICAgICAgICAgICBpb2Vycm9yKCJEZXN0cm95TWVudSIpOworICAgICAgICB0cmF5X21lbnVfaGFuZGxlPU5VTEw7CisgICAgfQorfQorCitOT0VYUE9SVCB2b2lkIGVycm9yX2JveChMUENUU1RSIHRleHQpIHsKKyAgICBMUFRTVFIgZXJybXNnLCBmdWxsbXNnOworICAgIERXT1JEIGR3OworCisgICAgZHc9R2V0TGFzdEVycm9yKCk7CisgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVJ8Rk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgIE5VTEwsIGR3LCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKyAgICAgICAgKExQVFNUUikmZXJybXNnLCAwLCBOVUxMKTsKKyAgICBmdWxsbXNnPXN0cl90cHJpbnRmKFRFWFQoIiVzOiBlcnJvciAlbGQ6ICVzIiksIHRleHQsIGR3LCBlcnJtc2cpOworICAgIExvY2FsRnJlZShlcnJtc2cpOworICAgIG1lc3NhZ2VfYm94KGZ1bGxtc2csIE1CX0lDT05FUlJPUik7CisgICAgc3RyX2ZyZWUoZnVsbG1zZyk7Cit9CisKK3ZvaWQgbWVzc2FnZV9ib3goTFBDVFNUUiB0ZXh0LCBjb25zdCBVSU5UIHR5cGUpIHsKKyAgICBpZihjbWRsaW5lLnF1aWV0KQorICAgICAgICByZXR1cm47CisgICAgTWVzc2FnZUJveChod25kLCB0ZXh0LCB3aW4zMl9uYW1lLCB0eXBlKTsKK30KKwordm9pZCB1aV9uZXdfY2hhaW4oY29uc3QgdW5zaWduZWQgc2VjdGlvbl9udW1iZXIpIHsKKyAgICBQb3N0TWVzc2FnZShod25kLCBXTV9ORVdfQ0hBSU4sIHNlY3Rpb25fbnVtYmVyLCAwKTsKK30KKwordm9pZCB1aV9uZXdfbG9nKGNvbnN0IGNoYXIgKmxpbmUpIHsKKyAgICBMUFRTVFIgdHh0OworICAgIHR4dD1zdHIydHN0cihsaW5lKTsKKyAgICBzdHJfZGV0YWNoKHR4dCk7IC8qIHRoaXMgYWxsb2NhdGlvbiB3aWxsIGJlIGZyZWVkIGluIHRoZSBHVUkgdGhyZWFkICovCisgICAgUG9zdE1lc3NhZ2UoaHduZCwgV01fTE9HLCAoV1BBUkFNKXR4dCwgMCk7Cit9CisKK3ZvaWQgdWlfY29uZmlnX3JlbG9hZGVkKHZvaWQpIHsKKyAgICBQb3N0TWVzc2FnZShod25kLCBXTV9WQUxJRF9DT05GSUcsIDAsIDApOworfQorCit2b2lkIHVpX2NsaWVudHMoY29uc3QgbG9uZyBudW0pIHsKKyAgICBQb3N0TWVzc2FnZShod25kLCBXTV9DTElFTlRTLCAoV1BBUkFNKW51bSwgMCk7Cit9CisKKyAgICAvKiBUT0RPOiBwb3J0IGl0IHRvIFdDRSAqLworTk9FWFBPUlQgdm9pZCBlZGl0X2NvbmZpZyhIV05EIG1haW5fd2luZG93X2hhbmRsZSkgeworICAgIFRDSEFSIGN3ZFtNQVhfUEFUSF07CisgICAgTFBUU1RSIGNvbmZfZmlsZSwgY29uZl9wYXRoOworCisgICAgY29uZl9maWxlPXN0cjJ0c3RyKGNvbmZpZ3VyYXRpb25fZmlsZSk7CisgICAgaWYoKmNvbmZfZmlsZT09VEVYVCgnXCInKSkgeworICAgICAgICBjb25mX3BhdGg9Y29uZl9maWxlOworICAgIH0gZWxzZSBpZihfdGNzY2hyKGNvbmZfZmlsZSwgVEVYVCgnXFwnKSkpIHsKKyAgICAgICAgY29uZl9wYXRoPXN0cl90cHJpbnRmKFRFWFQoIlwiJXNcIiIpLCBjb25mX2ZpbGUpOworICAgICAgICBzdHJfZnJlZShjb25mX2ZpbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEdldEN1cnJlbnREaXJlY3RvcnkoTUFYX1BBVEgsIGN3ZCk7CisgICAgICAgIGNvbmZfcGF0aD1zdHJfdHByaW50ZihURVhUKCJcIiVzXFwlc1wiIiksIGN3ZCwgY29uZl9maWxlKTsKKyAgICAgICAgc3RyX2ZyZWUoY29uZl9maWxlKTsKKyAgICB9CisKKyAgICBpZihpc19hZG1pbigpKSB7CisgICAgICAgIFNoZWxsRXhlY3V0ZShtYWluX3dpbmRvd19oYW5kbGUsIFRFWFQoIm9wZW4iKSwKKyAgICAgICAgICAgIFRFWFQoIm5vdGVwYWQuZXhlIiksIGNvbmZfcGF0aCwKKyAgICAgICAgICAgIE5VTEwsIFNXX1NIT1dOT1JNQUwpOworICAgIH0gZWxzZSB7IC8qIFVBQyB3b3JrYXJvdW5kICovCisgICAgICAgIFNoZWxsRXhlY3V0ZShtYWluX3dpbmRvd19oYW5kbGUsIFRFWFQoInJ1bmFzIiksCisgICAgICAgICAgICBURVhUKCJub3RlcGFkLmV4ZSIpLCBjb25mX3BhdGgsCisgICAgICAgICAgICBOVUxMLCBTV19TSE9XTk9STUFMKTsKKyAgICB9CisgICAgc3RyX2ZyZWUoY29uZl9wYXRoKTsKK30KKworTk9FWFBPUlQgQk9PTCBpc19hZG1pbih2b2lkKSB7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgICBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgTnRBdXRob3JpdHk9e1NFQ1VSSVRZX05UX0FVVEhPUklUWX07CisgICAgUFNJRCBhZG1pbl9ncm91cDsKKyAgICBCT09MIHJldHZhbDsKKworICAgIHJldHZhbD1BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoJk50QXV0aG9yaXR5LCAyLAorICAgICAgICBTRUNVUklUWV9CVUlMVElOX0RPTUFJTl9SSUQsIERPTUFJTl9BTElBU19SSURfQURNSU5TLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAmYWRtaW5fZ3JvdXApOworICAgIGlmKHJldHZhbCkgeworICAgICAgICBpZighQ2hlY2tUb2tlbk1lbWJlcnNoaXAoTlVMTCwgYWRtaW5fZ3JvdXAsICZyZXR2YWwpKQorICAgICAgICAgICAgcmV0dmFsPUZBTFNFOworICAgICAgICBGcmVlU2lkKGFkbWluX2dyb3VwKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKKyNlbHNlCisgICAgcmV0dXJuIFRSVUU7IC8qIGFsd2F5cyBhbiBhZG1pbiBvbiBXQ0UgKi8KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB3aW5kb3dzIHNlcnZpY2UgKi8KKworI2lmbmRlZiBfV0lOMzJfV0NFCisKK05PRVhQT1JUIGludCBzZXJ2aWNlX2luaXRpYWxpemUodm9pZCkgeworICAgIFNFUlZJQ0VfVEFCTEVfRU5UUlkgc2VydmljZVRhYmxlW109e3swLCAwfSwgezAsIDB9fTsKKworICAgIHNlcnZpY2VUYWJsZVswXS5scFNlcnZpY2VOYW1lPVNFUlZJQ0VfTkFNRTsKKyAgICBzZXJ2aWNlVGFibGVbMF0ubHBTZXJ2aWNlUHJvYz1zZXJ2aWNlX21haW47CisgICAgLyogZGlzYWJsZSB0YXNrYmFyIGZvciBzZWN1cml0eSAqLworICAgIC8qIGdsb2JhbF9vcHRpb25zLm9wdGlvbi50YXNrYmFyPTA7ICovCisgICAgaWYoIVN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyKHNlcnZpY2VUYWJsZSkpIHsKKyAgICAgICAgZXJyb3JfYm94KFRFWFQoIlN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8qIE5UIHNlcnZpY2Ugc3RhcnRlZCAqLworfQorCisjZGVmaW5lIERFU0NSX0xFTiAyNTYKKworTk9FWFBPUlQgaW50IHNlcnZpY2VfaW5zdGFsbCgpIHsKKyAgICBTQ19IQU5ETEUgc2NtLCBzZXJ2aWNlOworICAgIFRDSEFSIHN0dW5uZWxfZXhlX3BhdGhbTUFYX1BBVEhdOworICAgIExQVFNUUiBzZXJ2aWNlX3BhdGg7CisgICAgVENIQVIgZGVzY3Jfc3RyW0RFU0NSX0xFTl07CisgICAgU0VSVklDRV9ERVNDUklQVElPTiBkZXNjcjsKKworICAgIHNjbT1PcGVuU0NNYW5hZ2VyKDAsIDAsIFNDX01BTkFHRVJfQ1JFQVRFX1NFUlZJQ0UpOworICAgIGlmKCFzY20pIHsKKyAgICAgICAgZXJyb3JfYm94KFRFWFQoIk9wZW5TQ01hbmFnZXIiKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBHZXRNb2R1bGVGaWxlTmFtZSgwLCBzdHVubmVsX2V4ZV9wYXRoLCBNQVhfUEFUSCk7CisgICAgc2VydmljZV9wYXRoPXN0cl90cHJpbnRmKFRFWFQoIlwiJXNcIiAtc2VydmljZSAlcyIpLAorICAgICAgICBzdHVubmVsX2V4ZV9wYXRoLCBnZXRfcGFyYW1zKCkpOworICAgIHNlcnZpY2U9Q3JlYXRlU2VydmljZShzY20sIFNFUlZJQ0VfTkFNRSwgU0VSVklDRV9ESVNQTEFZX05BTUUsCisgICAgICAgIFNFUlZJQ0VfQUxMX0FDQ0VTUywKKyAgICAgICAgU0VSVklDRV9XSU4zMl9PV05fUFJPQ0VTU3xTRVJWSUNFX0lOVEVSQUNUSVZFX1BST0NFU1MsCisgICAgICAgIFNFUlZJQ0VfQVVUT19TVEFSVCwgU0VSVklDRV9FUlJPUl9OT1JNQUwsIHNlcnZpY2VfcGF0aCwKKyAgICAgICAgTlVMTCwgTlVMTCwgVEVYVCgiVENQSVBcMCIpLCBOVUxMLCBOVUxMKTsKKyAgICBpZighc2VydmljZSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiQ3JlYXRlU2VydmljZSIpKTsKKyAgICAgICAgc3RyX2ZyZWUoc2VydmljZV9wYXRoKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzdHJfZnJlZShzZXJ2aWNlX3BhdGgpOworICAgIGlmKExvYWRTdHJpbmcoZ2hJbnN0LCBJRFNfU0VSVklDRV9ERVNDLCBkZXNjcl9zdHIsIERFU0NSX0xFTikpIHsKKyAgICAgICAgZGVzY3IubHBEZXNjcmlwdGlvbj1kZXNjcl9zdHI7CisgICAgICAgIENoYW5nZVNlcnZpY2VDb25maWcyKHNlcnZpY2UsIFNFUlZJQ0VfQ09ORklHX0RFU0NSSVBUSU9OLCAmZGVzY3IpOworICAgIH0KKyAgICBtZXNzYWdlX2JveChURVhUKCJTZXJ2aWNlIGluc3RhbGxlZCIpLCBNQl9JQ09OSU5GT1JNQVRJT04pOworICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtKTsKKyAgICByZXR1cm4gMDsKK30KKworTk9FWFBPUlQgaW50IHNlcnZpY2VfdW5pbnN0YWxsKHZvaWQpIHsKKyAgICBTQ19IQU5ETEUgc2NtLCBzZXJ2aWNlOworICAgIFNFUlZJQ0VfU1RBVFVTIHNlcnZpY2VTdGF0dXM7CisKKyAgICBzY209T3BlblNDTWFuYWdlcigwLCAwLCBTQ19NQU5BR0VSX0NPTk5FQ1QpOworICAgIGlmKCFzY20pIHsKKyAgICAgICAgZXJyb3JfYm94KFRFWFQoIk9wZW5TQ01hbmFnZXIiKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzZXJ2aWNlPU9wZW5TZXJ2aWNlKHNjbSwgU0VSVklDRV9OQU1FLCBTRVJWSUNFX1FVRVJZX1NUQVRVU3xERUxFVEUpOworICAgIGlmKCFzZXJ2aWNlKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJPcGVuU2VydmljZSIpKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighUXVlcnlTZXJ2aWNlU3RhdHVzKHNlcnZpY2UsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiUXVlcnlTZXJ2aWNlU3RhdHVzIikpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2VydmljZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZSE9U0VSVklDRV9TVE9QUEVEKSB7CisgICAgICAgIG1lc3NhZ2VfYm94KFRFWFQoIlRoZSBzZXJ2aWNlIGlzIHN0aWxsIHJ1bm5pbmciKSwgTUJfSUNPTkVSUk9SKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNlcnZpY2UpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFEZWxldGVTZXJ2aWNlKHNlcnZpY2UpKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJEZWxldGVTZXJ2aWNlIikpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2VydmljZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgbWVzc2FnZV9ib3goVEVYVCgiU2VydmljZSB1bmluc3RhbGxlZCIpLCBNQl9JQ09OSU5GT1JNQVRJT04pOworICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtKTsKKyAgICByZXR1cm4gMDsKK30KKworTk9FWFBPUlQgaW50IHNlcnZpY2Vfc3RhcnQodm9pZCkgeworICAgIFNDX0hBTkRMRSBzY20sIHNlcnZpY2U7CisgICAgU0VSVklDRV9TVEFUVVMgc2VydmljZVN0YXR1czsKKworICAgIHNjbT1PcGVuU0NNYW5hZ2VyKDAsIDAsIFNDX01BTkFHRVJfQ09OTkVDVCk7CisgICAgaWYoIXNjbSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiT3BlblNDTWFuYWdlciIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNlcnZpY2U9T3BlblNlcnZpY2Uoc2NtLCBTRVJWSUNFX05BTUUsIFNFUlZJQ0VfUVVFUllfU1RBVFVTfFNFUlZJQ0VfU1RBUlQpOworICAgIGlmKCFzZXJ2aWNlKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJPcGVuU2VydmljZSIpKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighU3RhcnRTZXJ2aWNlKHNlcnZpY2UsIDAsIE5VTEwpKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJTdGFydFNlcnZpY2UiKSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIFNsZWVwKDEwMDApOworICAgICAgICBpZighUXVlcnlTZXJ2aWNlU3RhdHVzKHNlcnZpY2UsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICAgICAgZXJyb3JfYm94KFRFWFQoIlF1ZXJ5U2VydmljZVN0YXR1cyIpKTsKKyAgICAgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKHNlcnZpY2VTdGF0dXMuZHdDdXJyZW50U3RhdGU9PVNFUlZJQ0VfU1RBUlRfUEVORElORyk7CisgICAgaWYoc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZSE9U0VSVklDRV9SVU5OSU5HKSB7CisgICAgICAgIG1lc3NhZ2VfYm94KFRFWFQoIkZhaWxlZCB0byBzdGFydCBzZXJ2aWNlIiksIE1CX0lDT05FUlJPUik7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBtZXNzYWdlX2JveChURVhUKCJTZXJ2aWNlIHN0YXJ0ZWQiKSwgTUJfSUNPTklORk9STUFUSU9OKTsKKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2VydmljZSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgcmV0dXJuIDA7Cit9CisKK05PRVhQT1JUIGludCBzZXJ2aWNlX3N0b3Aodm9pZCkgeworICAgIFNDX0hBTkRMRSBzY20sIHNlcnZpY2U7CisgICAgU0VSVklDRV9TVEFUVVMgc2VydmljZVN0YXR1czsKKworICAgIHNjbT1PcGVuU0NNYW5hZ2VyKDAsIDAsIFNDX01BTkFHRVJfQ09OTkVDVCk7CisgICAgaWYoIXNjbSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiT3BlblNDTWFuYWdlciIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNlcnZpY2U9T3BlblNlcnZpY2Uoc2NtLCBTRVJWSUNFX05BTUUsIFNFUlZJQ0VfUVVFUllfU1RBVFVTfFNFUlZJQ0VfU1RPUCk7CisgICAgaWYoIXNlcnZpY2UpIHsKKyAgICAgICAgZXJyb3JfYm94KFRFWFQoIk9wZW5TZXJ2aWNlIikpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFRdWVyeVNlcnZpY2VTdGF0dXMoc2VydmljZSwgJnNlcnZpY2VTdGF0dXMpKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJRdWVyeVNlcnZpY2VTdGF0dXMiKSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihzZXJ2aWNlU3RhdHVzLmR3Q3VycmVudFN0YXRlPT1TRVJWSUNFX1NUT1BQRUQpIHsKKyAgICAgICAgbWVzc2FnZV9ib3goVEVYVCgiVGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBzdG9wcGVkIiksIE1CX0lDT05FUlJPUik7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighQ29udHJvbFNlcnZpY2Uoc2VydmljZSwgU0VSVklDRV9DT05UUk9MX1NUT1AsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiQ29udHJvbFNlcnZpY2UiKSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIFNsZWVwKDEwMDApOworICAgICAgICBpZighUXVlcnlTZXJ2aWNlU3RhdHVzKHNlcnZpY2UsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICAgICAgZXJyb3JfYm94KFRFWFQoIlF1ZXJ5U2VydmljZVN0YXR1cyIpKTsKKyAgICAgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKHNlcnZpY2VTdGF0dXMuZHdDdXJyZW50U3RhdGUhPVNFUlZJQ0VfU1RPUFBFRCk7CisgICAgbWVzc2FnZV9ib3goVEVYVCgiU2VydmljZSBzdG9wcGVkIiksIE1CX0lDT05JTkZPUk1BVElPTik7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNlcnZpY2UpOworICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgIHJldHVybiAwOworfQorCitOT0VYUE9SVCBpbnQgc2VydmljZV91c2VyKERXT1JEIHNpZykgeworICAgIFNDX0hBTkRMRSBzY20sIHNlcnZpY2U7CisgICAgU0VSVklDRV9TVEFUVVMgc2VydmljZVN0YXR1czsKKworICAgIHNjbT1PcGVuU0NNYW5hZ2VyKDAsIDAsIFNDX01BTkFHRVJfQ09OTkVDVCk7CisgICAgaWYoIXNjbSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiT3BlblNDTWFuYWdlciIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNlcnZpY2U9T3BlblNlcnZpY2Uoc2NtLCBTRVJWSUNFX05BTUUsCisgICAgICAgIFNFUlZJQ0VfUVVFUllfU1RBVFVTfFNFUlZJQ0VfVVNFUl9ERUZJTkVEX0NPTlRST0wpOworICAgIGlmKCFzZXJ2aWNlKSB7CisgICAgICAgIGVycm9yX2JveChURVhUKCJPcGVuU2VydmljZSIpKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighUXVlcnlTZXJ2aWNlU3RhdHVzKHNlcnZpY2UsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiUXVlcnlTZXJ2aWNlU3RhdHVzIikpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2VydmljZSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY20pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZT09U0VSVklDRV9TVE9QUEVEKSB7CisgICAgICAgIG1lc3NhZ2VfYm94KFRFWFQoIlRoZSBzZXJ2aWNlIGlzIHN0b3BwZWQiKSwgTUJfSUNPTkVSUk9SKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNlcnZpY2UpOworICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFDb250cm9sU2VydmljZShzZXJ2aWNlLCBTRVJWSUNFX0NPTlRST0xfVVNFUitzaWcsICZzZXJ2aWNlU3RhdHVzKSkgeworICAgICAgICBlcnJvcl9ib3goVEVYVCgiQ29udHJvbFNlcnZpY2UiKSk7CisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzZXJ2aWNlKTsKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzd2l0Y2goc2lnKSB7CisgICAgICAgIGNhc2UgU0lHTkFMX1JFTE9BRF9DT05GSUc6CisgICAgICAgICAgICBtZXNzYWdlX2JveChURVhUKCJTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gcmVsb2FkZWQiKSwKKyAgICAgICAgICAgICAgICBNQl9JQ09OSU5GT1JNQVRJT04pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lHTkFMX1JFT1BFTl9MT0c6CisgICAgICAgICAgICBtZXNzYWdlX2JveChURVhUKCJTZXJ2aWNlIGxvZyBmaWxlIHJlb3BlbmVkIiksCisgICAgICAgICAgICAgICAgTUJfSUNPTklORk9STUFUSU9OKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWVzc2FnZV9ib3goVEVYVCgiVW5kZWZpbmVkIG9wZXJhdGlvbiByZXF1ZXN0ZWQiKSwKKyAgICAgICAgICAgICAgICBNQl9JQ09OSU5GT1JNQVRJT04pOworICAgIH0KKyAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2VydmljZSk7CisgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbSk7CisgICAgcmV0dXJuIDA7Cit9CisKK05PRVhQT1JUIHZvaWQgV0lOQVBJIHNlcnZpY2VfbWFpbihEV09SRCBhcmdjLCBMUFRTVFIqIGFyZ3YpIHsKKyAgICAodm9pZClhcmdjOyAvKiBza2lwIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlciAqLworICAgICh2b2lkKWFyZ3Y7IC8qIHNraXAgd2FybmluZyBhYm91dCB1bnVzZWQgcGFyYW1ldGVyICovCisKKyAgICB0bHNfYWxsb2MoTlVMTCwgTlVMTCwgInNlcnZpY2UiKTsgLyogbmV3IHRocmVhZC1sb2NhbCBzdG9yYWdlICovCisKKyAgICAvKiBpbml0aWFsaXNlIHNlcnZpY2Ugc3RhdHVzICovCisgICAgc2VydmljZVN0YXR1cy5kd1NlcnZpY2VUeXBlPVNFUlZJQ0VfV0lOMzI7CisgICAgc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZT1TRVJWSUNFX1NUT1BQRUQ7CisgICAgc2VydmljZVN0YXR1cy5kd0NvbnRyb2xzQWNjZXB0ZWQ9MDsKKyAgICBzZXJ2aWNlU3RhdHVzLmR3V2luMzJFeGl0Q29kZT1OT19FUlJPUjsKKyAgICBzZXJ2aWNlU3RhdHVzLmR3U2VydmljZVNwZWNpZmljRXhpdENvZGU9Tk9fRVJST1I7CisgICAgc2VydmljZVN0YXR1cy5kd0NoZWNrUG9pbnQ9MDsKKyAgICBzZXJ2aWNlU3RhdHVzLmR3V2FpdEhpbnQ9MDsKKworICAgIHNlcnZpY2VTdGF0dXNIYW5kbGU9CisgICAgICAgIFJlZ2lzdGVyU2VydmljZUN0cmxIYW5kbGVyKFNFUlZJQ0VfTkFNRSwgY29udHJvbF9oYW5kbGVyKTsKKworICAgIGlmKHNlcnZpY2VTdGF0dXNIYW5kbGUpIHsKKyAgICAgICAgLyogc2VydmljZSBpcyBzdGFydGluZyAqLworICAgICAgICBzZXJ2aWNlU3RhdHVzLmR3Q3VycmVudFN0YXRlPVNFUlZJQ0VfU1RBUlRfUEVORElORzsKKyAgICAgICAgU2V0U2VydmljZVN0YXR1cyhzZXJ2aWNlU3RhdHVzSGFuZGxlLCAmc2VydmljZVN0YXR1cyk7CisKKyAgICAgICAgLyogcnVubmluZyAqLworICAgICAgICBzZXJ2aWNlU3RhdHVzLmR3Q29udHJvbHNBY2NlcHRlZHw9CisgICAgICAgICAgICAoU0VSVklDRV9BQ0NFUFRfU1RPUHxTRVJWSUNFX0FDQ0VQVF9TSFVURE9XTik7CisgICAgICAgIHNlcnZpY2VTdGF0dXMuZHdDdXJyZW50U3RhdGU9U0VSVklDRV9SVU5OSU5HOworICAgICAgICBTZXRTZXJ2aWNlU3RhdHVzKHNlcnZpY2VTdGF0dXNIYW5kbGUsICZzZXJ2aWNlU3RhdHVzKTsKKworICAgICAgICBndWlfbG9vcCgpOworCisgICAgICAgIC8qIHNlcnZpY2Ugd2FzIHN0b3BwZWQgKi8KKyAgICAgICAgc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZT1TRVJWSUNFX1NUT1BfUEVORElORzsKKyAgICAgICAgU2V0U2VydmljZVN0YXR1cyhzZXJ2aWNlU3RhdHVzSGFuZGxlLCAmc2VydmljZVN0YXR1cyk7CisKKyAgICAgICAgLyogc2VydmljZSBpcyBub3cgc3RvcHBlZCAqLworICAgICAgICBzZXJ2aWNlU3RhdHVzLmR3Q29udHJvbHNBY2NlcHRlZCY9CisgICAgICAgICAgICAoRFdPUkQpfihTRVJWSUNFX0FDQ0VQVF9TVE9QfFNFUlZJQ0VfQUNDRVBUX1NIVVRET1dOKTsKKyAgICAgICAgc2VydmljZVN0YXR1cy5kd0N1cnJlbnRTdGF0ZT1TRVJWSUNFX1NUT1BQRUQ7CisgICAgICAgIFNldFNlcnZpY2VTdGF0dXMoc2VydmljZVN0YXR1c0hhbmRsZSwgJnNlcnZpY2VTdGF0dXMpOworICAgIH0KK30KKworTk9FWFBPUlQgdm9pZCBXSU5BUEkgY29udHJvbF9oYW5kbGVyKERXT1JEIGNvbnRyb2xDb2RlKSB7CisgICAgc3dpdGNoKGNvbnRyb2xDb2RlKSB7CisgICAgY2FzZSBTRVJWSUNFX0NPTlRST0xfSU5URVJST0dBVEU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX1NIVVRET1dOOgorICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX1NUT1A6CisgICAgICAgIHNlcnZpY2VTdGF0dXMuZHdDdXJyZW50U3RhdGU9U0VSVklDRV9TVE9QX1BFTkRJTkc7CisgICAgICAgIFNldFNlcnZpY2VTdGF0dXMoc2VydmljZVN0YXR1c0hhbmRsZSwgJnNlcnZpY2VTdGF0dXMpOworICAgICAgICBQb3N0TWVzc2FnZShod25kLCBXTV9DT01NQU5ELCBJRE1fRVhJVCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9QQVVTRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRVJWSUNFX0NPTlRST0xfQ09OVElOVUU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX1VTRVIrU0lHTkFMX1JFTE9BRF9DT05GSUc6CisgICAgICAgIHNpZ25hbF9wb3N0KFNJR05BTF9SRUxPQURfQ09ORklHKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRVJWSUNFX0NPTlRST0xfVVNFUitTSUdOQUxfUkVPUEVOX0xPRzoKKyAgICAgICAgc2lnbmFsX3Bvc3QoU0lHTkFMX1JFT1BFTl9MT0cpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZihjb250cm9sQ29kZSA+PSAxMjggJiYgY29udHJvbENvZGUgPD0gMjU1KQorICAgICAgICAgICAgYnJlYWs7IC8qIHVzZXIgZGVmaW5lZCBjb250cm9sIGNvZGUgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7IC8qIHVucmVjb2duaXNlZCBjb250cm9sIGNvZGUgKi8KKyAgICB9CisgICAgU2V0U2VydmljZVN0YXR1cyhzZXJ2aWNlU3RhdHVzSGFuZGxlLCAmc2VydmljZVN0YXR1cyk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfV0lOMzJfV0NFKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBvdGhlciBmdW5jdGlvbnMgKi8KKworTk9FWFBPUlQgTFBUU1RSIGdldF9wYXJhbXMoKSB7CisgICAgTFBUU1RSIGM7CisgICAgVENIQVIgczsKKworICAgIGM9R2V0Q29tbWFuZExpbmUoKTsKKyAgICBpZigqYz09VEVYVCgnXCInKSkgeworICAgICAgICBzPVRFWFQoJ1wiJyk7CisgICAgICAgICsrYzsKKyAgICB9IGVsc2UgeworICAgICAgICBzPVRFWFQoJyAnKTsKKyAgICB9CisgICAgZm9yKDsgKmM7ICsrYykKKyAgICAgICAgaWYoKmM9PXMpIHsKKyAgICAgICAgICAgICsrYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgd2hpbGUoKmM9PVRFWFQoJyAnKSkKKyAgICAgICAgKytjOworICAgIHJldHVybiBjOworfQorCisvKiBlbmQgb2YgdWlfd2luX2d1aS5jICovCmRpZmYgLS1naXQgYS9zcmMvdmMubWFrIGIvc3JjL3ZjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzUwNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZjLm1hawpAQCAtMCwwICsxLDEwNSBAQAorIyB2Yy5tYWsgYnkgTWljaGFsIFRyb2puYXJhIDE5OTgtMjAxNQ0KKyMgd2l0aCBoZWxwIG9mIERhdmlkIEdpbGxpbmdoYW0gPGRnaWxsaW5naGFtQGdtYWlsLmNvbT4NCisjIHdpdGggaGVscCBvZiBQaWVycmUgRGVsYWFnZSA8ZGVsYWFnZS5waWVycmVAZnJlZS5mcj4NCisNCisjIHRoZSBjb21waWxhdGlvbiByZXF1aXJlczoNCisjIC0gVmlzdWFsIEMrKyAyMDA1IEV4cHJlc3MgRWRpdGlvbiB3aXRoIFBsYXRmb3JtIFNESw0KKyMgICBodHRwOi8vc29jaWFsLm1zZG4ubWljcm9zb2Z0LmNvbS9mb3J1bXMvZW4tVVMvVnNleHByZXNzdmMvdGhyZWFkL2M1YzNhZmFkLWY0YzYtNGQyNy1iNDcxLTAyOTFlMDk5YTc0Mi8NCisjIC0gVmlzdWFsIEMrKyAyMDA1IFByb2Zlc3Npb25hbCBFZGl0aW9uDQorIyAtIFZpc3VhbCBDKysgMjAwOCBFeHByZXNzIEVkaXRpb24NCisNCishSUYgW21sNjQuZXhlIC9oZWxwID5OVUwgMj4mMV0NCitUQVJHRVQ9d2luMzINCishRUxTRQ0KK1RBUkdFVD13aW42NA0KKyFFTkRJRg0KKyFNRVNTQUdFIERldGVjdGVkIHRhcmdldDogJChUQVJHRVQpDQorIU1FU1NBR0UNCisNCisjIG1vZGlmeSB0aGlzIHRvIHBvaW50IHRvIHlvdXIgT3BlblNTTCBkaXJlY3RvcnkNCisjIGVpdGhlciBpbnN0YWxsIGEgcHJlY29tcGlsZWQgdmVyc2lvbiAoKm5vdCogdGhlICJMaWdodCIgb25lKSBmcm9tDQorIyBodHRwOi8vd3d3LnNscHJvd2ViLmNvbS9wcm9kdWN0cy9XaW4zMk9wZW5TU0wuaHRtbA0KKyNTU0xESVI9QzpcT3BlblNTTC1XaW4zMg0KKyNJTkNESVI9JChTU0xESVIpXGluY2x1ZGUNCisjTElCRElSPSQoU1NMRElSKVxsaWINCisjIG9yIGNvbXBpbGUgb25lIHlvdXJzZWxmDQorU1NMRElSPS4uXC4uXG9wZW5zc2wtMS4wLjJkLSQoVEFSR0VUKQ0KK0lOQ0RJUj0kKFNTTERJUilcaW5jMzINCitMSUJESVI9JChTU0xESVIpXG91dDMyZGxsDQorIyBvciBzaW1wbHkgaW5zdGFsbCB3aXRoICJubWFrZSAtZiBtc1xudGRsbC5tYWsgaW5zdGFsbCINCisjU1NMRElSPVx1c3JcbG9jYWxcc3NsDQorI0lOQ0RJUj0kKFNTTERJUilcaW5jbHVkZQ0KKyNMSUJESVI9JChTU0xESVIpXGxpYg0KKw0KK1NSQz0uLlxzcmMNCitPQkpST09UPS4uXG9iag0KK09CSj0kKE9CSlJPT1QpXCQoVEFSR0VUKQ0KK0JJTlJPT1Q9Li5cYmluDQorQklOPSQoQklOUk9PVClcJChUQVJHRVQpDQorDQorU0hBUkVET0JKUz0kKE9CSilcc3R1bm5lbC5vYmogJChPQkopXHNzbC5vYmogJChPQkopXGN0eC5vYmogXA0KKwkkKE9CSilcdmVyaWZ5Lm9iaiAkKE9CSilcZmlsZS5vYmogJChPQkopXGNsaWVudC5vYmogXA0KKwkkKE9CSilccHJvdG9jb2wub2JqICQoT0JKKVxzdGhyZWFkcy5vYmogJChPQkopXGxvZy5vYmogXA0KKwkkKE9CSilcb3B0aW9ucy5vYmogJChPQkopXG5ldHdvcmsub2JqICQoT0JKKVxyZXNvbHZlci5vYmogXA0KKwkkKE9CSilcc3RyLm9iaiAkKE9CSilcdGxzLm9iaiAkKE9CSilcZmQub2JqICQoT0JKKVxkaHBhcmFtLm9iaiBcDQorCSQoT0JKKVxjcm9uLm9iag0KK0dVSU9CSlM9JChPQkopXHVpX3dpbl9ndWkub2JqICQoT0JKKVxyZXNvdXJjZXMucmVzDQorQ0xJT0JKUz0kKE9CSilcdWlfd2luX2NsaS5vYmoNCisNCitDQz1jbA0KK0xJTks9bGluaw0KKw0KK1VOSUNPREVGTEFHUz0vRFVOSUNPREUgL0RfVU5JQ09ERQ0KK0NGTEFHUz0vTUQgL1czIC9PMiAvbm9sb2dvIC9JIiQoSU5DRElSKSIgJChVTklDT0RFRkxBR1MpDQorTERGTEFHUz0vTk9MT0dPIC9ERUJVRw0KKw0KK1NIQVJFRExJQlM9d3MyXzMyLmxpYiB1c2VyMzIubGliIHNoZWxsMzIubGliDQorR1VJTElCUz1hZHZhcGkzMi5saWIgY29tZGxnMzIubGliIGNyeXB0MzIubGliIGdkaTMyLmxpYiBwc2FwaS5saWINCitDTElMSUJTPQ0KK1NTTExJQlM9L0xJQlBBVEg6IiQoTElCRElSKSIgbGliZWF5MzIubGliIHNzbGVheTMyLmxpYg0KKyMgc3RhdGljIGxpbmtpbmc6DQorIwkvTElCUEFUSDoiJChMSUJESVIpXFZDXHN0YXRpYyIgbGliZWF5MzJNRC5saWIgc3NsZWF5MzJNRC5saWINCisNCit7JChTUkMpXH0uY3skKE9CSilcfS5vYmo6DQorCSQoQ0MpICQoQ0ZMQUdTKSAtRm8kQCAtYyAkPA0KKw0KK3skKFNSQylcfS5yY3skKE9CSilcfS5yZXM6DQorCSQoUkMpIC1mbyRAIC1yICQ8DQorDQorYWxsOiBidWlsZA0KKw0KK2J1aWxkOiBtYWtlZGlycyAkKEJJTilcc3R1bm5lbC5leGUgJChCSU4pXHRzdHVubmVsLmV4ZQ0KKw0KK2NsZWFuOg0KKwktQCBkZWwgJChTSEFSRURPQkpTKSA+TlVMIDI+JjENCisJLUAgZGVsICQoR1VJT0JKUykgPk5VTCAyPiYxDQorCS1AIGRlbCAkKENMSU9CSlMpID5OVUwgMj4mMQ0KKyMJLUAgZGVsICoubWFuaWZlc3QgPk5VTCAyPiYxDQorCS1AIGRlbCAkKEJJTilcc3R1bm5lbC5leGUgPk5VTCAyPiYxDQorCS1AIGRlbCAkKEJJTilcc3R1bm5lbC5leGUubWFuaWZlc3QgPk5VTCAyPiYxDQorCS1AIGRlbCAkKEJJTilcdHN0dW5uZWwuZXhlID5OVUwgMj4mMQ0KKwktQCBkZWwgJChCSU4pXHRzdHVubmVsLmV4ZS5tYW5pZmVzdCA+TlVMIDI+JjENCisJLUAgcm1kaXIgJChPQkopID5OVUwgMj4mMQ0KKwktQCBybWRpciAkKEJJTikgPk5VTCAyPiYxDQorDQorbWFrZWRpcnM6DQorCS1AIElGIE5PVCBFWElTVCAkKE9CSlJPT1QpIG1rZGlyICQoT0JKUk9PVCkgPk5VTCAyPiYxDQorCS1AIElGIE5PVCBFWElTVCAkKE9CSikgbWtkaXIgJChPQkopID5OVUwgMj4mMQ0KKwktQCBJRiBOT1QgRVhJU1QgJChCSU5ST09UKSBta2RpciAkKEJJTlJPT1QpID5OVUwgMj4mMQ0KKwktQCBJRiBOT1QgRVhJU1QgJChCSU4pIG1rZGlyICQoQklOKSA+TlVMIDI+JjENCisNCiskKFNIQVJFRE9CSlMpOiAqLmggdmMubWFrDQorJChHVUlPQkpTKTogKi5oIHZjLm1haw0KKyQoQ0xJT0JKUyk6ICouaCB2Yy5tYWsNCisNCiskKEJJTilcc3R1bm5lbC5leGU6ICQoU0hBUkVET0JKUykgJChHVUlPQkpTKQ0KKwkkKExJTkspICQoTERGTEFHUykgJChTSEFSRURMSUJTKSAkKEdVSUxJQlMpICQoU1NMTElCUykgL09VVDokQCAkKioNCisJSUYgRVhJU1QgJEAubWFuaWZlc3QgXA0KKwkJbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzENCisNCiskKEJJTilcdHN0dW5uZWwuZXhlOiAkKFNIQVJFRE9CSlMpICQoQ0xJT0JKUykNCisJJChMSU5LKSAkKExERkxBR1MpICQoU0hBUkVETElCUykgJChDTElMSUJTKSAkKFNTTExJQlMpIC9PVVQ6JEAgJCoqDQorCUlGIEVYSVNUICRALm1hbmlmZXN0IFwNCisJCW10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxDQorDQorIyBlbmQgb2YgdmMubWFrDQpkaWZmIC0tZ2l0IGEvc3JjL3ZlcmlmeS5jIGIvc3JjL3ZlcmlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzYxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmVyaWZ5LmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiAgIHN0dW5uZWwgICAgICAgVExTIG9mZmxvYWRpbmcgYW5kIGxvYWQtYmFsYW5jaW5nIHByb3h5CisgKiAgIENvcHlyaWdodCAoQykgMTk5OC0yMDE1IE1pY2hhbCBUcm9qbmFyYSA8TWljaGFsLlRyb2puYXJhQG1pcnQubmV0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiAgIExpbmtpbmcgc3R1bm5lbCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcKKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorICoKKyAqICAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwKKyAqICAgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvcgorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvcgorICogICBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkKKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcgorICogICBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorICoKKyAqICAgTm90ZSB0aGF0IHBlb3BsZSB3aG8gbWFrZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdHVubmVsIGFyZSBub3Qgb2JsaWdhdGVkCisgKiAgIHRvIGdyYW50IHRoaXMgc3BlY2lhbCBleGNlcHRpb24gZm9yIHRoZWlyIG1vZGlmaWVkIHZlcnNpb25zOyBpdCBpcyB0aGVpcgorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24KKyAqICAgdG8gcmVsZWFzZSBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCB0aGlzIGV4Y2VwdGlvbjsgdGhpcyBleGNlcHRpb24KKyAqICAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aGljaCBjYXJyaWVzCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJvdG90eXBlcyAqLworCisvKiB2ZXJpZnkgaW5pdGlhbGl6YXRpb24gKi8KK05PRVhQT1JUIHZvaWQgc2V0X2NsaWVudF9DQV9saXN0KFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbik7CitOT0VYUE9SVCB2b2lkIGF1dGhfd2FybmluZ3MoU0VSVklDRV9PUFRJT05TICopOworTk9FWFBPUlQgaW50IGxvYWRfZmlsZV9sb29rdXAoWDUwOV9TVE9SRSAqLCBjaGFyICopOworTk9FWFBPUlQgaW50IGFkZF9kaXJfbG9va3VwKFg1MDlfU1RPUkUgKiwgY2hhciAqKTsKKworLyogdmVyaWZ5IGNhbGxiYWNrICovCitOT0VYUE9SVCBpbnQgdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFggKik7CitOT0VYUE9SVCBpbnQgdmVyaWZ5X2NoZWNrcyhDTEkgKiwgaW50LCBYNTA5X1NUT1JFX0NUWCAqKTsKK05PRVhQT1JUIGludCBjZXJ0X2NoZWNrKENMSSAqLCBYNTA5X1NUT1JFX0NUWCAqLCBpbnQpOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMCitOT0VYUE9SVCBpbnQgY2VydF9jaGVja19zdWJqZWN0KENMSSAqLCBYNTA5X1NUT1JFX0NUWCAqKTsKKyNlbmRpZiAvKiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAyMDAwTCAqLworTk9FWFBPUlQgaW50IGNlcnRfY2hlY2tfbG9jYWwoWDUwOV9TVE9SRV9DVFggKik7CitOT0VYUE9SVCBpbnQgY29tcGFyZV9wdWJrZXlzKFg1MDkgKiwgWDUwOSAqKTsKK05PRVhQT1JUIGludCBjcmxfY2hlY2soQ0xJICosIFg1MDlfU1RPUkVfQ1RYICopOworI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKK05PRVhQT1JUIGludCBvY3NwX2NoZWNrKENMSSAqLCBYNTA5X1NUT1JFX0NUWCAqKTsKK05PRVhQT1JUIGludCBvY3NwX3JlcXVlc3QoQ0xJICosIFg1MDlfU1RPUkVfQ1RYICosIE9DU1BfQ0VSVElEICosIGNoYXIgKik7CitOT0VYUE9SVCBPQ1NQX1JFU1BPTlNFICpvY3NwX2dldF9yZXNwb25zZShDTEkgKiwgT0NTUF9SRVFVRVNUICosIGNoYXIgKik7CisjZW5kaWYKKworLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQCitOT0VYUE9SVCBYNTA5ICpnZXRfY3VycmVudF9pc3N1ZXIoWDUwOV9TVE9SRV9DVFggKik7CisjZW5kaWYKK05PRVhQT1JUIHZvaWQgbG9nX3RpbWUoY29uc3QgaW50LCBjb25zdCBjaGFyICosIEFTTjFfVElNRSAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdmVyaWZ5IGluaXRpYWxpemF0aW9uICovCisKK2ludCB2ZXJpZnlfaW5pdChTRVJWSUNFX09QVElPTlMgKnNlY3Rpb24pIHsKKyAgICBpbnQgdmVyaWZ5X21vZGU9MDsKKworICAgIC8qIHJldm9jYXRpb24gc3RvcmUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBzZWN0aW9uLT5yZXZvY2F0aW9uX3N0b3JlPVg1MDlfU1RPUkVfbmV3KCk7CisgICAgaWYoIXNlY3Rpb24tPnJldm9jYXRpb25fc3RvcmUpIHsKKyAgICAgICAgc3NsZXJyb3IoIlg1MDlfU1RPUkVfbmV3Iik7CisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICB9CisKKyAgICAvKiBDQSBpbml0aWFsaXphdGlvbiAqLworICAgIGlmKHNlY3Rpb24tPmNhX2ZpbGUpIHsKKyAgICAgICAgaWYoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlY3Rpb24tPmN0eCwKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5jYV9maWxlLCBOVUxMKSkgeworICAgICAgICAgICAgc19sb2coTE9HX0VSUiwgIkVycm9yIGxvYWRpbmcgdmVyaWZ5IGNlcnRpZmljYXRlcyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5jYV9maWxlKTsKKyAgICAgICAgICAgIHNzbGVycm9yKCJTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyIpOworICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgICAgICB9CisgICAgICAgIC8qIHJldm9jYXRpb24gc3RvcmUgbmVlZHMgQ0EgY2VydGlmaWNhdGVzIGZvciBDUkwgdmFsaWRhdGlvbiAqLworICAgICAgICBpZihsb2FkX2ZpbGVfbG9va3VwKHNlY3Rpb24tPnJldm9jYXRpb25fc3RvcmUsIHNlY3Rpb24tPmNhX2ZpbGUpKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgICAgICBpZighc2VjdGlvbi0+b3B0aW9uLmNsaWVudCkgLyogb25seSBwZXJmb3JtZWQgb24gc2VydmVyICovCisgICAgICAgICAgICBzZXRfY2xpZW50X0NBX2xpc3Qoc2VjdGlvbik7CisgICAgfQorICAgIGlmKHNlY3Rpb24tPmNhX2RpcikgeworICAgICAgICBpZighU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VjdGlvbi0+Y3R4LAorICAgICAgICAgICAgICAgIE5VTEwsIHNlY3Rpb24tPmNhX2RpcikpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJFcnJvciBzZXR0aW5nIHZlcmlmeSBkaXJlY3RvcnkgdG8gJXMiLAorICAgICAgICAgICAgICAgIHNlY3Rpb24tPmNhX2Rpcik7CisgICAgICAgICAgICBzc2xlcnJvcigiU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMiKTsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBzX2xvZyhMT0dfSU5GTywgIlZlcmlmeSBkaXJlY3Rvcnkgc2V0IHRvICVzIiwgc2VjdGlvbi0+Y2FfZGlyKTsKKyAgICAgICAgLyogcmV2b2NhdGlvbiBzdG9yZSBuZWVkcyBDQSBjZXJ0aWZpY2F0ZXMgZm9yIENSTCB2YWxpZGF0aW9uICovCisgICAgICAgIGFkZF9kaXJfbG9va3VwKHNlY3Rpb24tPnJldm9jYXRpb25fc3RvcmUsIHNlY3Rpb24tPmNhX2Rpcik7CisgICAgfQorCisgICAgLyogQ1JMIGluaXRpYWxpemF0aW9uICovCisgICAgaWYoc2VjdGlvbi0+Y3JsX2ZpbGUpCisgICAgICAgIGlmKGxvYWRfZmlsZV9sb29rdXAoc2VjdGlvbi0+cmV2b2NhdGlvbl9zdG9yZSwgc2VjdGlvbi0+Y3JsX2ZpbGUpKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZBSUxFRCAqLworICAgIGlmKHNlY3Rpb24tPmNybF9kaXIpIHsKKyAgICAgICAgc2VjdGlvbi0+cmV2b2NhdGlvbl9zdG9yZS0+Y2FjaGU9MDsgLyogZG9uJ3QgY2FjaGUgQ1JMcyAqLworICAgICAgICBhZGRfZGlyX2xvb2t1cChzZWN0aW9uLT5yZXZvY2F0aW9uX3N0b3JlLCBzZWN0aW9uLT5jcmxfZGlyKTsKKyAgICB9CisKKyAgICAvKiB2ZXJpZnkgY2FsbGJhY2sgc2V0dXAgKi8KKyAgICBpZihzZWN0aW9uLT52ZXJpZnlfbGV2ZWw+PTApCisgICAgICAgIHZlcmlmeV9tb2RlfD1TU0xfVkVSSUZZX1BFRVI7CisgICAgaWYoc2VjdGlvbi0+dmVyaWZ5X2xldmVsPj0yICYmICFzZWN0aW9uLT5yZWRpcmVjdF9hZGRyLm5hbWVzKQorICAgICAgICB2ZXJpZnlfbW9kZXw9U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVDsKKyAgICBTU0xfQ1RYX3NldF92ZXJpZnkoc2VjdGlvbi0+Y3R4LCB2ZXJpZnlfbW9kZSwgdmVyaWZ5X2NhbGxiYWNrKTsKKyAgICBhdXRoX3dhcm5pbmdzKHNlY3Rpb24pOworCisgICAgcmV0dXJuIDA7IC8qIE9LICovCit9CisKKy8qIHRydXN0ZWQgQ0EgbmFtZXMgc2VudCB0byBjbGllbnRzIGZvciBjbGllbnQgY2VydCBzZWxlY3Rpb24gKi8KK05PRVhQT1JUIHZvaWQgc2V0X2NsaWVudF9DQV9saXN0KFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbikgeworICAgIFNUQUNLX09GKFg1MDlfTkFNRSkgKmNhX2RuOworICAgIGNoYXIgKmNhX25hbWU7CisgICAgaW50IGk7CisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJDbGllbnQgQ0EgbGlzdDogJXMiLCBzZWN0aW9uLT5jYV9maWxlKTsKKyAgICBjYV9kbj1TU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShzZWN0aW9uLT5jYV9maWxlKTsKKyAgICBmb3IoaT0wOyBpPHNrX1g1MDlfTkFNRV9udW0oY2FfZG4pOyArK2kpIHsKKyAgICAgICAgY2FfbmFtZT1YNTA5X05BTUUydGV4dChza19YNTA5X05BTUVfdmFsdWUoY2FfZG4sIGkpKTsKKyAgICAgICAgc19sb2coTE9HX0lORk8sICJDbGllbnQgQ0E6ICVzIiwgY2FfbmFtZSk7CisgICAgICAgIHN0cl9mcmVlKGNhX25hbWUpOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzZWN0aW9uLT5jdHgsIGNhX2RuKTsKK30KKworLyogaXNzdWUgd2FybmluZ3Mgb24gaW5zZWN1cmUvbWlzc2luZyBhdXRoZW50aWNhdGlvbiAqLworTk9FWFBPUlQgdm9pZCBhdXRoX3dhcm5pbmdzKFNFUlZJQ0VfT1BUSU9OUyAqc2VjdGlvbikgeworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworICAgIGlmKHNlY3Rpb24tPnBza19rZXlzKQorICAgICAgICByZXR1cm47CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19QU0spICovCisgICAgLyogZm9yIHNlcnZlcnMgaXQgaXMgdXN1YWxseSBva2F5IHRvIGFjY2VwdCBhbGwgY2xpZW50CisgICAgICAgY2VydGlmaWNhdGVzIHNpZ25lZCBieSBhIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgKi8KKyAgICBpZighc2VjdGlvbi0+b3B0aW9uLmNsaWVudCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmKHNlY3Rpb24tPnZlcmlmeV9sZXZlbDwyKSB7CisgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLAorICAgICAgICAgICAgIlNlcnZpY2UgWyVzXSBuZWVkcyBhdXRoZW50aWNhdGlvbiB0byBwcmV2ZW50IE1JVE0gYXR0YWNrcyIsCisgICAgICAgICAgICBzZWN0aW9uLT5zZXJ2bmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoc2VjdGlvbi0+dmVyaWZ5X2xldmVsPj0zKSAvKiBsZXZlbHM+PTMgZG9uJ3QgcmVseSBvbiBQS0kgKi8KKyAgICAgICAgcmV0dXJuOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMCisgICAgaWYoc2VjdGlvbi0+Y2hlY2tfZW1haWwgfHwgc2VjdGlvbi0+Y2hlY2tfaG9zdCB8fCBzZWN0aW9uLT5jaGVja19pcCkKKyAgICAgICAgcmV0dXJuOworI2VuZGlmIC8qIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMICovCisgICAgc19sb2coTE9HX1dBUk5JTkcsCisgICAgICAgICJTZXJ2aWNlIFslc10gdXNlcyBcInZlcmlmeSA9IDJcIiB3aXRob3V0IHN1YmplY3QgY2hlY2tzIiwKKyAgICAgICAgc2VjdGlvbi0+c2Vydm5hbWUpOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI8MHgxMDAwMjAwMEwKKyAgICBzX2xvZyhMT0dfV0FSTklORywKKyAgICAgICAgIlJlYnVpbGQgeW91ciBzdHVubmVsIGFnYWluc3QgT3BlblNTTCB2ZXJzaW9uIDEuMC4yIG9yIGhpZ2hlciIpOworI2VuZGlmIC8qIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI8MHgxMDAwMjAwMEwgKi8KKyAgICBzX2xvZyhMT0dfV0FSTklORywKKyAgICAgICAgIlVzZSBcImNoZWNrSG9zdFwiIG9yIFwiY2hlY2tJUFwiIHRvIHJlc3RyaWN0IHRydXN0ZWQgY2VydGlmaWNhdGVzIik7Cit9CisKK05PRVhQT1JUIGludCBsb2FkX2ZpbGVfbG9va3VwKFg1MDlfU1RPUkUgKnN0b3JlLCBjaGFyICpuYW1lKSB7CisgICAgWDUwOV9MT09LVVAgKmxvb2t1cDsKKworICAgIGxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoc3RvcmUsIFg1MDlfTE9PS1VQX2ZpbGUoKSk7CisgICAgaWYoIWxvb2t1cCkgeworICAgICAgICBzc2xlcnJvcigiWDUwOV9TVE9SRV9hZGRfbG9va3VwIik7CisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICB9CisgICAgaWYoIVg1MDlfTE9PS1VQX2xvYWRfZmlsZShsb29rdXAsIG5hbWUsIFg1MDlfRklMRVRZUEVfUEVNKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiRmFpbGVkIHRvIGxvYWQgJXMgcmV2b2NhdGlvbiBsb29rdXAgZmlsZSIsIG5hbWUpOworICAgICAgICBzc2xlcnJvcigiWDUwOV9MT09LVVBfbG9hZF9maWxlIik7CisgICAgICAgIHJldHVybiAxOyAvKiBGQUlMRUQgKi8KKyAgICB9CisgICAgc19sb2coTE9HX0RFQlVHLCAiTG9hZGVkICVzIHJldm9jYXRpb24gbG9va3VwIGZpbGUiLCBuYW1lKTsKKyAgICByZXR1cm4gMDsgLyogT0sgKi8KK30KKworTk9FWFBPUlQgaW50IGFkZF9kaXJfbG9va3VwKFg1MDlfU1RPUkUgKnN0b3JlLCBjaGFyICpuYW1lKSB7CisgICAgWDUwOV9MT09LVVAgKmxvb2t1cDsKKworICAgIGxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoc3RvcmUsIFg1MDlfTE9PS1VQX2hhc2hfZGlyKCkpOworICAgIGlmKCFsb29rdXApIHsKKyAgICAgICAgc3NsZXJyb3IoIlg1MDlfU1RPUkVfYWRkX2xvb2t1cCIpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIGlmKCFYNTA5X0xPT0tVUF9hZGRfZGlyKGxvb2t1cCwgbmFtZSwgWDUwOV9GSUxFVFlQRV9QRU0pKSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJGYWlsZWQgdG8gYWRkICVzIHJldm9jYXRpb24gbG9va3VwIGRpcmVjdG9yeSIsIG5hbWUpOworICAgICAgICBzc2xlcnJvcigiWDUwOV9MT09LVVBfYWRkX2RpciIpOworICAgICAgICByZXR1cm4gMTsgLyogRkFJTEVEICovCisgICAgfQorICAgIHNfbG9nKExPR19ERUJVRywgIkFkZGVkICVzIHJldm9jYXRpb24gbG9va3VwIGRpcmVjdG9yeSIsIG5hbWUpOworICAgIHJldHVybiAwOyAvKiBPSyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2ZXJpZnkgY2FsbGJhY2sgKi8KKworTk9FWFBPUlQgaW50IHZlcmlmeV9jYWxsYmFjayhpbnQgcHJldmVyaWZ5X29rLCBYNTA5X1NUT1JFX0NUWCAqY2FsbGJhY2tfY3R4KSB7CisgICAgICAgIC8qIG91ciB2ZXJpZnkgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBTU0wgKnNzbDsKKyAgICBDTEkgKmM7CisKKyAgICAvKiByZXRyaWV2ZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhICovCisgICAgc3NsPVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKGNhbGxiYWNrX2N0eCwKKyAgICAgICAgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCgpKTsKKyAgICBjPVNTTF9nZXRfZXhfZGF0YShzc2wsIGluZGV4X2NsaSk7CisKKyAgICBpZihjLT5vcHQtPnZlcmlmeV9sZXZlbDwxKSB7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGRpc2FibGVkIik7CisgICAgICAgIHJldHVybiAxOyAvKiBhY2NlcHQgKi8KKyAgICB9CisgICAgaWYodmVyaWZ5X2NoZWNrcyhjLCBwcmV2ZXJpZnlfb2ssIGNhbGxiYWNrX2N0eCkpCisgICAgICAgIHJldHVybiAxOyAvKiBhY2NlcHQgKi8KKyAgICBpZihjLT5vcHQtPm9wdGlvbi5jbGllbnQgfHwgYy0+b3B0LT5wcm90b2NvbCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIHJlamVjdCAqLworICAgIGlmKGMtPm9wdC0+cmVkaXJlY3RfYWRkci5uYW1lcykgeworICAgICAgICBjLT5yZWRpcmVjdD1SRURJUkVDVF9PTjsKKyAgICAgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworICAgIH0KKyAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCit9CisKK05PRVhQT1JUIGludCB2ZXJpZnlfY2hlY2tzKENMSSAqYywKKyAgICAgICAgaW50IHByZXZlcmlmeV9vaywgWDUwOV9TVE9SRV9DVFggKmNhbGxiYWNrX2N0eCkgeworICAgIFg1MDkgKmNlcnQ7CisgICAgaW50IGRlcHRoOworICAgIGNoYXIgKnN1YmplY3Q7CisKKyAgICBjZXJ0PVg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoY2FsbGJhY2tfY3R4KTsKKyAgICBkZXB0aD1YNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoY2FsbGJhY2tfY3R4KTsKKyAgICBzdWJqZWN0PVg1MDlfTkFNRTJ0ZXh0KFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSk7CisKKyAgICBzX2xvZyhMT0dfREVCVUcsICJWZXJpZmljYXRpb24gc3RhcnRlZCBhdCBkZXB0aD0lZDogJXMiLCBkZXB0aCwgc3ViamVjdCk7CisKKyAgICBpZighY2VydF9jaGVjayhjLCBjYWxsYmFja19jdHgsIHByZXZlcmlmeV9vaykpIHsKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJSZWplY3RlZCBieSBDRVJUIGF0IGRlcHRoPSVkOiAlcyIsIGRlcHRoLCBzdWJqZWN0KTsKKyAgICAgICAgc3RyX2ZyZWUoc3ViamVjdCk7CisgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICB9CisgICAgaWYoKGMtPm9wdC0+Y3JsX2ZpbGUgfHwgYy0+b3B0LT5jcmxfZGlyKSAmJgorICAgICAgICAgICAgIWNybF9jaGVjayhjLCBjYWxsYmFja19jdHgpKSB7CisgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiUmVqZWN0ZWQgYnkgQ1JMIGF0IGRlcHRoPSVkOiAlcyIsIGRlcHRoLCBzdWJqZWN0KTsKKyAgICAgICAgc3RyX2ZyZWUoc3ViamVjdCk7CisgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICB9CisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorICAgIGlmKChjLT5vcHQtPm9jc3BfdXJsIHx8IGMtPm9wdC0+b3B0aW9uLmFpYSkgJiYKKyAgICAgICAgICAgICFvY3NwX2NoZWNrKGMsIGNhbGxiYWNrX2N0eCkpIHsKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJSZWplY3RlZCBieSBPQ1NQIGF0IGRlcHRoPSVkOiAlcyIsIGRlcHRoLCBzdWJqZWN0KTsKKyAgICAgICAgc3RyX2ZyZWUoc3ViamVjdCk7CisgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICB9CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19PQ1NQKSAqLworCisgICAgc19sb2coZGVwdGggPyBMT0dfSU5GTyA6IExPR19OT1RJQ0UsCisgICAgICAgICJDZXJ0aWZpY2F0ZSBhY2NlcHRlZCBhdCBkZXB0aD0lZDogJXMiLCBkZXB0aCwgc3ViamVjdCk7CisgICAgc3RyX2ZyZWUoc3ViamVjdCk7CisgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBjZXJ0aWZpY2F0ZSBjaGVja2luZyAqLworCitOT0VYUE9SVCBpbnQgY2VydF9jaGVjayhDTEkgKmMsIFg1MDlfU1RPUkVfQ1RYICpjYWxsYmFja19jdHgsCisgICAgICAgIGludCBwcmV2ZXJpZnlfb2spIHsKKyAgICBpbnQgZGVwdGg9WDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKGNhbGxiYWNrX2N0eCk7CisKKyAgICBpZihwcmV2ZXJpZnlfb2spIHsKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiQ0VSVDogUHJlLXZlcmlmaWNhdGlvbiBzdWNjZWVkZWQiKTsKKyAgICB9IGVsc2UgeyAvKiByZW1vdGUgc2l0ZSBzZW50IGFuIGludmFsaWQgY2VydGlmaWNhdGUgKi8KKyAgICAgICAgaWYoYy0+b3B0LT52ZXJpZnlfbGV2ZWw+PTQgJiYgZGVwdGg+MCkgeworICAgICAgICAgICAgc19sb2coTE9HX0lORk8sICJDRVJUOiBJbnZhbGlkIENBIGNlcnRpZmljYXRlIGlnbm9yZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBhY2NlcHQgKi8KKyAgICAgICAgfQorICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkNFUlQ6IFByZS12ZXJpZmljYXRpb24gZXJyb3I6ICVzIiwKKyAgICAgICAgICAgIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKAorICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihjYWxsYmFja19jdHgpKSk7CisgICAgICAgIC8qIHJldGFpbiB0aGUgU1RPUkVfQ1RYIGVycm9yIHByb2R1Y2VkIGJ5IHByZS12ZXJpZmljYXRpb24gKi8KKyAgICAgICAgcmV0dXJuIDA7IC8qIHJlamVjdCAqLworICAgIH0KKworICAgIGlmKGRlcHRoPT0wKSB7IC8qIGFkZGl0aW9uYWwgcGVlciBjZXJ0aWZpY2F0ZSBjaGVja3MgKi8KKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAyMDAwTAorICAgICAgICBpZighY2VydF9jaGVja19zdWJqZWN0KGMsIGNhbGxiYWNrX2N0eCkpCisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisjZW5kaWYgLyogT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgxMDAwMjAwMEwgKi8KKyAgICAgICAgaWYoYy0+b3B0LT52ZXJpZnlfbGV2ZWw+PTMgJiYgIWNlcnRfY2hlY2tfbG9jYWwoY2FsbGJhY2tfY3R4KSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICB9CisKKyAgICByZXR1cm4gMTsgLyogYWNjZXB0ICovCit9CisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAyMDAwTAorTk9FWFBPUlQgaW50IGNlcnRfY2hlY2tfc3ViamVjdChDTEkgKmMsIFg1MDlfU1RPUkVfQ1RYICpjYWxsYmFja19jdHgpIHsKKyAgICBYNTA5ICpjZXJ0PVg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoY2FsbGJhY2tfY3R4KTsKKyAgICBOQU1FX0xJU1QgKnB0cjsKKyAgICBjaGFyICpwZWVybmFtZT1OVUxMOworCisgICAgaWYoYy0+b3B0LT5jaGVja19ob3N0KSB7CisgICAgICAgIGZvcihwdHI9Yy0+b3B0LT5jaGVja19ob3N0OyBwdHI7IHB0cj1wdHItPm5leHQpCisgICAgICAgICAgICBpZihYNTA5X2NoZWNrX2hvc3QoY2VydCwgcHRyLT5uYW1lLCAwLCAwLCAmcGVlcm5hbWUpPjApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFwdHIpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiQ0VSVDogTm8gbWF0Y2hpbmcgaG9zdCBuYW1lIGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgICAgIH0KKyAgICAgICAgc19sb2coTE9HX0lORk8sICJDRVJUOiBIb3N0IG5hbWUgXCIlc1wiIG1hdGNoZWQgd2l0aCBcIiVzXCIiLAorICAgICAgICAgICAgcHRyLT5uYW1lLCBwZWVybmFtZSk7CisgICAgICAgIE9QRU5TU0xfZnJlZShwZWVybmFtZSk7CisgICAgfQorCisgICAgaWYoYy0+b3B0LT5jaGVja19lbWFpbCkgeworICAgICAgICBmb3IocHRyPWMtPm9wdC0+Y2hlY2tfZW1haWw7IHB0cjsgcHRyPXB0ci0+bmV4dCkKKyAgICAgICAgICAgIGlmKFg1MDlfY2hlY2tfZW1haWwoY2VydCwgcHRyLT5uYW1lLCAwLCAwKT4wKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZighcHRyKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkNFUlQ6IE5vIG1hdGNoaW5nIGVtYWlsIGFkZHJlc3MgZm91bmQiKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICAgICAgfQorICAgICAgICBzX2xvZyhMT0dfSU5GTywgIkNFUlQ6IEVtYWlsIGFkZHJlc3MgXCIlc1wiIG1hdGNoZWQiLCBwdHItPm5hbWUpOworICAgIH0KKworICAgIGlmKGMtPm9wdC0+Y2hlY2tfaXApIHsKKyAgICAgICAgZm9yKHB0cj1jLT5vcHQtPmNoZWNrX2lwOyBwdHI7IHB0cj1wdHItPm5leHQpCisgICAgICAgICAgICBpZihYNTA5X2NoZWNrX2lwX2FzYyhjZXJ0LCBwdHItPm5hbWUsIDApPjApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFwdHIpIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiQ0VSVDogTm8gbWF0Y2hpbmcgSVAgYWRkcmVzcyBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHJlamVjdCAqLworICAgICAgICB9CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiQ0VSVDogSVAgYWRkcmVzcyBcIiVzXCIgbWF0Y2hlZCIsIHB0ci0+bmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworfQorI2VuZGlmIC8qIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVI+PTB4MTAwMDIwMDBMICovCisKK05PRVhQT1JUIGludCBjZXJ0X2NoZWNrX2xvY2FsKFg1MDlfU1RPUkVfQ1RYICpjYWxsYmFja19jdHgpIHsKKyAgICBYNTA5ICpjZXJ0OworICAgIFg1MDlfTkFNRSAqc3ViamVjdDsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSPj0weDEwMDAwMDAwTAorICAgIFNUQUNLX09GKFg1MDkpICpzazsKKyAgICBpbnQgaTsKKyNlbmRpZgorICAgIFg1MDlfT0JKRUNUIG9iajsKKyAgICBpbnQgc3VjY2VzczsKKworICAgIGNlcnQ9WDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjYWxsYmFja19jdHgpOworICAgIHN1YmplY3Q9WDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOworCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUj49MHgxMDAwMDAwMEwKKyAgICAvKiBtb2Rlcm4gQVBJIGFsbG93cyByZXRyaWV2aW5nIG11bHRpcGxlIG1hdGNoaW5nIGNlcnRpZmljYXRlcyAqLworICAgIHNrPVg1MDlfU1RPUkVfZ2V0MV9jZXJ0cyhjYWxsYmFja19jdHgsIHN1YmplY3QpOworICAgIGlmKHNrKSB7CisgICAgICAgIGZvcihpPTA7IGk8c2tfWDUwOV9udW0oc2spOyBpKyspCisgICAgICAgICAgICBpZihjb21wYXJlX3B1YmtleXMoY2VydCwgc2tfWDUwOV92YWx1ZShzaywgaSkpKSB7CisgICAgICAgICAgICAgICAgc2tfWDUwOV9wb3BfZnJlZShzaywgWDUwOV9mcmVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogYWNjZXB0ICovCisgICAgICAgICAgICB9CisgICAgICAgIHNrX1g1MDlfcG9wX2ZyZWUoc2ssIFg1MDlfZnJlZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBwcmUtMS4wLjAgQVBJIG9ubHkgcmV0dXJucyBhIHNpbmdsZSBtYXRjaGluZyBjZXJ0aWZpY2F0ZSAqLworICAgIG1lbXNldCgoY2hhciAqKSZvYmosIDAsIHNpemVvZiBvYmopOworICAgIGlmKFg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoY2FsbGJhY2tfY3R4LCBYNTA5X0xVX1g1MDksCisgICAgICAgICAgICBzdWJqZWN0LCAmb2JqKTw9MCkgeworICAgICAgICBzX2xvZyhMT0dfV0FSTklORywKKyAgICAgICAgICAgICJDRVJUOiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgaW4gbG9jYWwgcmVwb3NpdG9yeSIpOworICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgfQorICAgIHN1Y2Nlc3M9Y29tcGFyZV9wdWJrZXlzKGNlcnQsIG9iai5kYXRhLng1MDkpOworICAgIFg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisgICAgaWYoIXN1Y2Nlc3MpIHsKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJDRVJUOiBQdWJsaWMga2V5cyBkbyBub3QgbWF0Y2giKTsKKyAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGNhbGxiYWNrX2N0eCwgWDUwOV9WX0VSUl9DRVJUX1JFSkVDVEVEKTsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK05PRVhQT1JUIGludCBjb21wYXJlX3B1YmtleXMoWDUwOSAqYzEsIFg1MDkgKmMyKSB7CisgICAgQVNOMV9CSVRfU1RSSU5HICprMT1YNTA5X2dldDBfcHVia2V5X2JpdHN0cihjMSk7CisgICAgQVNOMV9CSVRfU1RSSU5HICprMj1YNTA5X2dldDBfcHVia2V5X2JpdHN0cihjMik7CisgICAgaWYoIWsxIHx8ICFrMiB8fCBrMS0+bGVuZ3RoIT1rMi0+bGVuZ3RoIHx8IGsxLT5sZW5ndGg8MCB8fAorICAgICAgICAgICAgc2FmZV9tZW1jbXAoazEtPmRhdGEsIGsyLT5kYXRhLCAoc2l6ZV90KWsxLT5sZW5ndGgpKQorICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgc19sb2coTE9HX0lORk8sICJDRVJUOiBMb2NhbGx5IGluc3RhbGxlZCBjZXJ0aWZpY2F0ZSBtYXRjaGVkIik7CisgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDUkwgY2hlY2tpbmcgKi8KKworLyogYmFzZWQgb24gdGhlIEJTRC1zdHlsZSBsaWNlbnNlZCBjb2RlIG9mIG1vZF9zc2wgKi8KK05PRVhQT1JUIGludCBjcmxfY2hlY2soQ0xJICpjLCBYNTA5X1NUT1JFX0NUWCAqY2FsbGJhY2tfY3R4KSB7CisgICAgWDUwOV9TVE9SRV9DVFggc3RvcmVfY3R4OworICAgIFg1MDlfT0JKRUNUIG9iajsKKyAgICBYNTA5X05BTUUgKnN1YmplY3Q7CisgICAgWDUwOV9OQU1FICppc3N1ZXI7CisgICAgWDUwOSAqY2VydDsKKyAgICBYNTA5X0NSTCAqY3JsOworICAgIFg1MDlfUkVWT0tFRCAqcmV2b2tlZDsKKyAgICBFVlBfUEtFWSAqcHVia2V5OworICAgIGxvbmcgc2VyaWFsOworICAgIGludCBpLCBuLCByYzsKKyAgICBjaGFyICpjcDsKKyAgICBBU04xX1RJTUUgKmxhc3RfdXBkYXRlPU5VTEwsICpuZXh0X3VwZGF0ZT1OVUxMOworCisgICAgY2VydD1YNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KGNhbGxiYWNrX2N0eCk7CisgICAgc3ViamVjdD1YNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7CisgICAgaXNzdWVyPVg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpOworCisgICAgLyogdHJ5IHRvIHJldHJpZXZlIGEgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9zdWJqZWN0XyBvZgorICAgICAqIHRoZSBjdXJyZW50IGNlcnRpZmljYXRlIGluIG9yZGVyIHRvIHZlcmlmeSBpdCdzIGludGVncml0eSAqLworICAgIFg1MDlfU1RPUkVfQ1RYX2luaXQoJnN0b3JlX2N0eCwgYy0+b3B0LT5yZXZvY2F0aW9uX3N0b3JlLCBOVUxMLCBOVUxMKTsKKyAgICBtZW1zZXQoKGNoYXIgKikmb2JqLCAwLCBzaXplb2Ygb2JqKTsKKyAgICByYz1YNTA5X1NUT1JFX2dldF9ieV9zdWJqZWN0KCZzdG9yZV9jdHgsIFg1MDlfTFVfQ1JMLCBzdWJqZWN0LCAmb2JqKTsKKyAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZzdG9yZV9jdHgpOworICAgIGNybD1vYmouZGF0YS5jcmw7CisgICAgaWYocmM+MCAmJiBjcmwpIHsKKyAgICAgICAgY3A9WDUwOV9OQU1FMnRleHQoc3ViamVjdCk7CisgICAgICAgIHNfbG9nKExPR19JTkZPLCAiQ1JMOiBpc3N1ZXI6ICVzIiwgY3ApOworICAgICAgICBzdHJfZnJlZShjcCk7CisgICAgICAgIGxhc3RfdXBkYXRlPVg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKGNybCk7CisgICAgICAgIG5leHRfdXBkYXRlPVg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKGNybCk7CisgICAgICAgIGxvZ190aW1lKExPR19JTkZPLCAiQ1JMOiBsYXN0IHVwZGF0ZSIsIGxhc3RfdXBkYXRlKTsKKyAgICAgICAgbG9nX3RpbWUoTE9HX0lORk8sICJDUkw6IG5leHQgdXBkYXRlIiwgbmV4dF91cGRhdGUpOworCisgICAgICAgIC8qIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uIHRoaXMgQ1JMICovCisgICAgICAgIHB1YmtleT1YNTA5X2dldF9wdWJrZXkoY2VydCk7CisgICAgICAgIGlmKFg1MDlfQ1JMX3ZlcmlmeShjcmwsIHB1YmtleSk8PTApIHsKKyAgICAgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiQ1JMOiBJbnZhbGlkIHNpZ25hdHVyZSIpOworICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGNhbGxiYWNrX2N0eCwKKyAgICAgICAgICAgICAgICBYNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRSk7CisgICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworICAgICAgICAgICAgaWYocHVia2V5KQorICAgICAgICAgICAgICAgIEVWUF9QS0VZX2ZyZWUocHVia2V5KTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICAgICAgfQorICAgICAgICBpZihwdWJrZXkpCisgICAgICAgICAgICBFVlBfUEtFWV9mcmVlKHB1YmtleSk7CisKKyAgICAgICAgLyogY2hlY2sgZGF0ZSBvZiBDUkwgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGV4cGlyZWQgKi8KKyAgICAgICAgaWYoIW5leHRfdXBkYXRlKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkNSTDogSW52YWxpZCBuZXh0VXBkYXRlIGZpZWxkIik7CisgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LAorICAgICAgICAgICAgICAgIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxEKTsKKyAgICAgICAgICAgIFg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYoWDUwOV9jbXBfY3VycmVudF90aW1lKG5leHRfdXBkYXRlKTwwKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIkNSTDogQ1JMIEV4cGlyZWQgLSByZXZva2luZyBhbGwgY2VydGlmaWNhdGVzIik7CisgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LCBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRCk7CisgICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIHJlamVjdCAqLworICAgICAgICB9CisgICAgICAgIFg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisgICAgfQorCisgICAgLyogdHJ5IHRvIHJldHJpZXZlIGEgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9pc3N1ZXJfIG9mCisgICAgICogdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUgaW4gb3JkZXIgdG8gY2hlY2sgZm9yIHJldm9jYXRpb24gKi8KKyAgICBtZW1zZXQoKGNoYXIgKikmb2JqLCAwLCBzaXplb2Ygb2JqKTsKKyAgICBYNTA5X1NUT1JFX0NUWF9pbml0KCZzdG9yZV9jdHgsIGMtPm9wdC0+cmV2b2NhdGlvbl9zdG9yZSwgTlVMTCwgTlVMTCk7CisgICAgcmM9WDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdCgmc3RvcmVfY3R4LCBYNTA5X0xVX0NSTCwgaXNzdWVyLCAmb2JqKTsKKyAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZzdG9yZV9jdHgpOworICAgIGNybD1vYmouZGF0YS5jcmw7CisgICAgaWYocmM+MCAmJiBjcmwpIHsKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUgaXMgcmV2b2tlZCBieSB0aGlzIENSTCAqLworICAgICAgICBuPXNrX1g1MDlfUkVWT0tFRF9udW0oWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKSk7CisgICAgICAgIGZvcihpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICByZXZva2VkPXNrX1g1MDlfUkVWT0tFRF92YWx1ZShYNTA5X0NSTF9nZXRfUkVWT0tFRChjcmwpLCBpKTsKKyAgICAgICAgICAgIGlmKEFTTjFfSU5URUdFUl9jbXAocmV2b2tlZC0+c2VyaWFsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBYNTA5X2dldF9zZXJpYWxOdW1iZXIoY2VydCkpPT0wKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsPUFTTjFfSU5URUdFUl9nZXQocmV2b2tlZC0+c2VyaWFsTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBjcD1YNTA5X05BTUUydGV4dChpc3N1ZXIpOworICAgICAgICAgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiQ1JMOiBDZXJ0aWZpY2F0ZSB3aXRoIHNlcmlhbCAlbGQgKDB4JWxYKSAiCisgICAgICAgICAgICAgICAgICAgICJyZXZva2VkIHBlciBDUkwgZnJvbSBpc3N1ZXIgJXMiLCBzZXJpYWwsIHNlcmlhbCwgY3ApOworICAgICAgICAgICAgICAgIHN0cl9mcmVlKGNwKTsKKyAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LCBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRCk7CisgICAgICAgICAgICAgICAgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBPQ1NQIGNoZWNraW5nICovCisKKy8qIHR5cGUgY2hlY2tzIG5vdCBhdmFpbGFibGUgLS0gdXNlIGdlbmVyaWMgZnVuY3Rpb25zICovCisjaWZuZGVmIHNrX09QRU5TU0xfU1RSSU5HX251bQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19udW0oc3QpIHNrX251bShzdCkKKyNlbmRpZgorI2lmbmRlZiBza19PUEVOU1NMX1NUUklOR192YWx1ZQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR192YWx1ZShzdCwgaSkgc2tfdmFsdWUoKHN0KSwoaSkpCisjZW5kaWYKKworTk9FWFBPUlQgaW50IG9jc3BfY2hlY2soQ0xJICpjLCBYNTA5X1NUT1JFX0NUWCAqY2FsbGJhY2tfY3R4KSB7CisgICAgWDUwOSAqY2VydDsKKyAgICBPQ1NQX0NFUlRJRCAqY2VydF9pZDsKKyAgICBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKmFpYTsKKyAgICBpbnQgaSwgb2NzcF9zdGF0dXM9Vl9PQ1NQX0NFUlRTVEFUVVNfVU5LTk9XTiwgc2F2ZWRfZXJyb3I7CisKKyAgICAvKiB0aGUgb3JpZ2luYWwgZXJyb3IgY29kZSBpcyByZXN0b3JlZCB1bmxlc3Mgd2UgcmVwb3J0IG91ciBvd24gZXJyb3IgKi8KKyAgICBzYXZlZF9lcnJvcj1YNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY2FsbGJhY2tfY3R4KTsKKworICAgIC8qIGdldCB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBJRCAqLworICAgIGNlcnQ9WDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjYWxsYmFja19jdHgpOworICAgIGlmKCFjZXJ0KSB7CisgICAgICAgIHNfbG9nKExPR19FUlIsICJPQ1NQOiBGYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGNlcnRpZmljYXRlIik7CisgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjYWxsYmFja19jdHgsCisgICAgICAgICAgICBYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTik7CisgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICB9CisgICAgaWYoIVg1MDlfTkFNRV9jbXAoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLAorICAgICAgICAgICAgWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkpKSB7CisgICAgICAgIHNfbG9nKExPR19ERUJVRywgIk9DU1A6IElnbm9yaW5nIHJvb3QgY2VydGlmaWNhdGUiKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIGFjY2VwdCAqLworICAgIH0KKyAgICBjZXJ0X2lkPU9DU1BfY2VydF90b19pZChOVUxMLCBjZXJ0LCBnZXRfY3VycmVudF9pc3N1ZXIoY2FsbGJhY2tfY3R4KSk7CisgICAgaWYoIWNlcnRfaWQpIHsKKyAgICAgICAgc3NsZXJyb3IoIk9DU1A6IE9DU1BfY2VydF90b19pZCIpOworICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LAorICAgICAgICAgICAgWDUwOV9WX0VSUl9BUFBMSUNBVElPTl9WRVJJRklDQVRJT04pOworICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgfQorCisgICAgLyogdXNlIHRoZSByZXNwb25kZXIgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyAgICBpZihjLT5vcHQtPm9jc3BfdXJsKSB7CisgICAgICAgIHNfbG9nKExPR19OT1RJQ0UsICJPQ1NQOiBDb25uZWN0aW5nIGNvbmZpZ3VyZWQgcmVzcG9uZGVyIFwiJXNcIiIsCisgICAgICAgICAgICBjLT5vcHQtPm9jc3BfdXJsKTsKKyAgICAgICAgaWYob2NzcF9yZXF1ZXN0KGMsIGNhbGxiYWNrX2N0eCwgY2VydF9pZCwgYy0+b3B0LT5vY3NwX3VybCkhPQorICAgICAgICAgICAgICAgIFZfT0NTUF9DRVJUU1RBVFVTX0dPT0QpIHsKKyAgICAgICAgICAgIE9DU1BfQ0VSVElEX2ZyZWUoY2VydF9pZCk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmVqZWN0ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1c2UgdGhlIHJlc3BvbmRlciBmcm9tIEFJQSAoQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcykgKi8KKyAgICBpZihjLT5vcHQtPm9wdGlvbi5haWEgJiYgKGFpYT1YNTA5X2dldDFfb2NzcChjZXJ0KSkpIHsKKyAgICAgICAgZm9yKGk9MDsgaTxza19PUEVOU1NMX1NUUklOR19udW0oYWlhKTsgaSsrKSB7CisgICAgICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiT0NTUDogQ29ubmVjdGluZyBBSUEgcmVzcG9uZGVyIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoYWlhLCBpKSk7CisgICAgICAgICAgICBvY3NwX3N0YXR1cz1vY3NwX3JlcXVlc3QoYywgY2FsbGJhY2tfY3R4LCBjZXJ0X2lkLAorICAgICAgICAgICAgICAgIHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKGFpYSwgaSkpOworICAgICAgICAgICAgaWYob2NzcF9zdGF0dXMhPVZfT0NTUF9DRVJUU1RBVFVTX1VOS05PV04pCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIHdlIHJlY2VpdmVkIGEgZGVmaW5pdGl2ZSByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICAgIFg1MDlfZW1haWxfZnJlZShhaWEpOworICAgICAgICBpZihvY3NwX3N0YXR1cyE9Vl9PQ1NQX0NFUlRTVEFUVVNfR09PRCkgeworICAgICAgICAgICAgT0NTUF9DRVJUSURfZnJlZShjZXJ0X2lkKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZWplY3QgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIE9DU1BfQ0VSVElEX2ZyZWUoY2VydF9pZCk7CisgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGNhbGxiYWNrX2N0eCwgc2F2ZWRfZXJyb3IpOworICAgIHJldHVybiAxOyAvKiBhY2NlcHQgKi8KK30KKworLyogcmV0dXJucyBvbmUgb2Y6CisgKiBWX09DU1BfQ0VSVFNUQVRVU19HT09ECisgKiBWX09DU1BfQ0VSVFNUQVRVU19SRVZPS0VECisgKiBWX09DU1BfQ0VSVFNUQVRVU19VTktOT1dOICovCitOT0VYUE9SVCBpbnQgb2NzcF9yZXF1ZXN0KENMSSAqYywgWDUwOV9TVE9SRV9DVFggKmNhbGxiYWNrX2N0eCwKKyAgICAgICAgT0NTUF9DRVJUSUQgKmNlcnRfaWQsIGNoYXIgKnVybCkgeworICAgIGludCBvY3NwX3N0YXR1cz1WX09DU1BfQ0VSVFNUQVRVU19VTktOT1dOOworICAgIGludCByZXNwb25zZV9zdGF0dXM7CisgICAgaW50IHJlYXNvbjsKKyAgICBpbnQgY3R4X2Vycj1YNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTjsKKyAgICBPQ1NQX1JFUVVFU1QgKnJlcXVlc3Q9TlVMTDsKKyAgICBPQ1NQX1JFU1BPTlNFICpyZXNwb25zZT1OVUxMOworICAgIE9DU1BfQkFTSUNSRVNQICpiYXNpY19yZXNwb25zZT1OVUxMOworICAgIEFTTjFfR0VORVJBTElaRURUSU1FICpyZXZva2VkX2F0PU5VTEwsCisgICAgICAgICp0aGlzX3VwZGF0ZT1OVUxMLCAqbmV4dF91cGRhdGU9TlVMTDsKKworICAgIC8qIGJ1aWxkIHJlcXVlc3QgKi8KKyAgICByZXF1ZXN0PU9DU1BfUkVRVUVTVF9uZXcoKTsKKyAgICBpZighcmVxdWVzdCkgeworICAgICAgICBzc2xlcnJvcigiT0NTUDogT0NTUF9SRVFVRVNUX25ldyIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGlmKCFPQ1NQX3JlcXVlc3RfYWRkMF9pZChyZXF1ZXN0LCBPQ1NQX0NFUlRJRF9kdXAoY2VydF9pZCkpKSB7CisgICAgICAgIHNzbGVycm9yKCJPQ1NQOiBPQ1NQX3JlcXVlc3RfYWRkMF9pZCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorI2lmIDAKKyAgICBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZShyZXF1ZXN0LCBOVUxMLCAtMSk7CisjZW5kaWYKKworICAgIC8qIHNlbmQgdGhlIHJlcXVlc3QgYW5kIGdldCBhIHJlc3BvbnNlICovCisgICAgcmVzcG9uc2U9b2NzcF9nZXRfcmVzcG9uc2UoYywgcmVxdWVzdCwgdXJsKTsKKyAgICBpZighcmVzcG9uc2UpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICByZXNwb25zZV9zdGF0dXM9T0NTUF9yZXNwb25zZV9zdGF0dXMocmVzcG9uc2UpOworICAgIGlmKHJlc3BvbnNlX3N0YXR1cyE9T0NTUF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTU0ZVTCkgeworICAgICAgICBzX2xvZyhMT0dfV0FSTklORywgIk9DU1A6IFJlc3BvbmRlciBlcnJvcjogJWQ6ICVzIiwKKyAgICAgICAgICAgIHJlc3BvbnNlX3N0YXR1cywgT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKHJlc3BvbnNlX3N0YXR1cykpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgLyogdmVyaWZ5IHRoZSByZXNwb25zZSAqLworICAgIGJhc2ljX3Jlc3BvbnNlPU9DU1BfcmVzcG9uc2VfZ2V0MV9iYXNpYyhyZXNwb25zZSk7CisgICAgaWYoIWJhc2ljX3Jlc3BvbnNlKSB7CisgICAgICAgIHNzbGVycm9yKCJPQ1NQOiBPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyNpZiAwCisgICAgaWYoT0NTUF9jaGVja19ub25jZShyZXF1ZXN0LCBiYXNpY19yZXNwb25zZSk8PTApIHsKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJPQ1NQOiBJbnZhbGlkIG5vbmNlIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisjZW5kaWYKKyAgICBpZihPQ1NQX2Jhc2ljX3ZlcmlmeShiYXNpY19yZXNwb25zZSwgWDUwOV9TVE9SRV9DVFhfZ2V0X2NoYWluKGNhbGxiYWNrX2N0eCksCisgICAgICAgICAgICBjLT5vcHQtPnJldm9jYXRpb25fc3RvcmUsIGMtPm9wdC0+b2NzcF9mbGFncyk8PTApIHsKKyAgICAgICAgc3NsZXJyb3IoIk9DU1A6IE9DU1BfYmFzaWNfdmVyaWZ5Iik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgaWYoIU9DU1BfcmVzcF9maW5kX3N0YXR1cyhiYXNpY19yZXNwb25zZSwgY2VydF9pZCwgJm9jc3Bfc3RhdHVzLCAmcmVhc29uLAorICAgICAgICAgICAgJnJldm9rZWRfYXQsICZ0aGlzX3VwZGF0ZSwgJm5leHRfdXBkYXRlKSkgeworICAgICAgICBzc2xlcnJvcigiT0NTUDogT0NTUF9yZXNwX2ZpbmRfc3RhdHVzIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgc19sb2coTE9HX0lORk8sICJPQ1NQOiBTdGF0dXM6ICVzIiwgT0NTUF9jZXJ0X3N0YXR1c19zdHIob2NzcF9zdGF0dXMpKTsKKyAgICBsb2dfdGltZShMT0dfSU5GTywgIk9DU1A6IFRoaXMgdXBkYXRlIiwgdGhpc191cGRhdGUpOworICAgIGxvZ190aW1lKExPR19JTkZPLCAiT0NTUDogTmV4dCB1cGRhdGUiLCBuZXh0X3VwZGF0ZSk7CisgICAgLyogY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlzIHZhbGlkIGZvciBhdCBsZWFzdCBvbmUgbWludXRlICovCisgICAgaWYoIU9DU1BfY2hlY2tfdmFsaWRpdHkodGhpc191cGRhdGUsIG5leHRfdXBkYXRlLCA2MCwgLTEpKSB7CisgICAgICAgIHNzbGVycm9yKCJPQ1NQOiBPQ1NQX2NoZWNrX3ZhbGlkaXR5Iik7CisgICAgICAgIG9jc3Bfc3RhdHVzPVZfT0NTUF9DRVJUU1RBVFVTX1VOS05PV047CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgc3dpdGNoKG9jc3Bfc3RhdHVzKSB7CisgICAgY2FzZSBWX09DU1BfQ0VSVFNUQVRVU19HT09EOgorICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiT0NTUDogQ2VydGlmaWNhdGUgYWNjZXB0ZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWX09DU1BfQ0VSVFNUQVRVU19SRVZPS0VEOgorICAgICAgICBpZihyZWFzb249PS0xKQorICAgICAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJPQ1NQOiBDZXJ0aWZpY2F0ZSByZXZva2VkIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNfbG9nKExPR19XQVJOSU5HLCAiT0NTUDogQ2VydGlmaWNhdGUgcmV2b2tlZDogJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICByZWFzb24sIE9DU1BfY3JsX3JlYXNvbl9zdHIocmVhc29uKSk7CisgICAgICAgIGxvZ190aW1lKExPR19OT1RJQ0UsICJPQ1NQOiBSZXZva2VkIGF0IiwgcmV2b2tlZF9hdCk7CisgICAgICAgIGN0eF9lcnI9WDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVl9PQ1NQX0NFUlRTVEFUVVNfVU5LTk9XTjoKKyAgICAgICAgc19sb2coTE9HX1dBUk5JTkcsICJPQ1NQOiBVbmtub3duIHZlcmlmaWNhdGlvbiBzdGF0dXMiKTsKKyAgICB9CitjbGVhbnVwOgorICAgIGlmKHJlcXVlc3QpCisgICAgICAgIE9DU1BfUkVRVUVTVF9mcmVlKHJlcXVlc3QpOworICAgIGlmKHJlc3BvbnNlKQorICAgICAgICBPQ1NQX1JFU1BPTlNFX2ZyZWUocmVzcG9uc2UpOworICAgIGlmKGJhc2ljX3Jlc3BvbnNlKQorICAgICAgICBPQ1NQX0JBU0lDUkVTUF9mcmVlKGJhc2ljX3Jlc3BvbnNlKTsKKyAgICBpZihvY3NwX3N0YXR1cyE9Vl9PQ1NQX0NFUlRTVEFUVVNfR09PRCkKKyAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGNhbGxiYWNrX2N0eCwgY3R4X2Vycik7CisgICAgcmV0dXJuIG9jc3Bfc3RhdHVzOworfQorCitOT0VYUE9SVCBPQ1NQX1JFU1BPTlNFICpvY3NwX2dldF9yZXNwb25zZShDTEkgKmMsCisgICAgICAgIE9DU1BfUkVRVUVTVCAqcmVxLCBjaGFyICp1cmwpIHsKKyAgICBCSU8gKmJpbz1OVUxMOworICAgIE9DU1BfUkVRX0NUWCAqcmVxX2N0eD1OVUxMOworICAgIE9DU1BfUkVTUE9OU0UgKnJlc3A9TlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgKmhvc3Q9TlVMTCwgKnBvcnQ9TlVMTCwgKnBhdGg9TlVMTDsKKyAgICBTT0NLQUREUl9VTklPTiBhZGRyOworICAgIGludCBzc2w7CisKKyAgICAvKiBwYXJzZSB0aGUgT0NTUCBVUkwgKi8KKyAgICBpZighT0NTUF9wYXJzZV91cmwodXJsLCAmaG9zdCwgJnBvcnQsICZwYXRoLCAmc3NsKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiT0NTUDogRmFpbGVkIHRvIHBhcnNlIHRoZSBPQ1NQIFVSTCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGlmKHNzbCkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiT0NTUDogU1NMIG5vdCBzdXBwb3J0ZWQgZm9yIE9DU1AiCisgICAgICAgICAgICAiIC0gYWRkaXRpb25hbCBzdHVubmVsIHNlcnZpY2UgbmVlZHMgdG8gYmUgZGVmaW5lZCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mIGFkZHIpOworICAgIGFkZHIuaW4uc2luX2ZhbWlseT1BRl9JTkVUOworICAgIGlmKCFob3N0cG9ydDJhZGRyKCZhZGRyLCBob3N0LCBwb3J0LCAwKSkgeworICAgICAgICBzX2xvZyhMT0dfRVJSLCAiT0NTUDogRmFpbGVkIHRvIHJlc29sdmUgdGhlIE9DU1Agc2VydmVyIGFkZHJlc3MiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIC8qIGNvbm5lY3Qgc3BlY2lmaWVkIE9DU1Agc2VydmVyIChyZXNwb25kZXIpICovCisgICAgYy0+ZmQ9c19zb2NrZXQoYWRkci5zYS5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwLCAxLCAiT0NTUDogc29ja2V0Iik7CisgICAgaWYoYy0+ZmQ9PUlOVkFMSURfU09DS0VUKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgaWYoc19jb25uZWN0KGMsICZhZGRyLCBhZGRyX2xlbigmYWRkcikpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgYmlvPUJJT19uZXdfc29ja2V0KChpbnQpYy0+ZmQsIEJJT19OT0NMT1NFKTsKKyAgICBpZighYmlvKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgc19sb2coTE9HX0RFQlVHLCAiT0NTUDogQ29ubmVjdGVkICVzOiVzIiwgaG9zdCwgcG9ydCk7CisKKyAgICAvKiBPQ1NQIHByb3RvY29sIGNvbW11bmljYXRpb24gbG9vcCAqLworICAgIHJlcV9jdHg9T0NTUF9zZW5kcmVxX25ldyhiaW8sIHBhdGgsIE5VTEwsIC0xKTsKKyAgICBpZighcmVxX2N0eCkgeworICAgICAgICBzc2xlcnJvcigiT0NTUDogT0NTUF9zZW5kcmVxX25ldyIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGlmKCFPQ1NQX1JFUV9DVFhfYWRkMV9oZWFkZXIocmVxX2N0eCwgIkhvc3QiLCBob3N0KSkgeworICAgICAgICBzc2xlcnJvcigiT0NTUDogT0NTUF9SRVFfQ1RYX2FkZDFfaGVhZGVyIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgaWYoIU9DU1BfUkVRX0NUWF9zZXQxX3JlcShyZXFfY3R4LCByZXEpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgd2hpbGUoT0NTUF9zZW5kcmVxX25iaW8oJnJlc3AsIHJlcV9jdHgpPT0tMSkgeworICAgICAgICBzX3BvbGxfaW5pdChjLT5mZHMpOworICAgICAgICBzX3BvbGxfYWRkKGMtPmZkcywgYy0+ZmQsIEJJT19zaG91bGRfcmVhZChiaW8pLCBCSU9fc2hvdWxkX3dyaXRlKGJpbykpOworICAgICAgICBlcnI9c19wb2xsX3dhaXQoYy0+ZmRzLCBjLT5vcHQtPnRpbWVvdXRfYnVzeSwgMCk7CisgICAgICAgIGlmKGVycj09LTEpCisgICAgICAgICAgICBzb2NrZXJyb3IoIk9DU1A6IHNfcG9sbF93YWl0Iik7CisgICAgICAgIGlmKGVycj09MCkKKyAgICAgICAgICAgIHNfbG9nKExPR19JTkZPLCAiT0NTUDogc19wb2xsX3dhaXQ6IFRJTUVPVVRidXN5IGV4Y2VlZGVkIik7CisgICAgICAgIGlmKGVycjw9MCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisjaWYgMAorICAgIHNfbG9nKExPR19ERUJVRywgIk9DU1A6IGNvbnRleHQgc3RhdGU6IDB4JXgiLCAqKGludCAqKXJlcV9jdHgpOworI2VuZGlmCisgICAgLyogaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL29wZW5zc2wtdXNlcnNAb3BlbnNzbC5vcmcvbXNnNjE2OTEuaHRtbCAqLworICAgIGlmKHJlc3ApIHsKKyAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiT0NTUDogUmVzcG9uc2UgcmVjZWl2ZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihFUlJfcGVla19lcnJvcigpKQorICAgICAgICAgICAgc3NsZXJyb3IoIk9DU1A6IE9DU1Bfc2VuZHJlcV9uYmlvIik7CisgICAgICAgIGVsc2UgLyogT3BlblNTTCBlcnJvcjogT0NTUF9zZW5kcmVxX25iaW8gZG9lcyBub3QgdXNlIE9DU1BlcnIgKi8KKyAgICAgICAgICAgIHNfbG9nKExPR19FUlIsICJPQ1NQOiBPQ1NQX3NlbmRyZXFfbmJpbzogT3BlblNTTCBpbnRlcm5hbCBlcnJvciIpOworICAgIH0KKworY2xlYW51cDoKKyAgICBpZihyZXFfY3R4KQorICAgICAgICBPQ1NQX1JFUV9DVFhfZnJlZShyZXFfY3R4KTsKKyAgICBpZihiaW8pCisgICAgICAgIEJJT19mcmVlX2FsbChiaW8pOworICAgIGlmKGMtPmZkIT1JTlZBTElEX1NPQ0tFVCkgeworICAgICAgICBjbG9zZXNvY2tldChjLT5mZCk7CisgICAgICAgIGMtPmZkPUlOVkFMSURfU09DS0VUOyAvKiBhdm9pZCBkb3VibGUgY2xvc2Ugb24gY2xlYW51cCAqLworICAgIH0KKyAgICBpZihob3N0KQorICAgICAgICBPUEVOU1NMX2ZyZWUoaG9zdCk7CisgICAgaWYocG9ydCkKKyAgICAgICAgT1BFTlNTTF9mcmVlKHBvcnQpOworICAgIGlmKHBhdGgpCisgICAgICAgIE9QRU5TU0xfZnJlZShwYXRoKTsKKyAgICByZXR1cm4gcmVzcDsKK30KKworLyogZmluZCB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIHdpdGhvdXQgbG9va3VwcyAqLworTk9FWFBPUlQgWDUwOSAqZ2V0X2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjYWxsYmFja19jdHgpIHsKKyAgICBTVEFDS19PRihYNTA5KSAqY2hhaW47CisgICAgaW50IGRlcHRoOworCisgICAgY2hhaW49WDUwOV9TVE9SRV9DVFhfZ2V0X2NoYWluKGNhbGxiYWNrX2N0eCk7CisgICAgZGVwdGg9WDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKGNhbGxiYWNrX2N0eCk7CisgICAgaWYoZGVwdGg8c2tfWDUwOV9udW0oY2hhaW4pLTEpIC8qIG5vdCB0aGUgcm9vdCBDQSBjZXJ0ICovCisgICAgICAgICsrZGVwdGg7IC8qIGluZGV4IG9mIHRoZSBpc3N1ZXIgY2VydCAqLworICAgIHJldHVybiBza19YNTA5X3ZhbHVlKGNoYWluLCBkZXB0aCk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX09DU1ApICovCisKK2NoYXIgKlg1MDlfTkFNRTJ0ZXh0KFg1MDlfTkFNRSAqbmFtZSkgeworICAgIGNoYXIgKnRleHQ7CisgICAgQklPICpiaW87CisgICAgaW50IG47CisKKyAgICBiaW89QklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgaWYoIWJpbykKKyAgICAgICAgcmV0dXJuIHN0cl9kdXAoIkJJT19uZXcoKSBmYWlsZWQiKTsKKyAgICBYNTA5X05BTUVfcHJpbnRfZXgoYmlvLCBuYW1lLCAwLAorICAgICAgICBYTl9GTEFHX09ORUxJTkUgJiB+QVNOMV9TVFJGTEdTX0VTQ19NU0IgJiB+WE5fRkxBR19TUENfRVEpOworICAgIG49QklPX3BlbmRpbmcoYmlvKTsKKyAgICB0ZXh0PXN0cl9hbGxvYygoc2l6ZV90KW4rMSk7CisgICAgbj1CSU9fcmVhZChiaW8sIHRleHQsIG4pOworICAgIGlmKG48MCkgeworICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICBzdHJfZnJlZSh0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHN0cl9kdXAoIkJJT19yZWFkKCkgZmFpbGVkIik7CisgICAgfQorICAgIHRleHRbbl09J1wwJzsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIHJldHVybiB0ZXh0OworfQorCitOT0VYUE9SVCB2b2lkIGxvZ190aW1lKGNvbnN0IGludCBsZXZlbCwgY29uc3QgY2hhciAqdHh0LCBBU04xX1RJTUUgKnQpIHsKKyAgICBjaGFyICpjcDsKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgbjsKKworICAgIGlmKCF0KQorICAgICAgICByZXR1cm47CisgICAgYmlvPUJJT19uZXcoQklPX3NfbWVtKCkpOworICAgIGlmKCFiaW8pCisgICAgICAgIHJldHVybjsKKyAgICBBU04xX1RJTUVfcHJpbnQoYmlvLCB0KTsKKyAgICBuPUJJT19wZW5kaW5nKGJpbyk7CisgICAgY3A9c3RyX2FsbG9jKChzaXplX3QpbisxKTsKKyAgICBuPUJJT19yZWFkKGJpbywgY3AsIG4pOworICAgIGlmKG48MCkgeworICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICBzdHJfZnJlZShjcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3Bbbl09J1wwJzsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIHNfbG9nKGxldmVsLCAiJXM6ICVzIiwgdHh0LCBjcCk7CisgICAgc3RyX2ZyZWUoY3ApOworfQorCisvKiBlbmQgb2YgdmVyaWZ5LmMgKi8KZGlmZiAtLWdpdCBhL3NyYy92ZXJzaW9uLmggYi9zcmMvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDcyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmVyc2lvbi5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qDQorICogICBzdHVubmVsICAgICAgIFRMUyBvZmZsb2FkaW5nIGFuZCBsb2FkLWJhbGFuY2luZyBwcm94eQ0KKyAqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhIDxNaWNoYWwuVHJvam5hcmFAbWlydC5uZXQ+DQorICoNCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0DQorICogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXINCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogDQorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuDQorICogICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICogDQorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZw0KKyAqICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+Lg0KKyAqIA0KKyAqICAgTGlua2luZyBzdHVubmVsIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZw0KKyAqICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHN0dW5uZWwuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4NCisgKiANCisgKiAgIEluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiBzdHVubmVsDQorICogICBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBjb21iaW5lIHN0dW5uZWwgd2l0aCBmcmVlIHNvZnR3YXJlIHByb2dyYW1zIG9yDQorICogICBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQNCisgKiAgIGluIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIE9wZW5TU0wgdW5kZXIgdGhlIE9wZW5TU0wgTGljZW5zZSAob3INCisgKiAgIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggY29kZSwgd2l0aCB1bmNoYW5nZWQgbGljZW5zZSkuIFlvdSBtYXkgY29weQ0KKyAqICAgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvcg0KKyAqICAgc3R1bm5lbCBhbmQgdGhlIGxpY2Vuc2VzIG9mIHRoZSBvdGhlciBjb2RlIGNvbmNlcm5lZC4NCisgKiANCisgKiAgIE5vdGUgdGhhdCBwZW9wbGUgd2hvIG1ha2UgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3R1bm5lbCBhcmUgbm90IG9ibGlnYXRlZA0KKyAqICAgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyDQorICogICBjaG9pY2Ugd2hldGhlciB0byBkbyBzby4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGdpdmVzIHBlcm1pc3Npb24NCisgKiAgIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgdGhpcyBleGNlcHRpb247IHRoaXMgZXhjZXB0aW9uDQorICogICBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMNCisgKiAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24uDQorICovDQorDQorI2lmbmRlZiBWRVJTSU9OX01BSk9SDQorDQorI2lmZGVmIEhBVkVfQ09ORklHX0gNCisjaW5jbHVkZSAiY29uZmlnLmgiDQorI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8NCisNCisvKiBIT1NUIG1heSBiZSB1bmRlZmluZWQgb24gV2luMzIgcGxhdGZvcm0gKi8NCisjaWZuZGVmIEhPU1QNCisjaWYgZGVmaW5lZChfV0lONjQpDQorI2RlZmluZSBQTEFURk9STSAieDY0Ig0KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQ0KKyNkZWZpbmUgUExBVEZPUk0gIng4NiINCisjZWxzZSAvKiBhbHRob3VnaCBNU0ROIGNsYWltcyB0aGF0IF9XSU4zMiBpcyBhbHdheXMgZGVmaW5lZCAqLw0KKyNkZWZpbmUgUExBVEZPUk0gInVua25vd24iDQorI2VuZGlmDQorI2lmZGVmIF9fTUlOR1czMl9fDQorI2RlZmluZSBIT1NUIFBMQVRGT1JNICItcGMtbWluZ3czMi1nbnUiDQorI2Vsc2UgLyogX19NSU5HVzMyX18gKi8NCisjaWZkZWYgX01TQ19WRVINCisjZGVmaW5lIHhzdHIoYSkgc3RyKGEpDQorI2RlZmluZSBzdHIoYSkgI2ENCisjZGVmaW5lIEhPU1QgUExBVEZPUk0gIi1wYy1tc3ZjLSIgeHN0cihfTVNDX1ZFUikNCisjZWxzZSAvKiBfTVNDX1ZFUiAqLw0KKyNkZWZpbmUgSE9TVCBQTEFURk9STSAiLXBjLXVua25vd24iDQorI2VuZGlmIC8qIF9NU0NfVkVSICovDQorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovDQorI2VuZGlmIC8qIEhPU1QgKi8NCisNCisvKiBTVEFSVCBDVVNUT01JWkUgKi8NCisjZGVmaW5lIFZFUlNJT05fTUFKT1IgNQ0KKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAyMg0KKy8qIEVORCBDVVNUT01JWkUgKi8NCisNCisvKiBhbGwgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIEFCU09MVVRFTFkgTkVDRVNTQVJZIHRvIGhhdmUgcHJvcGVyIHN0cmluZw0KKyAqIGNvbnN0cnVjdGlvbiB3aXRoIFZBUklPVVMgQyBwcmVwcm9jZXNzb3JzIChFVkMsIFZDLCBCQ0MsIEdDQykgKi8NCisjZGVmaW5lIFNUUklOR0laRTAoeCkgI3gNCisjZGVmaW5lIFNUUklOR0laRSh4KSBTVFJJTkdJWkUwKHgpDQorI2RlZmluZSBTVFJaQ09OQ0FUMzAoYSxiLGMpIGEjI2IjI2MNCisjZGVmaW5lIFNUUlpDT05DQVQzKGEsYixjKSBTVFJaQ09OQ0FUMzAoYSxiLGMpDQorIA0KKy8qIGZvciByZXNvdXJjZS5yYywgc3R1bm5lbC5jLCBndWkuYyAqLw0KKyNkZWZpbmUgU1RVTk5FTF9WRVJTSU9OMCBTVFJaQ09OQ0FUMyhWRVJTSU9OX01BSk9SLCAuICwgVkVSU0lPTl9NSU5PUikNCisjZGVmaW5lIFNUVU5ORUxfVkVSU0lPTiBTVFJJTkdJWkUoU1RVTk5FTF9WRVJTSU9OMCkNCisNCisvKiBmb3IgcmVzb3VyY2VzLnJjICovDQorI2RlZmluZSBTVFVOTkVMX1ZFUlNJT05fRklFTERTIFZFUlNJT05fTUFKT1IsVkVSU0lPTl9NSU5PUiwwLDANCisjZGVmaW5lIFNUVU5ORUxfUFJPRFVDVE5BTUUgInN0dW5uZWwgIiBTVFVOTkVMX1ZFUlNJT04gIiBmb3IgIiBIT1NUDQorDQorLyogc29tZSB1c2VmdWwgdHJpY2tzIGZvciBwcmVwcm9jZXNzaW5nIGRlYnVnZ2luZyAqLw0KKyNpZiAwDQorI3ByYWdtYSBtZXNzYWdlICggIlZFUlNJT04uSDogU1RVTk5FTF9WRVJTSU9OIGlzICIgU1RVTk5FTF9WRVJTSU9OICkNCisjcHJhZ21hIG1lc3NhZ2UgKCAiVkVSU0lPTi5IOiBIT1NUIGlzICIgSE9TVCApDQorI3ByYWdtYSBtZXNzYWdlICggIlZFUlNJT04uSDogU1RVTk5FTF9QUk9EVUNUTkFNRSBpcyAiIFNUVU5ORUxfUFJPRFVDVE5BTUUgKQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBWRVJTSU9OX01BSk9SICovDQorDQorLyogZW5kIG9mIHZlcnNpb24uaCAqLw0KZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIvdG9vbHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNGUwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitFWFRSQV9ESVNUID0gY2EuaHRtbCBjYS5wbCBpbXBvcnRDQS5odG1sIGltcG9ydENBLnNoIHNjcmlwdC5zaCBcCisJc3R1bm5lbC5zcGVjIHN0dW5uZWwuY25mIHN0dW5uZWwubnNpIHN0dW5uZWwubGljZW5zZSBzdHVubmVsLmNvbmYgXAorCXN0dW5uZWwuY29uZi1zYW1wbGUuaW4gc3R1bm5lbC5pbml0LmluIHN0dW5uZWwuc2VydmljZS5pbgorCitjb25mZGlyID0gJChzeXNjb25mZGlyKS9zdHVubmVsCitjb25mX0RBVEEgPSBzdHVubmVsLmNvbmYtc2FtcGxlCisKK2RvY2RpciA9ICQoZGF0YWRpcikvZG9jL3N0dW5uZWwKK2V4YW1wbGVzZGlyID0gJChkb2NkaXIpL2V4YW1wbGVzCitleGFtcGxlc19EQVRBID0gc3R1bm5lbC5zcGVjIHN0dW5uZWwuaW5pdCBzdHVubmVsLnNlcnZpY2UKK2V4YW1wbGVzX0RBVEEgKz0gY2EuaHRtbCBjYS5wbCBpbXBvcnRDQS5odG1sIGltcG9ydENBLnNoIHNjcmlwdC5zaAorCitDTEVBTkZJTEVTID0gc3R1bm5lbC5jb25mLXNhbXBsZSBzdHVubmVsLmluaXQgc3R1bm5lbC5zZXJ2aWNlCisKK2luc3RhbGwtZGF0YS1sb2NhbDoKKwkke0lOU1RBTEx9IC1kIC1tIDE3NzAgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL3N0dW5uZWwKKwktY2hncnAgJChERUZBVUxUX0dST1VQKSAkKERFU1RESVIpJChsb2NhbHN0YXRlZGlyKS9saWIvc3R1bm5lbAorCitPUEVOU1NMPSQoU1NMRElSKS9iaW4vb3BlbnNzbAorCitjZXJ0OgorCUBpZiB0ZXN0IC1yICQoREVTVERJUikkKGNvbmZkaXIpL3N0dW5uZWwucGVtOyBcCisJdGhlbiBcCisJCWVjaG8gIiQoREVTVERJUikkKGNvbmZkaXIpL3N0dW5uZWwucGVtIGFscmVhZHkgZXhpc3RzIjsgXAorCWVsc2UgXAorCQlpZiB0ZXN0IC1yICIkKFJBTkRPTV9GSUxFKSI7IHRoZW4gXAorCQkJZGQgaWY9IiQoUkFORE9NX0ZJTEUpIiBvZj1zdHVubmVsLnJuZCBicz0yNTYgY291bnQ9MTsgXAorCQkJUk5EPSItcmFuZCBzdHVubmVsLnJuZCI7IFwKKwkJZWxzZSBcCisJCQlSTkQ9IiI7IFwKKwkJZmk7IFwKKwkJJChPUEVOU1NMKSByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUgJCRSTkQgXAorCQkJLWNvbmZpZyAkKHNyY2Rpcikvc3R1bm5lbC5jbmYgXAorCQkJLW91dCBzdHVubmVsLnBlbSAta2V5b3V0IHN0dW5uZWwucGVtOyBcCisJCSQoT1BFTlNTTCkgeDUwOSAtc3ViamVjdCAtZGF0ZXMgLWZpbmdlcnByaW50IC1ub291dCAtaW4gc3R1bm5lbC5wZW07IFwKKwkJJHtJTlNUQUxMfSAtbSA2MDAgc3R1bm5lbC5wZW0gJChERVNURElSKSQoY29uZmRpcikvc3R1bm5lbC5wZW07IFwKKwkJcm0gc3R1bm5lbC5wZW07IFwKKwkJcm0gLWYgc3R1bm5lbC5ybmQ7IFwKKwlmaQorCitlZGl0ID0gc2VkIFwKKwktZSAnc3xAcHJlZml4W0BdfCQocHJlZml4KXxnJyBcCisJLWUgJ3N8QGJpbmRpcltAXXwkKGJpbmRpcil8ZycgXAorCS1lICdzfEBsb2NhbHN0YXRlZGlyW0BdfCQobG9jYWxzdGF0ZWRpcil8ZycgXAorCS1lICdzfEBzeXNjb25mZGlyW0BdfCQoc3lzY29uZmRpcil8ZycgXAorCS1lICdzfEBERUZBVUxUX0dST1VQW0BdfCQoREVGQVVMVF9HUk9VUCl8ZycKKworc3R1bm5lbC5jb25mLXNhbXBsZSBzdHVubmVsLmluaXQgc3R1bm5lbC5zZXJ2aWNlOiBNYWtlZmlsZQorCSQoZWRpdCkgJyQoc3JjZGlyKS8kQC5pbicgPiRACisKK3N0dW5uZWwuY29uZi1zYW1wbGU6ICQoc3JjZGlyKS9zdHVubmVsLmNvbmYtc2FtcGxlLmluCitzdHVubmVsLmluaXQ6ICQoc3JjZGlyKS9zdHVubmVsLmluaXQuaW4KK3N0dW5uZWwuc2VydmljZTogJChzcmNkaXIpL3N0dW5uZWwuc2VydmljZS5pbgpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuaW4gYi90b29scy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZmMjhmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1NjMgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTQuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK2FtX19pc19nbnVfbWFrZSA9IHRlc3QgLW4gJyQoTUFLRUZJTEVfTElTVCknICYmIHRlc3QgLW4gJyQoTUFLRUxFVkVMKScKK2FtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24gPSBcCisgIGNhc2UgJCR7dGFyZ2V0X29wdGlvbi19IGluIFwKKyAgICAgID8pIDs7IFwKKyAgICAgICopIGVjaG8gImFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb246IGludGVybmFsIGVycm9yOiBpbnZhbGlkIiBcCisgICAgICAgICAgICAgICJ0YXJnZXQgb3B0aW9uICckJHt0YXJnZXRfb3B0aW9uLX0nIHNwZWNpZmllZCIgPiYyOyBcCisgICAgICAgICBleGl0IDE7OyBcCisgIGVzYWM7IFwKKyAgaGFzX29wdD1ubzsgXAorICBzYW5lX21ha2VmbGFncz0kJE1BS0VGTEFHUzsgXAorICBpZiAkKGFtX19pc19nbnVfbWFrZSk7IHRoZW4gXAorICAgIHNhbmVfbWFrZWZsYWdzPSQkTUZMQUdTOyBcCisgIGVsc2UgXAorICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAorICAgICAgKlxcW1wgXAldKikgXAorICAgICAgICBicz1cXDsgXAorICAgICAgICBzYW5lX21ha2VmbGFncz1gcHJpbnRmICclc1xuJyAiJCRNQUtFRkxBR1MiIFwKKyAgICAgICAgICB8IHNlZCAicy8kJGJzJCRic1skJGJzICQkYnMJXSovL2ciYDs7IFwKKyAgICBlc2FjOyBcCisgIGZpOyBcCisgIHNraXBfbmV4dD1ubzsgXAorICBzdHJpcF90cmFpbG9wdCAoKSBcCisgIHsgXAorICAgIGZsZz1gcHJpbnRmICclc1xuJyAiJCRmbGciIHwgc2VkICJzLyQkMS4qJCQvLyJgOyBcCisgIH07IFwKKyAgZm9yIGZsZyBpbiAkJHNhbmVfbWFrZWZsYWdzOyBkbyBcCisgICAgdGVzdCAkJHNraXBfbmV4dCA9IHllcyAmJiB7IHNraXBfbmV4dD1ubzsgY29udGludWU7IH07IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICo9KnwtLSopIGNvbnRpbnVlOzsgXAorICAgICAgICAtKkkpIHN0cmlwX3RyYWlsb3B0ICdJJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qST8qKSBzdHJpcF90cmFpbG9wdCAnSSc7OyBcCisgICAgICAgIC0qTykgc3RyaXBfdHJhaWxvcHQgJ08nOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpPPyopIHN0cmlwX3RyYWlsb3B0ICdPJzs7IFwKKyAgICAgICAgLSpsKSBzdHJpcF90cmFpbG9wdCAnbCc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKmw/Kikgc3RyaXBfdHJhaWxvcHQgJ2wnOzsgXAorICAgICAgLVtkRURtXSkgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC1bSlRdKSBza2lwX25leHQ9eWVzOzsgXAorICAgIGVzYWM7IFwKKyAgICBjYXNlICQkZmxnIGluIFwKKyAgICAgICokJHRhcmdldF9vcHRpb24qKSBoYXNfb3B0PXllczsgYnJlYWs7OyBcCisgICAgZXNhYzsgXAorICBkb25lOyBcCisgIHRlc3QgJCRoYXNfb3B0ID0geWVzCithbV9fbWFrZV9kcnlydW4gPSAodGFyZ2V0X29wdGlvbj1uOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorYW1fX21ha2Vfa2VlcGdvaW5nID0gKHRhcmdldF9vcHRpb249azsgJChhbV9fbWFrZV9ydW5uaW5nX3dpdGhfb3B0aW9uKSkKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IHRvb2xzCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuYW0KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9jb21waWxlX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9saW5rX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jaGVja19saW5rX2ZsYWcubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcHRocmVhZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9yZXF1aXJlX2RlZmluZWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitBTV9WX1AgPSAkKGFtX192X1BfQEFNX1ZAKQorYW1fX3ZfUF8gPSAkKGFtX192X1BfQEFNX0RFRkFVTFRfVkApCithbV9fdl9QXzAgPSBmYWxzZQorYW1fX3ZfUF8xID0gOgorQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCithbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCithbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICAgIiAkQDsKK2FtX192X0dFTl8xID0gCitBTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCithbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfYXRfMCA9IEAKK2FtX192X2F0XzEgPSAKK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK2FtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAorICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKKyAgICBufG5vfE5PKSBmYWxzZTs7IFwKKyAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAorICBlc2FjCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCisgIHRlc3QgLXogIiQkZmlsZXMiIFwKKyAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKKyAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisgICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCisgIH0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChjb25mZGlyKSIgIiQoREVTVERJUikkKGV4YW1wbGVzZGlyKSIKK0RBVEEgPSAkKGNvbmZfREFUQSkgJChleGFtcGxlc19EQVRBKQorYW1fX3RhZ2dlZF9maWxlcyA9ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKFRBR1NfRklMRVMpICQoTElTUCkKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGQVVMVF9HUk9VUCA9IEBERUZBVUxUX0dST1VQQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkFORE9NX0ZJTEUgPSBAUkFORE9NX0ZJTEVACitSQU5MSUIgPSBAUkFOTElCQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTU0xESVIgPSBAU1NMRElSQAorU1RSSVAgPSBAU1RSSVBACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9wdGhyZWFkX2NvbmZpZyA9IEBheF9wdGhyZWFkX2NvbmZpZ0AKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSAkKGRhdGFkaXIpL2RvYy9zdHVubmVsCitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorRVhUUkFfRElTVCA9IGNhLmh0bWwgY2EucGwgaW1wb3J0Q0EuaHRtbCBpbXBvcnRDQS5zaCBzY3JpcHQuc2ggXAorCXN0dW5uZWwuc3BlYyBzdHVubmVsLmNuZiBzdHVubmVsLm5zaSBzdHVubmVsLmxpY2Vuc2Ugc3R1bm5lbC5jb25mIFwKKwlzdHVubmVsLmNvbmYtc2FtcGxlLmluIHN0dW5uZWwuaW5pdC5pbiBzdHVubmVsLnNlcnZpY2UuaW4KKworY29uZmRpciA9ICQoc3lzY29uZmRpcikvc3R1bm5lbAorY29uZl9EQVRBID0gc3R1bm5lbC5jb25mLXNhbXBsZQorZXhhbXBsZXNkaXIgPSAkKGRvY2RpcikvZXhhbXBsZXMKK2V4YW1wbGVzX0RBVEEgPSBzdHVubmVsLnNwZWMgc3R1bm5lbC5pbml0IHN0dW5uZWwuc2VydmljZSBjYS5odG1sIFwKKwljYS5wbCBpbXBvcnRDQS5odG1sIGltcG9ydENBLnNoIHNjcmlwdC5zaAorQ0xFQU5GSUxFUyA9IHN0dW5uZWwuY29uZi1zYW1wbGUgc3R1bm5lbC5pbml0IHN0dW5uZWwuc2VydmljZQorT1BFTlNTTCA9ICQoU1NMRElSKS9iaW4vb3BlbnNzbAorZWRpdCA9IHNlZCBcCisJLWUgJ3N8QHByZWZpeFtAXXwkKHByZWZpeCl8ZycgXAorCS1lICdzfEBiaW5kaXJbQF18JChiaW5kaXIpfGcnIFwKKwktZSAnc3xAbG9jYWxzdGF0ZWRpcltAXXwkKGxvY2Fsc3RhdGVkaXIpfGcnIFwKKwktZSAnc3xAc3lzY29uZmRpcltAXXwkKHN5c2NvbmZkaXIpfGcnIFwKKwktZSAnc3xAREVGQVVMVF9HUk9VUFtAXXwkKERFRkFVTFRfR1JPVVApfGcnCisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1jb25mREFUQTogJChjb25mX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJQGxpc3Q9JyQoY29uZl9EQVRBKSc7IHRlc3QgLW4gIiQoY29uZmRpcikiIHx8IGxpc3Q9OyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoY29uZmRpciknIjsgXAorCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoY29uZmRpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoY29uZmRpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKGNvbmZkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWNvbmZEQVRBOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoY29uZl9EQVRBKSc7IHRlc3QgLW4gIiQoY29uZmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwlkaXI9JyQoREVTVERJUikkKGNvbmZkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQoraW5zdGFsbC1leGFtcGxlc0RBVEE6ICQoZXhhbXBsZXNfREFUQSkKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwlAbGlzdD0nJChleGFtcGxlc19EQVRBKSc7IHRlc3QgLW4gIiQoZXhhbXBsZXNkaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGV4YW1wbGVzZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChleGFtcGxlc2RpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoZXhhbXBsZXNkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChleGFtcGxlc2RpcikiIHx8IGV4aXQgJCQ/OyBcCisJZG9uZQorCit1bmluc3RhbGwtZXhhbXBsZXNEQVRBOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoZXhhbXBsZXNfREFUQSknOyB0ZXN0IC1uICIkKGV4YW1wbGVzZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAorCWRpcj0nJChERVNURElSKSQoZXhhbXBsZXNkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQordGFncyBUQUdTOgorCitjdGFncyBDVEFHUzoKKworY3Njb3BlIGNzY29wZWxpc3Q6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChEQVRBKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoY29uZmRpcikiICIkKERFU1RESVIpJChleGFtcGxlc2RpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWNvbmZEQVRBIGluc3RhbGwtZGF0YS1sb2NhbCBcCisJaW5zdGFsbC1leGFtcGxlc0RBVEEKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtY29uZkRBVEEgdW5pbnN0YWxsLWV4YW1wbGVzREFUQQorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWNzY29wZWxpc3QtYW0gY3RhZ3MtYW0gZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCisJaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtY29uZkRBVEEgaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4YW1wbGVzREFUQSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtY29uZkRBVEEgXAorCXVuaW5zdGFsbC1leGFtcGxlc0RBVEEKKworCitpbnN0YWxsLWRhdGEtbG9jYWw6CisJJHtJTlNUQUxMfSAtZCAtbSAxNzcwICQoREVTVERJUikkKGxvY2Fsc3RhdGVkaXIpL2xpYi9zdHVubmVsCisJLWNoZ3JwICQoREVGQVVMVF9HUk9VUCkgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL3N0dW5uZWwKKworY2VydDoKKwlAaWYgdGVzdCAtciAkKERFU1RESVIpJChjb25mZGlyKS9zdHVubmVsLnBlbTsgXAorCXRoZW4gXAorCQllY2hvICIkKERFU1RESVIpJChjb25mZGlyKS9zdHVubmVsLnBlbSBhbHJlYWR5IGV4aXN0cyI7IFwKKwllbHNlIFwKKwkJaWYgdGVzdCAtciAiJChSQU5ET01fRklMRSkiOyB0aGVuIFwKKwkJCWRkIGlmPSIkKFJBTkRPTV9GSUxFKSIgb2Y9c3R1bm5lbC5ybmQgYnM9MjU2IGNvdW50PTE7IFwKKwkJCVJORD0iLXJhbmQgc3R1bm5lbC5ybmQiOyBcCisJCWVsc2UgXAorCQkJUk5EPSIiOyBcCisJCWZpOyBcCisJCSQoT1BFTlNTTCkgcmVxIC1uZXcgLXg1MDkgLWRheXMgMzY1ICQkUk5EIFwKKwkJCS1jb25maWcgJChzcmNkaXIpL3N0dW5uZWwuY25mIFwKKwkJCS1vdXQgc3R1bm5lbC5wZW0gLWtleW91dCBzdHVubmVsLnBlbTsgXAorCQkkKE9QRU5TU0wpIHg1MDkgLXN1YmplY3QgLWRhdGVzIC1maW5nZXJwcmludCAtbm9vdXQgLWluIHN0dW5uZWwucGVtOyBcCisJCSR7SU5TVEFMTH0gLW0gNjAwIHN0dW5uZWwucGVtICQoREVTVERJUikkKGNvbmZkaXIpL3N0dW5uZWwucGVtOyBcCisJCXJtIHN0dW5uZWwucGVtOyBcCisJCXJtIC1mIHN0dW5uZWwucm5kOyBcCisJZmkKKworc3R1bm5lbC5jb25mLXNhbXBsZSBzdHVubmVsLmluaXQgc3R1bm5lbC5zZXJ2aWNlOiBNYWtlZmlsZQorCSQoZWRpdCkgJyQoc3JjZGlyKS8kQC5pbicgPiRACisKK3N0dW5uZWwuY29uZi1zYW1wbGU6ICQoc3JjZGlyKS9zdHVubmVsLmNvbmYtc2FtcGxlLmluCitzdHVubmVsLmluaXQ6ICQoc3JjZGlyKS9zdHVubmVsLmluaXQuaW4KK3N0dW5uZWwuc2VydmljZTogJChzcmNkaXIpL3N0dW5uZWwuc2VydmljZS5pbgorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS90b29scy9jYS5odG1sIGIvdG9vbHMvY2EuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI1NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2EuaHRtbApAQCAtMCwwICsxLDU2IEBACis8SFRNTD4KKzxIRUFEPgorICAgPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8VElUTEU+TWFrZSB5b3VyIG93biBjZXJ0aWZpY2F0ZTwvVElUTEU+Cis8L0hFQUQ+Cis8Qk9EWSBURVhUPSIjMDAwMDAwIiBCR0NPTE9SPSIjRkZGRkNDIiBMSU5LPSIjMDAwMEVGIiBWTElOSz0iIzUxMTg4RSIgQUxJTks9IiNGRjAwMDAiPgorPEZPUk0gQUNUSU9OPSJodHRwOi8vbG9jYWxob3N0L2NnaS1iaW4vY2EucGwiIE1FVEhPRD1QT1NUPgorPFRBQkxFPgorCis8VFI+Cis8VEQ+S2V5IGJpdHM6PC9URD4KKzxURD48S0VZR0VOIE5BTUU9IlNQS0FDIj48L1REPgorPC9UUj4KKworPFRSPgorPFREPllvdXIgbmFtZTo8L1REPgorCis8VEQ+PElOUFVUIE5BTUU9IndobyIgU0laRT0iNDAiIE1BWExFTkdUSD02MCBBTElHTj1taWRkbGU+PC9URD4KKzwvVFI+CisKKzxUUj4KKzxURD5Zb3VyIGUtbWFpbCBhZGRyZXNzOjwvVEQ+CisKKzxURD48SU5QVVQgTkFNRT0iZW1haWwiIFNJWkU9IjQwIiBNQVhMRU5HVEg9NDAgQUxJR049bWlkZGxlPjwvVEQ+Cis8L1RSPgorCis8VFI+Cis8VEQ+Q291bnRyeSBuYW1lOjwvVEQ+CisKKzxURD48SU5QVVQgTkFNRT0iY291bnRyeSIgU0laRT0iNDAiIE1BWExFTkdUSD0xNTAgQUxJR049bWlkZGxlPjwvVEQ+Cis8L1RSPgorCis8VFI+Cis8VEQ+U3RhdGUgb3IgcHJvdmluY2UgbmFtZTo8L1REPgorCis8VEQ+PElOUFVUIE5BTUU9InN0YXRlIiBTSVpFPSI0MCIgTUFYTEVOR1RIPTQwIEFMSUdOPW1pZGRsZT48L1REPgorPC9UUj4KKworPFRSPgorPFREPk9yZ2FuaXphdGlvbjo8L1REPgorCis8VEQ+PElOUFVUIE5BTUU9Im9yZ2FuaXphdGlvbiIgU0laRT0iNDAiIE1BWExFTkdUSD02MCBBTElHTj1taWRkbGU+PC9URD4KKzwvVFI+CisKKzxUUj4KKzxURD5Db21tZW50OjwvVEQ+CisKKzxURD48SU5QVVQgTkFNRT0iY29tbWVudCIgU0laRT0iNDAiIE1BWExFTkdUSD00MCBBTElHTj1taWRkbGU+PC9URD4KKzwvVFI+Cis8L1RBQkxFPgorCis8SDM+Cis8SU5QVVQgVFlQRT1zdWJtaXQgVkFMVUU9IiAgIFN1Ym1pdCAgIj4mbmJzcDs8SU5QVVQgVFlQRT1yZXNldCBWQUxVRT0iICAgUmVzZXQgQWxsICAgIj48L0gzPgorPC9GT1JNPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY2EucGwgYi90b29scy9jYS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWEwOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2EucGwKQEAgLTAsMCArMSw2NSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyRjb25maWcgICA9ICIvdmFyL29wZW5zc2wvb3BlbnNzbC5jbmYiOworJGNhcGF0aCAgID0gIi91c3IvYmluL29wZW5zc2wgY2EiOworJGNlcnRwYXNzID0gIm15cGFzc3dvcmQiOworJHRlbXBjYSAgID0gIi90bXAvc3NsL2NsaSIucmFuZCAxMDAwMDsKKyR0ZW1wb3V0ICA9ICIvdG1wL3NzbC9jZXJ0dG1wIi5yYW5kIDEwMDAwOworJGNhb3V0ICAgID0gIi90bXAvc3NsL2NlcnRvdXQudHh0IjsKKyRDQWNlcnQgICA9ICIvdmFyL29wZW5zc2wvbG9jYWxDQS9jYWNlcnQucGVtIjsKKyRzcGthYwkgID0gIiI7CisKKyZSZWFkRm9ybTsKKworJHNwa2FjID0gJEZJRUxEU3snU1BLQUMnfTsKKyRzcGthYyA9fiBzL1xuLy9nOworCitvcGVuKFRFTVBDRSwiPiR0ZW1wY2EiKSB8fCBkaWUgJkVycm9yOworcHJpbnQgVEVNUENFICJDID0gJEZJRUxEU3snY291bnRyeSd9XG4iOworcHJpbnQgVEVNUENFICJTVCA9ICRGSUVMRFN7J3N0YXRlJ31cbiI7CitwcmludCBURU1QQ0UgIk8gPSAkRklFTERTeydvcmdhbml6YXRpb24nfVxuIjsKK3ByaW50IFRFTVBDRSAiRW1haWwgPSAkRklFTERTeydlbWFpbCd9XG4iOworcHJpbnQgVEVNUENFICJDTiA9ICRGSUVMRFN7J3dobyd9XG4iOworcHJpbnQgVEVNUENFICJTUEtBQyA9ICRzcGthY1xuIjsKK2Nsb3NlKFRFTVBDRSk7ICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzeXN0ZW0oIiRjYXBhdGggLWJhdGNoIC1jb25maWcgJGNvbmZpZyAtc3BrYWMgJHRlbXBjYSAtb3V0ICR0ZW1wb3V0IC1rZXkgJGNlcnRwYXNzIC1jZXJ0ICRDQWNlcnQ+PiAkY2FvdXQgMj4mMSIpOyAKK29wZW4oQ0VSVCwiJHRlbXBvdXQiKSB8fCBkaWUgJkVycm9yOworQGNlcnRpZmljYXRlID0gPENFUlQ+OworY2xvc2UoQ0VSVCk7CisKKyNzeXN0ZW0oInJtIC1mICR0ZW1wY2EiKTsKKyNzeXN0ZW0oInJtIC1mICR0ZW1wb3V0Iik7CisKK3ByaW50ICJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gteDUwOS11c2VyLWNlcnRcblxuIjsKK3ByaW50IEBjZXJ0aWZpY2F0ZTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMKKyMjIyMgICAgIFByb2NlZHVyZXMKKyMjIyMKKworc3ViIFJlYWRGb3JtIHsKKworICAgaWYgKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgJ0dFVCcpIHsKKyAgICAgIEBwYWlycyA9IHNwbGl0KC8mLywgJEVOVnsnUVVFUllfU1RSSU5HJ30pOworICAgfQorICAgZWxzaWYgKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgJ1BPU1QnKSB7CisgICAgICByZWFkKFNURElOLCAkYnVmZmVyLCAkRU5WeydDT05URU5UX0xFTkdUSCd9KTsKKyAgICAgIEBwYWlycyA9IHNwbGl0KC8mLywgJGJ1ZmZlcik7CisgICB9CisgICBmb3JlYWNoICRwYWlyIChAcGFpcnMpIHsKKyAgICAgICgkbmFtZSwgJHZhbHVlKSA9IHNwbGl0KC89LywgJHBhaXIpOworICAgICAgJG5hbWUgPX4gdHIvKy8gLzsKKyAgICAgICRuYW1lID1+IHMvJShbYS1mQS1GMC05XVthLWZBLUYwLTldKS9wYWNrKCJDIiwgaGV4KCQxKSkvZWc7CisgICAgICAkdmFsdWUgPX4gdHIvKy8gLzsKKyAgICAgICR2YWx1ZSA9fiBzLyUoW2EtZkEtRjAtOV1bYS1mQS1GMC05XSkvcGFjaygiQyIsIGhleCgkMSkpL2VnOworICAgICAgJHZhbHVlID1+IHMvPCEtLSgufFxuKSotLT4vL2c7CisgICAgICAkRklFTERTeyRuYW1lfSA9ICR2YWx1ZTsKKyAgICAgIH0KK30KKworc3ViIEVycm9yIHsKKyAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKKyAgICBwcmludCAiPFA+PFA+PGNlbnRlcj48SDE+Q2FuJ3Qgb3BlbiBmaWxlPC9IMT48L2NlbnRlcj5cbiI7Cit9CmRpZmYgLS1naXQgYS90b29scy9pbXBvcnRDQS5odG1sIGIvdG9vbHMvaW1wb3J0Q0EuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDFmZWFiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW1wb3J0Q0EuaHRtbApAQCAtMCwwICsxLDE2IEBACis8SFRNTD4KKzxIRUFEPgorICAgPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8VElUTEU+SW1wb3J0IENBIHJvb3QgY2VydGlmaWNhdGU8L1RJVExFPgorPC9IRUFEPgorPEJPRFkgVEVYVD0iIzAwMDAwMCIgQkdDT0xPUj0iI0ZGRkZDQyIgTElOSz0iIzAwMDBFRiIgVkxJTks9IiM1MTE4OEUiIEFMSU5LPSIjRkYwMDAwIj4KKyZuYnNwOworPEJSPiZuYnNwOworPEJSPiZuYnNwOworPEJSPiZuYnNwOworPEJSPiZuYnNwOworPENFTlRFUj48Rk9OVCBTSVpFPSsyPjxBIEhSRUY9Imh0dHA6Ly9sb2NhbGhvc3QvY2dpLWJpbi9pbXBvcnRDQS5zaCI+SW1wb3J0CitDQSBjZXJ0aWZpY2F0ZTwvQT48L0ZPTlQ+PC9DRU5URVI+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ltcG9ydENBLnNoIGIvdG9vbHMvaW1wb3J0Q0Euc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ5MmZlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ltcG9ydENBLnNoCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIKK2VjaG8KK2NhdCAvdmFyL2xpYi9odHRwZHMvY2dpLWJpbi9jYWNlcnQucGVtCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHQuc2ggYi90b29scy9zY3JpcHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDM2MmMyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3NjcmlwdC5zaApAQCAtMCwwICsxLDExIEBACisjIS9iaW4vYmFzaAorCitSRU1PVEVfSE9TVD0id3d3Lm1pcnQubmV0OjQ0MyIKK2VjaG8gImNsaWVudCBzY3JpcHQgY29ubmVjdGluZyAkUkVNT1RFX0hPU1QiCisvdXNyL2xvY2FsL2Jpbi9zdHVubmVsIC1mZCAxMCBcCisgICAgMTE8JjAgPDxFT1QgMTA8JjAgMDwmMTEgMTE8Ji0KK2NsaWVudD15ZXMKK2Nvbm5lY3Q9JFJFTU9URV9IT1NUCitFT1QKK2VjaG8gImNsaWVudCBzY3JpcHQgZmluaXNoZWQiCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0dW5uZWwuY25mIGIvdG9vbHMvc3R1bm5lbC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ODIyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0dW5uZWwuY25mCkBAIC0wLDAgKzEsNDcgQEAKKyMgT3BlblNTTCBjb25maWd1cmF0aW9uIGZpbGUgdG8gY3JlYXRlIGEgc2VydmVyIGNlcnRpZmljYXRlDQorIyBieSBNaWNoYWwgVHJvam5hcmEgMTk5OC0yMDE1DQorDQorWyByZXEgXQ0KKyMgY29tbWVudCBvdXQgdGhlIG5leHQgbGluZSB0byBwcm90ZWN0IHRoZSBwcml2YXRlIGtleSB3aXRoIGEgcGFzc3BocmFzZQ0KK2VuY3J5cHRfa2V5ICAgICAgICAgICAgICAgICAgICAgPSBubw0KKyMgdGhlIGRlZmF1bHQga2V5IGxlbmd0aCBpcyBzZWN1cmUgYW5kIHF1aXRlIGZhc3QgLSBkbyBub3QgY2hhbmdlIGl0DQorZGVmYXVsdF9iaXRzICAgICAgICAgICAgICAgICAgICA9IDIwNDgNCitkZWZhdWx0X21kICAgICAgICAgICAgICAgICAgICAgID0gc2hhMQ0KK3g1MDlfZXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgPSBzdHVubmVsX2V4dGVuc2lvbnMNCitkaXN0aW5ndWlzaGVkX25hbWUgICAgICAgICAgICAgID0gc3R1bm5lbF9kbg0KKw0KK1sgc3R1bm5lbF9leHRlbnNpb25zIF0NCituc0NlcnRUeXBlICAgICAgICAgICAgICAgICAgICAgID0gc2VydmVyDQorYmFzaWNDb25zdHJhaW50cyAgICAgICAgICAgICAgICA9IENBOlRSVUUscGF0aGxlbjowDQora2V5VXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICA9IGtleUNlcnRTaWduDQorZXh0ZW5kZWRLZXlVc2FnZSAgICAgICAgICAgICAgICA9IHNlcnZlckF1dGgNCituc0NvbW1lbnQgICAgICAgICAgICAgICAgICAgICAgID0gInN0dW5uZWwgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUiDQorDQorWyBzdHVubmVsX2RuIF0NCitjb3VudHJ5TmFtZSA9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkNCitjb3VudHJ5TmFtZV9kZWZhdWx0ICAgICAgICAgICAgID0gUEwNCitjb3VudHJ5TmFtZV9taW4gICAgICAgICAgICAgICAgID0gMg0KK2NvdW50cnlOYW1lX21heCAgICAgICAgICAgICAgICAgPSAyDQorDQorc3RhdGVPclByb3ZpbmNlTmFtZSAgICAgICAgICAgICA9IFN0YXRlIG9yIFByb3ZpbmNlIE5hbWUgKGZ1bGwgbmFtZSkNCitzdGF0ZU9yUHJvdmluY2VOYW1lX2RlZmF1bHQgICAgID0gTWF6b3ZpYSBQcm92aW5jZQ0KKw0KK2xvY2FsaXR5TmFtZSAgICAgICAgICAgICAgICAgICAgPSBMb2NhbGl0eSBOYW1lIChlZywgY2l0eSkNCitsb2NhbGl0eU5hbWVfZGVmYXVsdCAgICAgICAgICAgID0gV2Fyc2F3DQorDQorb3JnYW5pemF0aW9uTmFtZSAgICAgICAgICAgICAgICA9IE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSkNCitvcmdhbml6YXRpb25OYW1lX2RlZmF1bHQgICAgICAgID0gU3R1bm5lbCBEZXZlbG9wZXJzDQorDQorb3JnYW5pemF0aW9uYWxVbml0TmFtZSAgICAgICAgICA9IE9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pDQorb3JnYW5pemF0aW9uYWxVbml0TmFtZV9kZWZhdWx0ICA9IFByb3Zpc2lvbmFsIENBDQorDQorMC5jb21tb25OYW1lICAgICAgICAgICAgICAgICAgICA9IENvbW1vbiBOYW1lIChGUUROIG9mIHlvdXIgc2VydmVyKQ0KKzAuY29tbW9uTmFtZV9kZWZhdWx0ICAgICAgICAgICAgPSBsb2NhbGhvc3QNCisNCisjIFRvIGNyZWF0ZSBhIGNlcnRpZmljYXRlIGZvciBtb3JlIHRoYW4gb25lIG5hbWUgdW5jb21tZW50Og0KKyMgMS5jb21tb25OYW1lICAgICAgICAgICAgICAgICAgPSBETlMgYWxpYXMgb2YgeW91ciBzZXJ2ZXINCisjIDIuY29tbW9uTmFtZSAgICAgICAgICAgICAgICAgID0gRE5TIGFsaWFzIG9mIHlvdXIgc2VydmVyDQorIyAuLi4NCisjIFNlZSBodHRwOi8vaG9tZS5uZXRzY2FwZS5jb20vZW5nL3NlY3VyaXR5L3NzbF8yLjBfY2VydGlmaWNhdGUuaHRtbA0KKyMgdG8gc2VlIGhvdyBOZXRzY2FwZSB1bmRlcnN0YW5kcyBjb21tb25OYW1lLg0KKw0KZGlmZiAtLWdpdCBhL3Rvb2xzL3N0dW5uZWwuY29uZiBiL3Rvb2xzL3N0dW5uZWwuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzRmNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc3R1bm5lbC5jb25mCkBAIC0wLDAgKzEsMTE2IEBACivvu787IFNhbXBsZSBzdHVubmVsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgV2luMzIgYnkgTWljaGFsIFRyb2puYXJhIDIwMDItMjAxNQ0KKzsgU29tZSBvcHRpb25zIHVzZWQgaGVyZSBtYXkgYmUgaW5hZGVxdWF0ZSBmb3IgeW91ciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24NCis7IFRoaXMgc2FtcGxlIGZpbGUgZG9lcyAqbm90KiByZXByZXNlbnQgc3R1bm5lbC5jb25mIGRlZmF1bHRzDQorOyBQbGVhc2UgY29uc3VsdCB0aGUgbWFudWFsIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhdmFpbGFibGUgb3B0aW9ucw0KKw0KKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCis7ICogR2xvYmFsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKw0KKzsgRGVidWdnaW5nIHN0dWZmIChtYXkgYmUgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcpDQorO2RlYnVnID0gaW5mbw0KKztvdXRwdXQgPSBzdHVubmVsLmxvZw0KKw0KKzsgRW5hYmxlIEZJUFMgMTQwLTIgbW9kZSBpZiBuZWVkZWQgZm9yIGNvbXBsaWFuY2UNCis7ZmlwcyA9IHllcw0KKw0KKzsgTWljcm9zb2Z0IENyeXB0b0FQSSBlbmdpbmUgYWxsb3dzIGZvciBhdXRoZW50aWNhdGlvbiB3aXRoIHByaXZhdGUga2V5cw0KKzsgc3RvcmVkIGluIHRoZSBXaW5kb3dzIGNlcnRpZmljYXRlIHN0b3JlDQorOyBFYWNoIHNlY3Rpb24gdXNpbmcgdGhpcyBmZWF0dXJlIGFsc28gbmVlZHMgdGhlICJlbmdpbmVJZCA9IGNhcGkiIG9wdGlvbg0KKztlbmdpbmUgPSBjYXBpDQorDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKzsgKiBTZXJ2aWNlIGRlZmF1bHRzIG1heSBhbHNvIGJlIHNwZWNpZmllZCBpbiBpbmRpdmlkdWFsIHNlcnZpY2Ugc2VjdGlvbnMgICoNCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorDQorOyBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIGluc2VjdXJlIFNTTHYzIHByb3RvY29sDQorO29wdGlvbnMgPSAtTk9fU1NMdjMNCisNCis7IFRoZXNlIG9wdGlvbnMgcHJvdmlkZSBhZGRpdGlvbmFsIHNlY3VyaXR5IGF0IHNvbWUgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24NCis7b3B0aW9ucyA9IFNJTkdMRV9FQ0RIX1VTRQ0KKztvcHRpb25zID0gU0lOR0xFX0RIX1VTRQ0KKw0KKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCis7ICogSW5jbHVkZSBhbGwgY29uZmlndXJhdGlvbiBmaWxlIGZyYWdtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgZm9sZGVyICAgICAqDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKw0KKztpbmNsdWRlID0gY29uZi5kDQorDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKzsgKiBTZXJ2aWNlIGRlZmluaXRpb25zIChhdCBsZWFzdCBvbmUgc2VydmljZSBoYXMgdG8gYmUgZGVmaW5lZCkgICAgICAgICAgICoNCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFeGFtcGxlIFRMUyBjbGllbnQgbW9kZSBzZXJ2aWNlcw0KKw0KK1tnbWFpbC1wb3AzXQ0KK2NsaWVudCA9IHllcw0KK2FjY2VwdCA9IDEyNy4wLjAuMToxMTANCitjb25uZWN0ID0gcG9wLmdtYWlsLmNvbTo5OTUNCit2ZXJpZnkgPSAyDQorQ0FmaWxlID0gY2EtY2VydHMucGVtDQorY2hlY2tIb3N0ID0gcG9wLmdtYWlsLmNvbQ0KK09DU1BhaWEgPSB5ZXMNCisNCitbZ21haWwtaW1hcF0NCitjbGllbnQgPSB5ZXMNCithY2NlcHQgPSAxMjcuMC4wLjE6MTQzDQorY29ubmVjdCA9IGltYXAuZ21haWwuY29tOjk5Mw0KK3ZlcmlmeSA9IDINCitDQWZpbGUgPSBjYS1jZXJ0cy5wZW0NCitjaGVja0hvc3QgPSBpbWFwLmdtYWlsLmNvbQ0KK09DU1BhaWEgPSB5ZXMNCisNCitbZ21haWwtc210cF0NCitjbGllbnQgPSB5ZXMNCithY2NlcHQgPSAxMjcuMC4wLjE6MjUNCitjb25uZWN0ID0gc210cC5nbWFpbC5jb206NDY1DQordmVyaWZ5ID0gMg0KK0NBZmlsZSA9IGNhLWNlcnRzLnBlbQ0KK2NoZWNrSG9zdCA9IHNtdHAuZ21haWwuY29tDQorT0NTUGFpYSA9IHllcw0KKw0KKzsgRW5jcnlwdGVkIEhUVFAgcHJveHkgYXV0aGVudGljYXRlZCB3aXRoIGEgY2xpZW50IGNlcnRpZmljYXRlDQorOyBsb2NhdGVkIGluIHRoZSBXaW5kb3dzIGNlcnRpZmljYXRlIHN0b3JlDQorO1tleGFtcGxlLXByb3h5XQ0KKztjbGllbnQgPSB5ZXMNCis7YWNjZXB0ID0gMTI3LjAuMC4xOjgwODANCis7Y29ubmVjdCA9IGV4YW1wbGUuY29tOjg0NDMNCis7ZW5naW5lSWQgPSBjYXBpDQorDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFeGFtcGxlIFRMUyBzZXJ2ZXIgbW9kZSBzZXJ2aWNlcw0KKw0KKztbcG9wM3NdDQorO2FjY2VwdCAgPSA5OTUNCis7Y29ubmVjdCA9IDExMA0KKztjZXJ0ID0gc3R1bm5lbC5wZW0NCisNCis7W2ltYXBzXQ0KKzthY2NlcHQgID0gOTkzDQorO2Nvbm5lY3QgPSAxNDMNCis7Y2VydCA9IHN0dW5uZWwucGVtDQorDQorO1tzc210cF0NCis7YWNjZXB0ICA9IDQ2NQ0KKztjb25uZWN0ID0gMjUNCis7Y2VydCA9IHN0dW5uZWwucGVtDQorDQorOyBUTFMgZnJvbnQtZW5kIHRvIGEgd2ViIHNlcnZlcg0KKztbaHR0cHNdDQorO2FjY2VwdCAgPSA0NDMNCis7Y29ubmVjdCA9IDgwDQorO2NlcnQgPSBzdHVubmVsLnBlbQ0KKzsgIlRJTUVPVVRjbG9zZSA9IDAiIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBkZXNpZ24gZmxhdyBpbiBNaWNyb3NvZnQgU0NoYW5uZWwNCis7IE1pY3Jvc29mdCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IHVzZSBUTFMgY2xvc2Utbm90aWZ5IGFsZXJ0IGFuZCB0aHVzIHRoZXkNCis7IGFyZSB2dWxuZXJhYmxlIHRvIHRydW5jYXRpb24gYXR0YWNrcw0KKztUSU1FT1VUY2xvc2UgPSAwDQorDQorOyBSZW1vdGUgY21kLmV4ZSBwcm90ZWN0ZWQgd2l0aCBQU0stYXV0aGVudGljYXRlZCBUTFMNCis7IENyZWF0ZSAic2VjcmV0cy50eHQiIGNvbnRhaW5pbmcgSURFTlRJVFk6S0VZIHBhaXJzDQorO1tjbWRdDQorO2FjY2VwdCA9IDEzMzcNCis7ZXhlYyA9IGM6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZQ0KKztleGVjQXJncyA9IGNtZC5leGUNCis7Y2lwaGVycyA9IFBTSw0KKztQU0tzZWNyZXRzID0gc2VjcmV0cy50eHQNCisNCis7IHZpbTpmdD1kb3NpbmkNCmRpZmYgLS1naXQgYS90b29scy9zdHVubmVsLmNvbmYtc2FtcGxlLmluIGIvdG9vbHMvc3R1bm5lbC5jb25mLXNhbXBsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk4MjAwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc3R1bm5lbC5jb25mLXNhbXBsZS5pbgpAQCAtMCwwICsxLDExNiBAQAor77u/OyBTYW1wbGUgc3R1bm5lbCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFVuaXggYnkgTWljaGFsIFRyb2puYXJhIDIwMDItMjAxNQorOyBTb21lIG9wdGlvbnMgdXNlZCBoZXJlIG1heSBiZSBpbmFkZXF1YXRlIGZvciB5b3VyIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbgorOyBUaGlzIHNhbXBsZSBmaWxlIGRvZXMgKm5vdCogcmVwcmVzZW50IHN0dW5uZWwuY29uZiBkZWZhdWx0cworOyBQbGVhc2UgY29uc3VsdCB0aGUgbWFudWFsIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhdmFpbGFibGUgb3B0aW9ucworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7ICogR2xvYmFsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsgSXQgaXMgcmVjb21tZW5kZWQgdG8gZHJvcCByb290IHByaXZpbGVnZXMgaWYgc3R1bm5lbCBpcyBzdGFydGVkIGJ5IHJvb3QKKztzZXR1aWQgPSBub2JvZHkKKztzZXRnaWQgPSBAREVGQVVMVF9HUk9VUEAKKworOyBQSUQgZmlsZSBpcyBjcmVhdGVkIGluc2lkZSB0aGUgY2hyb290IGphaWwgKGlmIGVuYWJsZWQpCis7cGlkID0gQGxvY2Fsc3RhdGVkaXJAL3J1bi9zdHVubmVsLnBpZAorCis7IERlYnVnZ2luZyBzdHVmZiAobWF5IGJlIHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nKQorO2ZvcmVncm91bmQgPSB5ZXMKKztkZWJ1ZyA9IGluZm8KKztvdXRwdXQgPSBAbG9jYWxzdGF0ZWRpckAvbG9nL3N0dW5uZWwubG9nCisKKzsgRW5hYmxlIEZJUFMgMTQwLTIgbW9kZSBpZiBuZWVkZWQgZm9yIGNvbXBsaWFuY2UKKztmaXBzID0geWVzCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsgKiBTZXJ2aWNlIGRlZmF1bHRzIG1heSBhbHNvIGJlIHNwZWNpZmllZCBpbiBpbmRpdmlkdWFsIHNlcnZpY2Ugc2VjdGlvbnMgICoKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOyBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIGluc2VjdXJlIFNTTHYzIHByb3RvY29sCis7b3B0aW9ucyA9IC1OT19TU0x2MworCis7IFRoZXNlIG9wdGlvbnMgcHJvdmlkZSBhZGRpdGlvbmFsIHNlY3VyaXR5IGF0IHNvbWUgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24KKztvcHRpb25zID0gU0lOR0xFX0VDREhfVVNFCis7b3B0aW9ucyA9IFNJTkdMRV9ESF9VU0UKKworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyAqIEluY2x1ZGUgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZSBmcmFnbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlciAgICAgKgorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7aW5jbHVkZSA9IEBzeXNjb25mZGlyQC9zdHVubmVsL2NvbmYuZAorCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7ICogU2VydmljZSBkZWZpbml0aW9ucyAocmVtb3ZlIGFsbCBzZXJ2aWNlcyBmb3IgaW5ldGQgbW9kZSkgICAgICAgICAgICAgICAqCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhhbXBsZSBUTFMgY2xpZW50IG1vZGUgc2VydmljZXMKKworOyBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHVzZSAvZXRjL3NzbC9jZXJ0cywgd2hpY2ggaXMgdGhlIGNvbW1vbiBsb2NhdGlvbgorOyBvZiBhIGhhc2hlZCBkaXJlY3RvcnkgY29udGFpbmluZyB0cnVzdGVkIENBIGNlcnRpZmljYXRlcy4gIFRoaXMgaXMgbm90Cis7IGEgaGFyZGNvZGVkIHBhdGggb2YgdGhlIHN0dW5uZWwgcGFja2FnZSwgYXMgaXQgaXMgbm90IHJlbGF0ZWQgdG8gdGhlCis7IHN0dW5uZWwgY29uZmlndXJhdGlvbiBpbiBAc3lzY29uZmRpckAvc3R1bm5lbC8uCisKK1tnbWFpbC1wb3AzXQorY2xpZW50ID0geWVzCithY2NlcHQgPSAxMjcuMC4wLjE6MTEwCitjb25uZWN0ID0gcG9wLmdtYWlsLmNvbTo5OTUKK3ZlcmlmeSA9IDIKK0NBcGF0aCA9IC9ldGMvc3NsL2NlcnRzCitjaGVja0hvc3QgPSBwb3AuZ21haWwuY29tCitPQ1NQYWlhID0geWVzCisKK1tnbWFpbC1pbWFwXQorY2xpZW50ID0geWVzCithY2NlcHQgPSAxMjcuMC4wLjE6MTQzCitjb25uZWN0ID0gaW1hcC5nbWFpbC5jb206OTkzCit2ZXJpZnkgPSAyCitDQXBhdGggPSAvZXRjL3NzbC9jZXJ0cworY2hlY2tIb3N0ID0gaW1hcC5nbWFpbC5jb20KK09DU1BhaWEgPSB5ZXMKKworW2dtYWlsLXNtdHBdCitjbGllbnQgPSB5ZXMKK2FjY2VwdCA9IDEyNy4wLjAuMToyNQorY29ubmVjdCA9IHNtdHAuZ21haWwuY29tOjQ2NQordmVyaWZ5ID0gMgorQ0FwYXRoID0gL2V0Yy9zc2wvY2VydHMKK2NoZWNrSG9zdCA9IHNtdHAuZ21haWwuY29tCitPQ1NQYWlhID0geWVzCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRXhhbXBsZSBUTFMgc2VydmVyIG1vZGUgc2VydmljZXMKKworO1twb3Azc10KKzthY2NlcHQgID0gOTk1Cis7Y29ubmVjdCA9IDExMAorO2NlcnQgPSBAc3lzY29uZmRpckAvc3R1bm5lbC9zdHVubmVsLnBlbQorCis7W2ltYXBzXQorO2FjY2VwdCAgPSA5OTMKKztjb25uZWN0ID0gMTQzCis7Y2VydCA9IEBzeXNjb25mZGlyQC9zdHVubmVsL3N0dW5uZWwucGVtCisKKztbc3NtdHBdCis7YWNjZXB0ICA9IDQ2NQorO2Nvbm5lY3QgPSAyNQorO2NlcnQgPSBAc3lzY29uZmRpckAvc3R1bm5lbC9zdHVubmVsLnBlbQorCis7IFRMUyBmcm9udC1lbmQgdG8gYSB3ZWIgc2VydmVyCis7W2h0dHBzXQorO2FjY2VwdCAgPSA0NDMKKztjb25uZWN0ID0gODAKKztjZXJ0ID0gQHN5c2NvbmZkaXJAL3N0dW5uZWwvc3R1bm5lbC5wZW0KKzsgIlRJTUVPVVRjbG9zZSA9IDAiIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBkZXNpZ24gZmxhdyBpbiBNaWNyb3NvZnQgU0NoYW5uZWwKKzsgTWljcm9zb2Z0IGltcGxlbWVudGF0aW9ucyBkbyBub3QgdXNlIFRMUyBjbG9zZS1ub3RpZnkgYWxlcnQgYW5kIHRodXMgdGhleQorOyBhcmUgdnVsbmVyYWJsZSB0byB0cnVuY2F0aW9uIGF0dGFja3MKKztUSU1FT1VUY2xvc2UgPSAwCisKKzsgUmVtb3RlIHNoZWxsIHByb3RlY3RlZCB3aXRoIFBTSy1hdXRoZW50aWNhdGVkIFRMUworOyBDcmVhdGUgIkBzeXNjb25mZGlyQC9zdHVubmVsL3NlY3JldHMudHh0IiBjb250YWluaW5nIElERU5USVRZOktFWSBwYWlycworO1tzaGVsbF0KKzthY2NlcHQgPSAxMzM3Cis7ZXhlYyA9IC9iaW4vc2gKKztleGVjQXJncyA9IHNoIC1pCis7Y2lwaGVycyA9IFBTSworO1BTS3NlY3JldHMgPSBAc3lzY29uZmRpckAvc3R1bm5lbC9zZWNyZXRzLnR4dAorCis7IHZpbTpmdD1kb3NpbmkKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0dW5uZWwuaW5pdC5pbiBiL3Rvb2xzL3N0dW5uZWwuaW5pdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA5NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc3R1bm5lbC5pbml0LmluCkBAIC0wLDAgKzEsMjA0IEBACisjISAvYmluL3NoIC1lCisjIyMgQkVHSU4gSU5JVCBJTkZPCisjIFByb3ZpZGVzOiAgICAgICAgICBzdHVubmVsCisjIFJlcXVpcmVkLVN0YXJ0OiAgICAkbG9jYWxfZnMgJHJlbW90ZV9mcworIyBSZXF1aXJlZC1TdG9wOiAgICAgJGxvY2FsX2ZzICRyZW1vdGVfZnMKKyMgU2hvdWxkLVN0YXJ0OiAgICAgICRzeXNsb2cKKyMgU2hvdWxkLVN0b3A6ICAgICAgICRzeXNsb2cKKyMgRGVmYXVsdC1TdGFydDogICAgIDIgMyA0IDUKKyMgRGVmYXVsdC1TdG9wOiAgICAgIDAgMSA2CisjIFNob3J0LURlc2NyaXB0aW9uOiBTdGFydCBvciBzdG9wIHN0dW5uZWwgNC54IChTU0wgdHVubmVsIGZvciBuZXR3b3JrIGRhZW1vbnMpCisjIERlc2NyaXB0aW9uOiAgICAgICBTdGFydHMgb3Igc3RvcHMgYWxsIGNvbmZpZ3VyZWQgU1NMIG5ldHdvcmsgdHVubmVscy4gRWFjaCAqLmNvbmYgZmlsZSBpbgorIyAgICAgICAgICAgICAgICAgICAgL2V0Yy9zdHVubmVsLyB3aWxsIHNwYXduIGEgc2VwYXJhdGUgc3R1bm5lbCBwcm9jZXNzLiBUaGUgbGlzdCBvZiBmaWxlcworIyAgICAgICAgICAgICAgICAgICAgY2FuIGJlIG92ZXJyaWRlbiBpbiAvZXRjL2RlZmF1bHQvc3R1bm5lbCwgYW5kIHRoYXQgc2FtZSBmaWxlIGNhbiBiZSB1c2VkCisjICAgICAgICAgICAgICAgICAgICB0byBjb21wbGV0ZWx5IGRpc2FibGUgKmFsbCogdHVubmVscy4KKyMjIyBFTkQgSU5JVCBJTkZPCisKKy4gL2xpYi9sc2IvaW5pdC1mdW5jdGlvbnMKKworREVGQVVMVFBJREZJTEU9Ii92YXIvcnVuL3N0dW5uZWwucGlkIgorREFFTU9OPUBiaW5kaXJAL3N0dW5uZWwKK05BTUU9c3R1bm5lbAorREVTQz0iU1NMIHR1bm5lbHMiCitPUFRJT05TPSIiCitFTkFCTEVEPTAKKworZ2V0X29wdCgpIHsKKyAgc2VkIC1lICJzO15bWzpzcGFjZTpdXSo7OyIgLWUgInM7W1s6c3BhY2U6XV0qJDs7IiBcCisgICAgLWUgInM7W1s6c3BhY2U6XV0qPVtbOnNwYWNlOl1dKjs9OyIgIiQxIiB8CisgICAgZ3JlcCAtaSAiXiQyPSIgfCBzZWQgLWUgInM7XltePV0qPTs7IgorfQorCitnZXRfcGlkZmlsZSgpIHsKKyAgbG9jYWwgZmlsZT0kMQorICBpZiBbIC1mICRmaWxlIF07IHRoZW4KKyAgICBDSFJPT1Q9YGdldF9vcHQgJGZpbGUgY2hyb290YAorICAgIFBJREZJTEU9YGdldF9vcHQgJGZpbGUgcGlkYAorICAgIGlmIFsgIiRQSURGSUxFIiA9ICIiIF07IHRoZW4KKyAgICAgIFBJREZJTEU9JERFRkFVTFRQSURGSUxFCisgICAgZmkKKyAgICBlY2hvICIkQ0hST09ULyRQSURGSUxFIgorICBmaQorfQorCitzdGFydGRhZW1vbnMoKSB7CisgIGxvY2FsIHJlcyBmaWxlIGFyZ3MgcGlkZmlsZSB3YXJuIHN0YXR1cworCisgIGlmICEgWyAtZCAvdmFyL3J1bi9zdHVubmVsIF07IHRoZW4KKyAgICBybSAtcmYgL3Zhci9ydW4vc3R1bm5lbAorICAgIGluc3RhbGwgLWQgLW8gc3R1bm5lbCAtZyBzdHVubmVsIC92YXIvcnVuL3N0dW5uZWwKKyAgZmkKKyAgaWYgWyAtbiAiJFJMSU1JVFMiIF07IHRoZW4KKyAgICB1bGltaXQgJFJMSU1JVFMKKyAgZmkKKyAgcmVzPTAKKyAgZm9yIGZpbGUgaW4gJEZJTEVTOyBkbyAKKyAgICBpZiBbIC1mICRmaWxlIF07IHRoZW4KKyAgICAgIGVjaG8gLW4gIiAkZmlsZTogIgorICAgICAgYXJncz0iJGZpbGUgJE9QVElPTlMiCisgICAgICBwaWRmaWxlPWBnZXRfcGlkZmlsZSAkZmlsZWAKKyAgICAgIGlmIGVncmVwIC1xZSAnXnBpZFtbOnNwYWNlOl1dKj0nICIkZmlsZSI7IHRoZW4KKyAgICAgICAgd2Fybj0nJworICAgICAgZWxzZQorICAgICAgICB3YXJuPScgKG5vIHBpZD1waWRmaWxlIHNwZWNpZmllZCEpJworICAgICAgZmkKKyAgICAgIHN0YXR1cz0wCisgICAgICBzdGFydF9kYWVtb24gLXAgIiRwaWRmaWxlIiAiJERBRU1PTiIgJGFyZ3MgfHwgc3RhdHVzPSQ/CisgICAgICBpZiBbICIkc3RhdHVzIiAtZXEgMCBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gInN0YXJ0ZWQkd2FybiIKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyAiZmFpbGVkJHdhcm4iCisgICAgICAgIGVjaG8gIllvdSBzaG91bGQgY2hlY2sgdGhhdCB5b3UgaGF2ZSBzcGVjaWZpZWQgdGhlIHBpZD0gaW4geW91IGNvbmZpZ3VyYXRpb24gZmlsZSIKKyAgICAgICAgcmVzPTEKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZTsKKyAgZWNobyAnJworICByZXR1cm4gIiRyZXMiCit9CisKK2tpbGxkYWVtb25zKCkKK3sKKyAgbG9jYWwgc2lnIGZpbGUgcGlkZmlsZSBzdGF0dXMKKworICBzaWc9JHsxOi1URVJNfQorICByZXM9MAorICBmb3IgZmlsZSBpbiAkRklMRVM7IGRvCisgICAgZWNobyAtbiAiICRmaWxlOiAiCisgICAgcGlkZmlsZT1gZ2V0X3BpZGZpbGUgJGZpbGVgCisgICAgaWYgWyAhIC1lICIkcGlkZmlsZSIgXTsgdGhlbgorICAgICAgZWNobyAtbiAibm8gcGlkIGZpbGUiCisgICAgZWxzZQorICAgICAgc3RhdHVzPTAKKyAgICAgIGtpbGxwcm9jIC1wICIkcGlkZmlsZSIgIiREQUVNT04iICIkc2lnIiB8fCBzdGF0dXM9JD8KKyAgICAgIGlmIFsgIiRzdGF0dXMiIC1lcSAwIF07IHRoZW4KKyAgICAgICAgZWNobyAtbiAnc3RvcHBlZCcKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyAtbiAnZmFpbGVkJworICAgICAgICByZXM9MQorICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIGVjaG8gJycKKyAgcmV0dXJuICIkcmVzIgorfQorCitxdWVyeWRhZW1vbnMoKQoreworICBsb2NhbCByZXMgZmlsZSBwaWRmaWxlIHN0YXR1cworCisgIHJlcz0wCisgIGZvciBmaWxlIGluICRGSUxFUzsgZG8KKyAgICBlY2hvIC1uICIgJGZpbGU6ICIKKyAgICBwaWRmaWxlPWBnZXRfcGlkZmlsZSAiJGZpbGUiYAorICAgIGlmIFsgISAtZSAiJHBpZGZpbGUiIF07IHRoZW4KKyAgICAgIGVjaG8gLW4gJ25vIHBpZCBmaWxlJworICAgICAgcmVzPTEKKyAgICBlbHNlCisgICAgICBzdGF0dXM9MAorICAgICAgcGlkb2Zwcm9jIC1wICIkcGlkZmlsZSIgIiREQUVNT04iID4vZGV2L251bGwgfHwgc3RhdHVzPSIkPyIKKyAgICAgIGlmIFsgIiRzdGF0dXMiID0gMCBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gJ3J1bm5pbmcnCisgICAgICBlbGlmIFsgIiRzdGF0dXMiID0gNCBdOyB0aGVuCisgICAgICAgIGVjaG8gImNhbm5vdCBhY2Nlc3MgdGhlIHBpZCBmaWxlICRwaWRmaWxlIgorICAgICAgICByZXM9MQorICAgICAgZWxzZQorICAgICAgICBlY2hvIC1uICdzdG9wcGVkJworICAgICAgICByZXM9MQorICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIGVjaG8gJycKKyAgZXhpdCAiJHJlcyIKK30KKworaWYgWyAieCRPUFRJT05TIiAhPSAieCIgXTsgdGhlbgorICBPUFRJT05TPSItLSAkT1BUSU9OUyIKK2ZpCisKK1sgLWYgQHN5c2NvbmZkaXJAL2RlZmF1bHQvc3R1bm5lbCBdICYmIC4gL2V0Yy9kZWZhdWx0L3N0dW5uZWwKK2lmIFsgIiRFTkFCTEVEIiA9ICIwIiBdIDsgdGhlbgorICBlY2hvICIkREVTQyBkaXNhYmxlZCwgc2VlIEBzeXNjb25mZGlyQC9kZWZhdWx0L3N0dW5uZWwiCisgIGV4aXQgMAorZmkKKworIyBJZiB0aGUgdXNlciB3YW50IHRvIG1hbmFnZSBhIHNpbmdsZSB0dW5uZWwsIHRoZSBjb25mIGZpbGUncyBuYW1lCisjIGlzIGluICQyLiBPdGhlcndpc2UsIHJlc3BlY3QgL2V0Yy9kZWZhdWx0L3N0dW5uZWw0IHNldHRpbmcuIElmIG5vCisjIHNldHRpbmcgdGhlcmUsIHVzZSAvZXRjL3N0dW5uZWwvKi5jb25mCitpZiBbIC1uICIkezI6LX0iIF07IHRoZW4KKyAgaWYgWyAtZSAiQHN5c2NvbmZkaXJAL3N0dW5uZWwvJDIuY29uZiIgXTsgdGhlbgorICAgIEZJTEVTPSJAc3lzY29uZmRpckAvc3R1bm5lbC8kMi5jb25mIgorICBlbHNlCisgICAgZWNobyA+JjIgIkBzeXNjb25mZGlyQC9zdHVubmVsLyQyLmNvbmYgZG9lcyBub3QgZXhpc3QuIgorICAgIGV4aXQgMQorICBmaQorZWxzZQorICBpZiBbIC16ICIkRklMRVMiIF07IHRoZW4KKyAgICBGSUxFUz0iQHN5c2NvbmZkaXJAL3N0dW5uZWwvKi5jb25mIgorICBmaQorZmkKKworWyAteCAkREFFTU9OIF0gfHwgZXhpdCAwCisKK3NldCAtZQorCityZXM9MAorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorICAgIGVjaG8gLW4gIlN0YXJ0aW5nICRERVNDOiIKKyAgICBzdGFydGRhZW1vbnMKKyAgICByZXM9JD8KKyAgICA7OworICBzdG9wKQorICAgIGVjaG8gLW4gIlN0b3BwaW5nICRERVNDOiIKKyAgICBraWxsZGFlbW9ucworICAgIHJlcz0kPworICAgIDs7CisgIHJlb3Blbi1sb2dzKQorICAgIGVjaG8gLW4gIlJlb3BlbmluZyBsb2cgZmlsZXMgJERFU0M6IgorICAgIGtpbGxkYWVtb25zIFVTUjEKKyAgICByZXM9JD8KKyAgICA7OworICBmb3JjZS1yZWxvYWR8cmVsb2FkKQorICAgIGVjaG8gLW4gIlJlbG9hZGluZyBjb25maWd1cmF0aW9uICRERVNDOiIKKyAgICBraWxsZGFlbW9ucyBIVVAKKyAgICByZXM9JD8KKyAgICA7OyAgCisgIHJlc3RhcnQpCisgICAgZWNobyAtbiAiUmVzdGFydGluZyAkREVTQzoiCisgICAga2lsbGRhZW1vbnMgJiYgc3RhcnRkYWVtb25zCisgICAgcmVzPSQ/CisgICAgOzsKKyAgc3RhdHVzKQorICAgIGVjaG8gLW4gIiRERVNDIHN0YXR1czoiCisgICAgcXVlcnlkYWVtb25zCisgICAgcmVzPSQ/CisgICAgOzsKKyAgKikKKyAgICBOPUBzeXNjb25mZGlyQC9pbml0LmQvJE5BTUUKKyAgICBlY2hvICJVc2FnZTogJE4ge3N0YXJ0fHN0b3B8c3RhdHVzfHJlbG9hZHxyZW9wZW4tbG9nc3xyZXN0YXJ0fSBbPHN0dW5uZWwgaW5zdGFuY2U+XSIgPiYyCisgICAgcmVzPTEKKyAgICA7OworZXNhYworCitleGl0ICIkcmVzIgpkaWZmIC0tZ2l0IGEvdG9vbHMvc3R1bm5lbC5saWNlbnNlIGIvdG9vbHMvc3R1bm5lbC5saWNlbnNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjczOWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zdHVubmVsLmxpY2Vuc2UKQEAgLTAsMCArMSwxMyBAQAorQ29weXJpZ2h0IChDKSAxOTk4LTIwMTUgTWljaGFsIFRyb2puYXJhCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorCitMaW5raW5nIHN0dW5uZWwgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiBzdHVubmVsLiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KKworSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHN0dW5uZWwgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gY29tYmluZSBzdHVubmVsIHdpdGggZnJlZSBzb2Z0d2FyZSBwcm9ncmFtcyBvciBsaWJyYXJpZXMgdGhhdCBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMR1BMIGFuZCB3aXRoIGNvZGUgaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgT3BlblNTTCB1bmRlciB0aGUgT3BlblNTTCBMaWNlbnNlIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIGNvZGUsIHdpdGggdW5jaGFuZ2VkIGxpY2Vuc2UpLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIHN5c3RlbSBmb2xsb3dpbmcgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGZvciBzdHVubmVsIGFuZCB0aGUgbGljZW5zZXMgb2YgdGhlIG90aGVyIGNvZGUgY29uY2VybmVkLgorCitOb3RlIHRoYXQgcGVvcGxlIHdobyBtYWtlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHN0dW5uZWwgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZ3JhbnQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlaXIgbW9kaWZpZWQgdmVyc2lvbnM7IGl0IGlzIHRoZWlyIGNob2ljZSB3aGV0aGVyIHRvIGRvIHNvLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZ2l2ZXMgcGVybWlzc2lvbiB0byByZWxlYXNlIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IHRoaXMgZXhjZXB0aW9uOyB0aGlzIGV4Y2VwdGlvbiBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlbGVhc2UgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIGNhcnJpZXMgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL3N0dW5uZWwubnNpIGIvdG9vbHMvc3R1bm5lbC5uc2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkZjVlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0dW5uZWwubnNpCkBAIC0wLDAgKzEsNDIzIEBACisjIE5TSVMgc3R1bm5lbCBpbnN0YWxsZXIgYnkgTWljaGFsIFRyb2puYXJhIDE5OTgtMjAxNQ0KKw0KKyFpbmNsdWRlICJTZWN0aW9ucy5uc2giDQorDQorIWlmbmRlZiBWRVJTSU9ODQorIWRlZmluZSBWRVJTSU9OIDUuMjINCishZW5kaWYNCisNCishaWZuZGVmIFpMSUJESVINCishZGVmaW5lIFpMSUJESVIgemxpYi0xLjIuOC13aW4zMg0KKyFlbmRpZg0KKw0KKyFpZm5kZWYgT1BFTlNTTERJUg0KKyFkZWZpbmUgT1BFTlNTTERJUiBvcGVuc3NsLTEuMC4yZC13aW4zMg0KKyFlbmRpZg0KKw0KKyFhZGRwbHVnaW5kaXIgInBsdWdpbnMvU2ltcGxlRkMiDQorIWFkZHBsdWdpbmRpciAicGx1Z2lucy9TaGVsbExpbmsvUGx1Z2lucyINCisNCitOYW1lICJzdHVubmVsICR7VkVSU0lPTn0iDQorT3V0RmlsZSAic3R1bm5lbC0ke1ZFUlNJT059LWluc3RhbGxlci5leGUiIA0KK0luc3RhbGxEaXIgIiRQUk9HUkFNRklMRVNcc3R1bm5lbCINCitCcmFuZGluZ1RleHQgIkF1dGhvcjogTWljaGFsIFRyb2puYXJhIiANCitMaWNlbnNlRGF0YSAic3R1bm5lbC5saWNlbnNlIg0KK1NldENvbXByZXNzb3IgL1NPTElEIExaTUENCitJbnN0YWxsRGlyUmVnS2V5IEhLTE0gIlNvZnR3YXJlXE5TSVNfc3R1bm5lbCIgIkluc3RhbGxfRGlyIg0KKw0KK1JlcXVlc3RFeGVjdXRpb25MZXZlbCBhZG1pbg0KKw0KK1BhZ2UgbGljZW5zZQ0KK1BhZ2UgY29tcG9uZW50cw0KK1BhZ2UgZGlyZWN0b3J5DQorUGFnZSBpbnN0ZmlsZXMNCisNCitVbmluc3RQYWdlIHVuaW5zdENvbmZpcm0NCitVbmluc3RQYWdlIGluc3RmaWxlcw0KKw0KK1NlY3Rpb24gIlN0dW5uZWwgQ29yZSBGaWxlcyAocmVxdWlyZWQpIg0KKyAgU2VjdGlvbkluIFJPDQorICBTZXRPdXRQYXRoICIkSU5TVERJUiINCisNCisgICMgc3RvcCB0aGUgc2VydmljZSwgZXhpdCBzdHVubmVsDQorICBWYXIgL0dMT0JBTCBzZXJ2aWNlDQorICBTdHJDcHkgJHNlcnZpY2UgMQ0KKyAgUmVhZFJlZ1N0ciAkUjAgSEtMTSBcDQorICAgICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgQ3VycmVudFZlcnNpb24NCisgIElmRXJyb3JzIHNraXBfc2VydmljZV9zdG9wDQorICBFeGVjV2FpdCAnIiRJTlNURElSXHN0dW5uZWwuZXhlIiAtc3RvcCAtcXVpZXQnICRzZXJ2aWNlDQorc2tpcF9zZXJ2aWNlX3N0b3A6DQorICBFeGVjV2FpdCAnIiRJTlNURElSXHN0dW5uZWwuZXhlIiAtZXhpdCAtcXVpZXQnDQorDQorICAjIHdyaXRlIGZpbGVzDQorICBTZXRPdmVyd3JpdGUgb2ZmDQorICBGaWxlICJzdHVubmVsLmNvbmYiDQorICBGaWxlICJjYS1jZXJ0cy5wZW0iDQorICBTZXRPdmVyd3JpdGUgb24NCisgICFjZCAiLi4iDQorICAhY2QgImRvYyINCisgIEZpbGUgInN0dW5uZWwuaHRtbCINCisgICFjZCAiLi4iDQorICAhY2QgImJpbiINCisgICFjZCAid2luMzIiDQorICBGaWxlICJzdHVubmVsLmV4ZSINCisgIEZpbGUgInN0dW5uZWwuZXhlLm1hbmlmZXN0Ig0KKyAgIWNkICIuLiINCisgICFjZCAiLi4iDQorICAhY2QgIi4uIg0KKyAgIWNkICIke1pMSUJESVJ9Ig0KKyAgRmlsZSAiemxpYjEuZGxsIg0KKyAgRmlsZSAiemxpYjEuZGxsLm1hbmlmZXN0Ig0KKyAgIWNkICIuLiINCisgICFjZCAiJHtPUEVOU1NMRElSfSINCisgICFjZCAib3V0MzJkbGwiDQorICBGaWxlICJsaWJlYXkzMi5kbGwiDQorICBGaWxlICJsaWJlYXkzMi5kbGwubWFuaWZlc3QiDQorICBGaWxlICJzc2xlYXkzMi5kbGwiDQorICBGaWxlICJzc2xlYXkzMi5kbGwubWFuaWZlc3QiDQorICBGaWxlICI0NzU4Y2NhLmRsbCINCisgIEZpbGUgIjQ3NThjY2EuZGxsLm1hbmlmZXN0Ig0KKyAgRmlsZSAiYWVwLmRsbCINCisgIEZpbGUgImFlcC5kbGwubWFuaWZlc3QiDQorICBGaWxlICJhdGFsbGEuZGxsIg0KKyAgRmlsZSAiYXRhbGxhLmRsbC5tYW5pZmVzdCINCisgIEZpbGUgImNhcGkuZGxsIg0KKyAgRmlsZSAiY2FwaS5kbGwubWFuaWZlc3QiDQorICBGaWxlICJjaGlsLmRsbCINCisgIEZpbGUgImNoaWwuZGxsLm1hbmlmZXN0Ig0KKyAgRmlsZSAiY3N3aWZ0LmRsbCINCisgIEZpbGUgImNzd2lmdC5kbGwubWFuaWZlc3QiDQorICBGaWxlICJnbXAuZGxsIg0KKyAgRmlsZSAiZ21wLmRsbC5tYW5pZmVzdCINCisgIEZpbGUgImdvc3QuZGxsIg0KKyAgRmlsZSAiZ29zdC5kbGwubWFuaWZlc3QiDQorICBGaWxlICJudXJvbi5kbGwiDQorICBGaWxlICJudXJvbi5kbGwubWFuaWZlc3QiDQorICBGaWxlICJwYWRsb2NrLmRsbCINCisgIEZpbGUgInBhZGxvY2suZGxsLm1hbmlmZXN0Ig0KKyAgRmlsZSAic3VyZXdhcmUuZGxsIg0KKyAgRmlsZSAic3VyZXdhcmUuZGxsLm1hbmlmZXN0Ig0KKyAgRmlsZSAidWJzZWMuZGxsIg0KKyAgRmlsZSAidWJzZWMuZGxsLm1hbmlmZXN0Ig0KKw0KKyAgIWNkICIuLiINCisgICFjZCAiLi4iDQorICAhY2QgInJlZGlzdCINCisgIEZpbGUgIm1zdmNyOTAuZGxsIg0KKyAgRmlsZSAiTWljcm9zb2Z0LlZDOTAuQ1JULm1hbmlmZXN0Ig0KKyAgIWNkICIuLiINCisgICFjZCAic3R1bm5lbCINCisgICFjZCAidG9vbHMiDQorICAjIE1JTkdXIGJ1aWxkcyByZXF1aXJlcyBsaWJzc3AtMC5kbGwgaW5zdGVhZCBvZiBtc3ZjcjkwLmRsbA0KKw0KKyAgIyBhZGQgZmlyZXdhbGwgcnVsZQ0KKyAgU2ltcGxlRkM6OkFkZEFwcGxpY2F0aW9uICJzdHVubmVsIChHVUkgVmVyc2lvbikiIFwNCisgICAgIiRJTlNURElSXHN0dW5uZWwuZXhlIiAwIDIgIiIgMQ0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigxKS9zdWNjZXNzKDApDQorICBEZXRhaWxQcmludCAiU2ltcGxlRkM6OkFkZEFwcGxpY2F0aW9uOiAkMCINCisNCisgICMgd3JpdGUgdW5pbnN0YWxsZXIgYW5kIGl0cyByZWdpc3RyeSBlbnRyaWVzDQorICBXcml0ZVVuaW5zdGFsbGVyICJ1bmluc3RhbGwuZXhlIg0KKyAgV3JpdGVSZWdTdHIgSEtMTSAiU29mdHdhcmVcTlNJU19zdHVubmVsIiAiSW5zdGFsbF9EaXIiICIkSU5TVERJUiINCisgIFdyaXRlUmVnU3RyIEhLTE0gXA0KKyAgICAiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXHN0dW5uZWwiIFwNCisgICAgIkRpc3BsYXlOYW1lIiAic3R1bm5lbCINCisgIFdyaXRlUmVnU3RyIEhLTE0gXA0KKyAgICAiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXHN0dW5uZWwiIFwNCisgICAgIlVuaW5zdGFsbFN0cmluZyIgJyIkSU5TVERJUlx1bmluc3RhbGwuZXhlIicNCisgIFdyaXRlUmVnRFdPUkQgSEtMTSBcDQorICAgICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcc3R1bm5lbCIgXA0KKyAgICAiTm9Nb2RpZnkiIDENCisgIFdyaXRlUmVnRFdPUkQgSEtMTSBcDQorICAgICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcc3R1bm5lbCIgXA0KKyAgICAiTm9SZXBhaXIiIDENCisNCisgICMgc3RhcnQgdGhlIHNlcnZpY2UNCisgIEludENtcCAkc2VydmljZSAwIGxibF9zdGFydF9zZXJ2aWNlIGxibF9za2lwX3NlcnZpY2UgbGJsX3NraXBfc2VydmljZQ0KK2xibF9zdGFydF9zZXJ2aWNlOg0KKyAgRXhlY1dhaXQgJyIkSU5TVERJUlxzdHVubmVsLmV4ZSIgLXN0YXJ0IC1xdWlldCcNCitsYmxfc2tpcF9zZXJ2aWNlOg0KK1NlY3Rpb25FbmQNCisNCitTZWN0aW9uICJTZWxmLXNpZ25lZCBDZXJ0aWZpY2F0ZSBUb29scyIgc2VjdGlvbkNBDQorICBTZXRPdXRQYXRoICIkSU5TVERJUiINCisgICFjZCAiLi4iDQorICAhY2QgIi4uIg0KKyAgIWNkICIke09QRU5TU0xESVJ9Ig0KKyAgIWNkICJvdXQzMmRsbCINCisgIEZpbGUgIm9wZW5zc2wuZXhlIg0KKyAgRmlsZSAib3BlbnNzbC5leGUubWFuaWZlc3QiDQorICAhY2QgIi4uIg0KKyAgIWNkICIuLiINCisgICFjZCAic3R1bm5lbCINCisgICFjZCAidG9vbHMiDQorICBGaWxlICJzdHVubmVsLmNuZiINCisgIElmU2lsZW50IGxibF9za2lwX25ld19wZW0NCisgIElmRmlsZUV4aXN0cyAiJElOU1RESVJcc3R1bm5lbC5wZW0iIGxibF9za2lwX25ld19wZW0NCisgIFJlYWRFbnZTdHIgJDAgIkhPTUUiDQorICBTdHJDbXAgJDAgIiIgbGJsX2hvbWVfZGVmaW5lZCAwDQorICBTeXN0ZW06OkNhbGwgJ0tlcm5lbDMyOjpTZXRFbnZpcm9ubWVudFZhcmlhYmxlKHQsIHQpIGkoIkhPTUUiLCAiJElOU1RESVIiKS5yMCcNCitsYmxfaG9tZV9kZWZpbmVkOg0KKyAgRXhlY1dhaXQgJyIkSU5TVERJUlxvcGVuc3NsLmV4ZSIgcmVxIC1uZXcgLXg1MDkgLWRheXMgMzY1IC1jb25maWcgc3R1bm5lbC5jbmYgLW91dCBzdHVubmVsLnBlbSAta2V5b3V0IHN0dW5uZWwucGVtJw0KK2xibF9za2lwX25ld19wZW06DQorU2VjdGlvbkVuZA0KKw0KK1NlY3Rpb24gIlRlcm1pbmFsIFZlcnNpb24gb2Ygc3R1bm5lbCIgc2VjdGlvblRFUk0NCisgIFNldE91dFBhdGggIiRJTlNURElSIg0KKyAgIWNkICIuLiINCisgICFjZCAiYmluIg0KKyAgIWNkICJ3aW4zMiINCisgIEZpbGUgInRzdHVubmVsLmV4ZSINCisgIEZpbGUgInRzdHVubmVsLmV4ZS5tYW5pZmVzdCINCisgICFjZCAiLi4iDQorICAhY2QgIi4uIg0KKyAgIWNkICJ0b29scyINCisgICMgYWRkIGZpcmV3YWxsIHJ1bGUNCisgIFNpbXBsZUZDOjpBZGRBcHBsaWNhdGlvbiAic3R1bm5lbCAoVGVybWluYWwgVmVyc2lvbikiIFwNCisgICAgIiRJTlNURElSXHRzdHVubmVsLmV4ZSIgMCAyICIiIDENCisgIFBvcCAkMCAjIHJldHVybnMgZXJyb3IoMSkvc3VjY2VzcygwKQ0KKyAgRGV0YWlsUHJpbnQgIlNpbXBsZUZDOjpBZGRBcHBsaWNhdGlvbjogJDAiDQorU2VjdGlvbkVuZA0KKw0KK1NlY3Rpb24gIlN0YXJ0IE1lbnUgU2hvcnRjdXRzIg0KKyAgU2V0U2hlbGxWYXJDb250ZXh0IGFsbA0KKyAgQ3JlYXRlRGlyZWN0b3J5ICIkU01QUk9HUkFNU1xzdHVubmVsIg0KKw0KKyAgIyByZW1vdmUgb2xkIGxpbmtzDQorICBEZWxldGUgIiRTTVBST0dSQU1TXHN0dW5uZWxcKi5sbmsiDQorICBEZWxldGUgIiRTTVBST0dSQU1TXHN0dW5uZWxcKi51cmwiDQorDQorICAjIG1haW4gbGluaw0KKyAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBHVUkgU3RhcnQubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIiIgIiRJTlNURElSXHN0dW5uZWwuZXhlIiAwDQorICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcc3R1bm5lbFxzdHVubmVsIEdVSSBTdG9wLmxuayIgXA0KKyAgICAiJElOU1RESVJcc3R1bm5lbC5leGUiICItZXhpdCIgIiRJTlNURElSXHN0dW5uZWwuZXhlIiAwDQorDQorICAjIHRzdHVubmVsDQorICBTZWN0aW9uR2V0RmxhZ3MgJHtzZWN0aW9uVEVSTX0gJDANCisgIEludE9wICQwICQwICYgJHtTRl9TRUxFQ1RFRH0NCisgIEludENtcCAkMCAwIGxibF9ub1RFUk0NCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXHN0dW5uZWwgVGVybWluYWwgU3RhcnQubG5rIiBcDQorICAgICIkSU5TVERJUlx0c3R1bm5lbC5leGUiICIiICIkSU5TVERJUlx0c3R1bm5lbC5leGUiIDANCitsYmxfbm9URVJNOg0KKw0KKyAgIyBOVCBzZXJ2aWNlDQorICBDbGVhckVycm9ycw0KKyAgUmVhZFJlZ1N0ciAkUjAgSEtMTSBcDQorICAgICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgQ3VycmVudFZlcnNpb24NCisgIElmRXJyb3JzIHNraXBfc2VydmljZV9saW5rcw0KKw0KKyAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBTZXJ2aWNlIEluc3RhbGwubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIi1pbnN0YWxsIiAiJElOU1RESVJcc3R1bm5lbC5leGUiIDANCisgIFNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yIFwNCisgICAgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBTZXJ2aWNlIEluc3RhbGwubG5rIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigtMSkvc3VjY2VzcygwKQ0KKyAgRGV0YWlsUHJpbnQgIlNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yOiAkMCINCisNCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXHN0dW5uZWwgU2VydmljZSBVbmluc3RhbGwubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIi11bmluc3RhbGwiICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgMA0KKyAgU2hlbGxMaW5rOjpTZXRSdW5Bc0FkbWluaXN0cmF0b3IgXA0KKyAgICAiJFNNUFJPR1JBTVNcc3R1bm5lbFxzdHVubmVsIFNlcnZpY2UgVW5pbnN0YWxsLmxuayINCisgIFBvcCAkMCAjIHJldHVybnMgZXJyb3IoLTEpL3N1Y2Nlc3MoMCkNCisgIERldGFpbFByaW50ICJTaGVsbExpbms6OlNldFJ1bkFzQWRtaW5pc3RyYXRvcjogJDAiDQorDQorICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcc3R1bm5lbFxzdHVubmVsIFNlcnZpY2UgU3RhcnQubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIi1zdGFydCIgIiRJTlNURElSXHN0dW5uZWwuZXhlIiAwDQorICBTaGVsbExpbms6OlNldFJ1bkFzQWRtaW5pc3RyYXRvciBcDQorICAgICIkU01QUk9HUkFNU1xzdHVubmVsXHN0dW5uZWwgU2VydmljZSBTdGFydC5sbmsiDQorICBQb3AgJDAgIyByZXR1cm5zIGVycm9yKC0xKS9zdWNjZXNzKDApDQorICBEZXRhaWxQcmludCAiU2hlbGxMaW5rOjpTZXRSdW5Bc0FkbWluaXN0cmF0b3I6ICQwIg0KKw0KKyAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBTZXJ2aWNlIFN0b3AubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIi1zdG9wIiAiJElOU1RESVJcc3R1bm5lbC5leGUiIDANCisgIFNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yIFwNCisgICAgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBTZXJ2aWNlIFN0b3AubG5rIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigtMSkvc3VjY2VzcygwKQ0KKyAgRGV0YWlsUHJpbnQgIlNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yOiAkMCINCisNCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXHN0dW5uZWwgU2VydmljZSBDb25maWd1cmF0aW9uIEZpbGUgUmVsb2FkLmxuayIgXA0KKyAgICAiJElOU1RESVJcc3R1bm5lbC5leGUiICItcmVsb2FkIiAiJElOU1RESVJcc3R1bm5lbC5leGUiIDANCisgIFNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yIFwNCisgICAgIiRTTVBST0dSQU1TXHN0dW5uZWxcc3R1bm5lbCBTZXJ2aWNlIENvbmZpZ3VyYXRpb24gRmlsZSBSZWxvYWQubG5rIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigtMSkvc3VjY2VzcygwKQ0KKyAgRGV0YWlsUHJpbnQgIlNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yOiAkMCINCisNCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXHN0dW5uZWwgU2VydmljZSBMb2cgRmlsZSBSZW9wZW4ubG5rIiBcDQorICAgICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgIi1yZW9wZW4iICIkSU5TVERJUlxzdHVubmVsLmV4ZSIgMA0KKyAgU2hlbGxMaW5rOjpTZXRSdW5Bc0FkbWluaXN0cmF0b3IgXA0KKyAgICAiJFNNUFJPR1JBTVNcc3R1bm5lbFxzdHVubmVsIFNlcnZpY2UgTG9nIEZpbGUgUmVvcGVuLmxuayINCisgIFBvcCAkMCAjIHJldHVybnMgZXJyb3IoLTEpL3N1Y2Nlc3MoMCkNCisgIERldGFpbFByaW50ICJTaGVsbExpbms6OlNldFJ1bkFzQWRtaW5pc3RyYXRvcjogJDAiDQorc2tpcF9zZXJ2aWNlX2xpbmtzOg0KKw0KKyAgIyBlZGl0IGNvbmZpZyBmaWxlDQorICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcc3R1bm5lbFxFZGl0IHN0dW5uZWwuY29uZi5sbmsiIFwNCisgICAgIm5vdGVwYWQuZXhlIiAiJElOU1RESVJcc3R1bm5lbC5jb25mIiAibm90ZXBhZC5leGUiIDANCisgIFNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yIFwNCisgICAgIiRTTVBST0dSQU1TXHN0dW5uZWxcRWRpdCBzdHVubmVsLmNvbmYubG5rIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigtMSkvc3VjY2VzcygwKQ0KKyAgRGV0YWlsUHJpbnQgIlNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yOiAkMCINCisNCisgIFNlY3Rpb25HZXRGbGFncyAke3NlY3Rpb25DQX0gJDANCisgIEludE9wICQwICQwICYgJHtTRl9TRUxFQ1RFRH0NCisgIEludENtcCAkMCAwIGxibF9ub0NBDQorDQorICAjIE9wZW5TU0wgc2hlbGwNCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXE9wZW5TU0wgU2hlbGwubG5rIiBcDQorICAgICIkSU5TVERJUlxvcGVuc3NsLmV4ZSIgIiIgIiRJTlNURElSXG9wZW5zc2wuZXhlIiAwDQorDQorICAjIG1ha2Ugc3R1bm5lbC5wZW0NCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXEJ1aWxkIFNlbGYtc2lnbmVkIHN0dW5uZWwucGVtLmxuayIgXA0KKyAgICAiJElOU1RESVJcb3BlbnNzbC5leGUiIFwNCisgICAgInJlcSAtbmV3IC14NTA5IC1kYXlzIDM2NSAtY29uZmlnIHN0dW5uZWwuY25mIC1vdXQgc3R1bm5lbC5wZW0gLWtleW91dCBzdHVubmVsLnBlbSINCisgIFNoZWxsTGluazo6U2V0UnVuQXNBZG1pbmlzdHJhdG9yIFwNCisgICAgIiRTTVBST0dSQU1TXHN0dW5uZWxcXEJ1aWxkIFNlbGYtc2lnbmVkIHN0dW5uZWwucGVtLmxuayINCisgIFBvcCAkMCAjIHJldHVybnMgZXJyb3IoLTEpL3N1Y2Nlc3MoMCkNCisgIERldGFpbFByaW50ICJTaGVsbExpbms6OlNldFJ1bkFzQWRtaW5pc3RyYXRvcjogJDAiDQorDQorbGJsX25vQ0E6DQorDQorICAjIGhlbHAvdW5pbnN0YWxsDQorICBXcml0ZUlOSVN0ciAiJFNNUFJPR1JBTVNcc3R1bm5lbFxNYW51YWwudXJsIiAiSW50ZXJuZXRTaG9ydGN1dCIgXA0KKyAgICAiVVJMIiAiZmlsZTovLyRJTlNURElSL3N0dW5uZWwuaHRtbCINCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1xzdHVubmVsXFVuaW5zdGFsbCBzdHVubmVsLmxuayIgXA0KKyAgICAiJElOU1RESVJcdW5pbnN0YWxsLmV4ZSIgIiIgIiRJTlNURElSXHVuaW5zdGFsbC5leGUiIDANCitTZWN0aW9uRW5kDQorDQorU2VjdGlvbiAiRGVza3RvcCBTaG9ydGN1dCINCisgIFNldFNoZWxsVmFyQ29udGV4dCBhbGwNCisgIERlbGV0ZSAiJERFU0tUT1Bcc3R1bm5lbC5sbmsiDQorICBDcmVhdGVTaG9ydEN1dCAiJERFU0tUT1Bcc3R1bm5lbC5sbmsiIFwNCisgICAgIiRJTlNURElSXHN0dW5uZWwuZXhlIiAiIiAiJElOU1RESVJcc3R1bm5lbC5leGUiIDANCitTZWN0aW9uRW5kDQorDQorU2VjdGlvbiAvbyAiRGVidWdnaW5nIFN5bWJvbHMiDQorICBTZXRPdXRQYXRoICIkSU5TVERJUiINCisgICFjZCAiLi4iDQorICAhY2QgImJpbiINCisgICFjZCAid2luMzIiDQorICBGaWxlICJzdHVubmVsLnBkYiINCisgIEZpbGUgInRzdHVubmVsLnBkYiINCisgICFjZCAiLi4iDQorICAhY2QgIi4uIg0KKyAgIWNkICIuLiINCisgICFjZCAiJHtaTElCRElSfSINCisgIEZpbGUgInpsaWIxLnBkYiINCisgICFjZCAiLi4iDQorICAhY2QgIiR7T1BFTlNTTERJUn0iDQorICAhY2QgIm91dDMyZGxsIg0KKyAgRmlsZSAibGliZWF5MzIucGRiIg0KKyAgRmlsZSAic3NsZWF5MzIucGRiIg0KKyAgRmlsZSAib3BlbnNzbC5wZGIiDQorICBGaWxlICI0NzU4Y2NhLnBkYiINCisgIEZpbGUgImFlcC5wZGIiDQorICBGaWxlICJhdGFsbGEucGRiIg0KKyAgRmlsZSAiY2FwaS5wZGIiDQorICBGaWxlICJjaGlsLnBkYiINCisgIEZpbGUgImNzd2lmdC5wZGIiDQorICBGaWxlICJnbXAucGRiIg0KKyAgRmlsZSAiZ29zdC5wZGIiDQorICBGaWxlICJudXJvbi5wZGIiDQorICBGaWxlICJwYWRsb2NrLnBkYiINCisgIEZpbGUgInN1cmV3YXJlLnBkYiINCisgIEZpbGUgInVic2VjLnBkYiINCisgICFjZCAiLi4iDQorICAhY2QgIi4uIg0KKyAgIWNkICJzdHVubmVsIg0KKyAgIWNkICJ0b29scyINCitTZWN0aW9uRW5kDQorDQorU2VjdGlvbiAiVW5pbnN0YWxsIg0KKyAgQ2xlYXJFcnJvcnMNCisNCisgICMgc3RvcCBhbmQgcmVtb3ZlIHRoZSBzZXJ2aWNlLCBleGl0IHN0dW5uZWwNCisgIFJlYWRSZWdTdHIgJFIwIEhLTE0gXA0KKyAgICAiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb24iIEN1cnJlbnRWZXJzaW9uDQorICBJZkVycm9ycyBza2lwX3NlcnZpY2VfdW5pbnN0YWxsDQorICBFeGVjV2FpdCAnIiRJTlNURElSXHN0dW5uZWwuZXhlIiAtc3RvcCAtcXVpZXQnDQorICBFeGVjV2FpdCAnIiRJTlNURElSXHN0dW5uZWwuZXhlIiAtdW5pbnN0YWxsIC1xdWlldCcNCitza2lwX3NlcnZpY2VfdW5pbnN0YWxsOg0KKyAgRXhlY1dhaXQgJyIkSU5TVERJUlxzdHVubmVsLmV4ZSIgLWV4aXQgLXF1aWV0Jw0KKw0KKyAgIyByZW1vdmUgc3R1bm5lbCBmb2xkZXINCisgIERlbGV0ZSAiJElOU1RESVJcc3R1bm5lbC5jb25mIg0KKyAgRGVsZXRlICIkSU5TVERJUlxjYS1jZXJ0cy5wZW0iDQorICBEZWxldGUgIiRJTlNURElSXHN0dW5uZWwucGVtIg0KKyAgRGVsZXRlICIkSU5TVERJUlxzdHVubmVsLmV4ZSINCisgIERlbGV0ZSAiJElOU1RESVJcc3R1bm5lbC5leGUubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXHN0dW5uZWwucGRiIg0KKyAgRGVsZXRlICIkSU5TVERJUlx0c3R1bm5lbC5leGUiDQorICBEZWxldGUgIiRJTlNURElSXHRzdHVubmVsLmV4ZS5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcc3R1bm5lbC5jbmYiDQorICBEZWxldGUgIiRJTlNURElSXG9wZW5zc2wuZXhlIg0KKyAgRGVsZXRlICIkSU5TVERJUlxvcGVuc3NsLmV4ZS5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcb3BlbnNzbC5wZGIiDQorICBEZWxldGUgIiRJTlNURElSXE1pY3Jvc29mdC5WQzkwLkNSVC5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcbGliZWF5MzIuZGxsIg0KKyAgRGVsZXRlICIkSU5TVERJUlxsaWJlYXkzMi5kbGwubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXGxpYmVheTMyLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcc3NsZWF5MzIuZGxsIg0KKyAgRGVsZXRlICIkSU5TVERJUlxzc2xlYXkzMi5kbGwubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXHNzbGVheTMyLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcNDc1OGNjYS5kbGwiDQorICBEZWxldGUgIiRJTlNURElSXDQ3NThjY2EuZGxsLm1hbmlmZXN0Ig0KKyAgRGVsZXRlICIkSU5TVERJUlw0NzU4Y2NhLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcYWVwLmRsbCINCisgIERlbGV0ZSAiJElOU1RESVJcYWVwLmRsbC5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcYWVwLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcYXRhbGxhLmRsbCINCisgIERlbGV0ZSAiJElOU1RESVJcYXRhbGxhLmRsbC5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcYXRhbGxhLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcY2FwaS5kbGwiDQorICBEZWxldGUgIiRJTlNURElSXGNhcGkuZGxsLm1hbmlmZXN0Ig0KKyAgRGVsZXRlICIkSU5TVERJUlxjYXBpLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcY2hpbC5kbGwiDQorICBEZWxldGUgIiRJTlNURElSXGNoaWwuZGxsLm1hbmlmZXN0Ig0KKyAgRGVsZXRlICIkSU5TVERJUlxjaGlsLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcY3N3aWZ0LmRsbCINCisgIERlbGV0ZSAiJElOU1RESVJcY3N3aWZ0LmRsbC5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcY3N3aWZ0LnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcZ21wLmRsbCINCisgIERlbGV0ZSAiJElOU1RESVJcZ21wLmRsbC5tYW5pZmVzdCINCisgIERlbGV0ZSAiJElOU1RESVJcZ21wLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcZ29zdC5kbGwiDQorICBEZWxldGUgIiRJTlNURElSXGdvc3QuZGxsLm1hbmlmZXN0Ig0KKyAgRGVsZXRlICIkSU5TVERJUlxnb3N0LnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcbnVyb24uZGxsIg0KKyAgRGVsZXRlICIkSU5TVERJUlxudXJvbi5kbGwubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXG51cm9uLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJccGFkbG9jay5kbGwiDQorICBEZWxldGUgIiRJTlNURElSXHBhZGxvY2suZGxsLm1hbmlmZXN0Ig0KKyAgRGVsZXRlICIkSU5TVERJUlxwYWRsb2NrLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcc3VyZXdhcmUuZGxsIg0KKyAgRGVsZXRlICIkSU5TVERJUlxzdXJld2FyZS5kbGwubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXHN1cmV3YXJlLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcdWJzZWMuZGxsIg0KKyAgRGVsZXRlICIkSU5TVERJUlx1YnNlYy5kbGwubWFuaWZlc3QiDQorICBEZWxldGUgIiRJTlNURElSXHVic2VjLnBkYiINCisgIERlbGV0ZSAiJElOU1RESVJcc3R1bm5lbC5odG1sIg0KKyAgRGVsZXRlICIkSU5TVERJUlx1bmluc3RhbGwuZXhlIg0KKyAgUk1EaXIgIiRJTlNURElSIg0KKw0KKyAgIyByZW1vdmUgbWVudSBzaG9ydGN1dHMNCisgIFNldFNoZWxsVmFyQ29udGV4dCBhbGwNCisgIERlbGV0ZSAiJERFU0tUT1Bcc3R1bm5lbC5sbmsiDQorICBEZWxldGUgIiRTTVBST0dSQU1TXHN0dW5uZWxcKi5sbmsiDQorICBEZWxldGUgIiRTTVBST0dSQU1TXHN0dW5uZWxcKi51cmwiDQorICBSTURpciAiJFNNUFJPR1JBTVNcc3R1bm5lbCINCisNCisgICMgcmVtb3ZlIGZpcmV3YWxsIHJ1bGVzDQorICBTaW1wbGVGQzo6UmVtb3ZlQXBwbGljYXRpb24gIiRJTlNURElSXHN0dW5uZWwuZXhlIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigxKS9zdWNjZXNzKDApDQorICBEZXRhaWxQcmludCAiU2ltcGxlRkM6OlJlbW92ZUFwcGxpY2F0aW9uOiAkMCINCisgIFNpbXBsZUZDOjpSZW1vdmVBcHBsaWNhdGlvbiAiJElOU1RESVJcdHN0dW5uZWwuZXhlIg0KKyAgUG9wICQwICMgcmV0dXJucyBlcnJvcigxKS9zdWNjZXNzKDApDQorICBEZXRhaWxQcmludCAiU2ltcGxlRkM6OlJlbW92ZUFwcGxpY2F0aW9uOiAkMCINCisNCisgICMgcmVtb3ZlIHVuaW5zdGFsbGVyIHJlZ2lzdHJ5IGVudGlyZXMNCisgIERlbGV0ZVJlZ0tleSBIS0xNIFwNCisgICAgIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFxzdHVubmVsIg0KKyAgRGVsZXRlUmVnS2V5IEhLTE0gIlNvZnR3YXJlXE5TSVNfc3R1bm5lbCINCitTZWN0aW9uRW5kDQorDQorIyBlbmQgb2Ygc3R1bm5lbC5uc2kNCmRpZmYgLS1naXQgYS90b29scy9zdHVubmVsLnNlcnZpY2UuaW4gYi90b29scy9zdHVubmVsLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0dW5uZWwuc2VydmljZS5pbgpAQCAtMCwwICsxLDEwIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPVNTTCB0dW5uZWwgZm9yIG5ldHdvcmsgZGFlbW9ucworQWZ0ZXI9c3lzbG9nLnRhcmdldAorCitbU2VydmljZV0KK0V4ZWNTdGFydD1AYmluZGlyQC9zdHVubmVsCitUeXBlPWZvcmtpbmcKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApkaWZmIC0tZ2l0IGEvdG9vbHMvc3R1bm5lbC5zcGVjIGIvdG9vbHMvc3R1bm5lbC5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NWFhNzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zdHVubmVsLnNwZWMKQEAgLTAsMCArMSw5NyBAQAorJWRlZmluZSBfcHJlZml4IC91c3IKKyVkZWZpbmUgX3N5c2NvbmZkaXIgL2V0YworCitTdW1tYXJ5OiBQcm9ncmFtIHRoYXQgd3JhcHMgbm9ybWFsIHNvY2tldCBjb25uZWN0aW9ucyB3aXRoIFNTTC9UTFMKK05hbWU6IHN0dW5uZWwKK1ZlcnNpb246IDUuMjIKK1JlbGVhc2U6IDEKK0xpY2Vuc2U6IEdQTCB3aXRoIGFuIE9wZW5TU0wgZXhjZXB0aW9uCitHcm91cDogQXBwbGljYXRpb25zL05ldHdvcmtpbmcKK1NvdXJjZTogc3R1bm5lbC0le3ZlcnNpb259LnRhci5negorUGFja2FnZXI6IEJpbGwgUXVheWxlIDxCaWxsLlF1YXlsZUBjaXRhZGVsLmNvbT4KK1JlcXVpcmVzOiBvcGVuc3NsID49IDAuOS43CitCdWlsZFJlcXVpcmVzOiBvcGVuc3NsLWRldmVsID49IDAuOS43CitCdWlsZHJvb3Q6IC92YXIvdG1wL3N0dW5uZWwtJXt2ZXJzaW9ufS1yb290CisKKyVkZXNjcmlwdGlvbgorVGhlIHN0dW5uZWwgcHJvZ3JhbSBpcyBkZXNpZ25lZCB0byB3b3JrIGFzIFNTTCBlbmNyeXB0aW9uIHdyYXBwZXIKK2JldHdlZW4gcmVtb3RlIGNsaWVudHMgYW5kIGxvY2FsIChpbmV0ZC1zdGFydGFibGUpIG9yIHJlbW90ZQorc2VydmVycy4gVGhlIGNvbmNlcHQgaXMgdGhhdCBoYXZpbmcgbm9uLVNTTCBhd2FyZSBkYWVtb25zIHJ1bm5pbmcgb24KK3lvdXIgc3lzdGVtIHlvdSBjYW4gZWFzaWx5IHNldCB0aGVtIHVwIHRvIGNvbW11bmljYXRlIHdpdGggY2xpZW50cyBvdmVyCitzZWN1cmUgU1NMIGNoYW5uZWxzLgorc3R1bm5lbCBjYW4gYmUgdXNlZCB0byBhZGQgU1NMIGZ1bmN0aW9uYWxpdHkgdG8gY29tbW9ubHkgdXNlZCBpbmV0ZAorZGFlbW9ucyBsaWtlIFBPUC0yLCBQT1AtMywgYW5kIElNQVAgc2VydmVycywgdG8gc3RhbmRhbG9uZSBkYWVtb25zIGxpa2UKK05OVFAsIFNNVFAgYW5kIEhUVFAsIGFuZCBpbiB0dW5uZWxpbmcgUFBQIG92ZXIgbmV0d29yayBzb2NrZXRzIHdpdGhvdXQKK2NoYW5nZXMgdG8gdGhlIHNvdXJjZSBjb2RlLgorCislcHJlcAorJXNldHVwIC1uIHN0dW5uZWwtJXt2ZXJzaW9ufQorCisKKyVidWlsZAoraWYgWyAhIC14IC4vY29uZmlndXJlIF07IHRoZW4KKyAgICBhdXRvY29uZgorICAgIGF1dG9oZWFkZXIKK2ZpCisKK0NGTEFHUz0iJXtvcHRmbGFnc30iIC4vY29uZmlndXJlIC0tcHJlZml4PSV7X3ByZWZpeH0gLS1zeXNjb25mZGlyPSV7X3N5c2NvbmZkaXJ9CisKKyV7X19tYWtlfQorCislaW5zdGFsbAorJXtfX3JtfSAtcmYgJXtidWlsZHJvb3R9Cisle19fbWtkaXJ9IC1wICV7YnVpbGRyb290fSV7X3N5c2NvbmZkaXJ9L3N0dW5uZWwKKyV7X19ta2Rpcn0gLXAgJXtidWlsZHJvb3R9JXtfc2JpbmRpcn0KKyV7X19ta2Rpcn0gLXAgJXtidWlsZHJvb3R9JXtfbGliZGlyfQorJXtfX21rZGlyfSAtcCAle2J1aWxkcm9vdH0le19tYW5kaXJ9L21hbjgKKyV7X19ta2Rpcn0gLXAgJXtidWlsZHJvb3R9JXtfaW5pdHJkZGlyfQorCisle19faW5zdGFsbH0gLW03NTUgLXMgc3JjL3N0dW5uZWwgJXtidWlsZHJvb3R9JXtfc2JpbmRpcn0KKyV7X19pbnN0YWxsfSAtbTc1NSBzcmMvLmxpYnMvbGlic3R1bm5lbC5zbyAle2J1aWxkcm9vdH0le19saWJkaXJ9Cisle19faW5zdGFsbH0gLW03NTUgc3JjLy5saWJzL2xpYnN0dW5uZWwubGEgJXtidWlsZHJvb3R9JXtfbGliZGlyfQorJXtfX2luc3RhbGx9IC1tNjQ0IGRvYy9zdHVubmVsLjggJXtidWlsZHJvb3R9JXtfbWFuZGlyfS9tYW44L3N0dW5uZWwuOAorJXtfX2luc3RhbGx9IC1tNjQ0IHRvb2xzL3N0dW5uZWwuY29uZi1zYW1wbGUgJXtidWlsZHJvb3R9JXtfc3lzY29uZmRpcn0vc3R1bm5lbAorJXtfX2luc3RhbGx9IC1tNTAwIHRvb2xzL3N0dW5uZWwuaW5pdCAle2J1aWxkcm9vdH0le19pbml0cmRkaXJ9L3N0dW5uZWwKKworJWNsZWFuCisle19fcm19IC1yZiAle2J1aWxkcm9vdH0KKworJXBvc3QKK2xkY29uZmlnCisKKyVwb3N0dW4KK2xkY29uZmlnCisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIENPUFlJTkcgQ09QWVJJR0hULkdQTCBSRUFETUUgQ2hhbmdlTG9nIGRvYy9zdHVubmVsLmh0bWwKKyVkb2MgdG9vbHMvY2EuaHRtbCB0b29scy9jYS5wbCB0b29scy9pbXBvcnRDQS5odG1sIHRvb2xzL2ltcG9ydENBLnNoIHRvb2xzL3N0dW5uZWwuY25mCislZGlyICV7X3N5c2NvbmZkaXJ9L3N0dW5uZWwKKyVjb25maWcgJXtfc3lzY29uZmRpcn0vc3R1bm5lbC8qCisle19zYmluZGlyfS9zdHVubmVsCisle19saWJkaXJ9L2xpYnN0dW5uZWwuc28KKyV7X2xpYmRpcn0vbGlic3R1bm5lbC5sYQorJXtfbWFuZGlyfS9tYW44L3N0dW5uZWwuOC5negorJXtfaW5pdHJkZGlyfS9zdHVubmVsCisKKyVjaGFuZ2Vsb2cKKyogVHVlIE1heSAyNiAyMDE1IEJpbGwgUXVheWxlIDxCaWxsLlF1YXlsZUBjaXRhZGVsLmNvbT4KKy0gdXBkYXRlZCBsaWNlbnNlIHNwZWNpZmljYXRpb24KKy0gdGhlIG1hbnVhbCBwYWdlIGlzIG5vIGxvbmdlciBtYXJrZWQgYXMgY29tcHJlc3NlZAorLSByZW1vdmVkIG91dGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKy0gdXBkYXRlZCBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gb2YgT3BlblNTTAorCisqIEZyaSBTZXAgMDkgMjAwNSBuZWVvIDxuZWVvQGlyYy5wbD4KKy0gbG90cyBvZiBjaGFuZ2VzIGFuZCBjbGVhbnVwcworCisqIFdlZCBNYXIgMTcgMjAwNCBuZWVvIDxuZWVvQGlyYy5wbD4KKy0gdXBkYXRlZCBmb3IgNC4wNQorCisqIFN1biBKdW4gMjQgMjAwMCBCcmlhbiBIYXRjaCA8YnJpQHN0dW5uZWwub3JnPgorLSB1cGRhdGVkIGZvciAzLjhwMworCisqIFdlZCBKdWwgMTQgMTk5OSBEaXJrIE8uIFNpZWJuaWNoIDxkb2tAdm9zc25ldC5kZT4KKy0gdXBkYXRlZCBmb3IgMy41LgorCisqIE1vbiBKdW4gMDcgMTk5OSBEaXJrIE8uIFNpZWJuaWNoIDxkb2tAdm9zc25ldC5kZT4KKy0gYWRhcHRlZCBmcm9tIHNzbHdyYXAgUlBNIHNwZWMgZmlsZQo=